/ Hex Artifact Content
Login

Artifact e6b3d8df512bf6a753dab1b0490dd78e13adb033:


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 76 61 72 61 72 67 73 2e 68  clude <varargs.h
0150: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0160: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
0170: 63 74 79 70 65 2e 68 3e 0a 0a 65 78 74 65 72 6e  ctype.h>..extern
0180: 20 76 6f 69 64 20 71 73 6f 72 74 28 29 3b 0a 65   void qsort();.e
0190: 78 74 65 72 6e 20 64 6f 75 62 6c 65 20 73 74 72  xtern double str
01a0: 74 6f 64 28 29 3b 0a 65 78 74 65 72 6e 20 6c 6f  tod();.extern lo
01b0: 6e 67 20 73 74 72 74 6f 6c 28 29 3b 0a 65 78 74  ng strtol();.ext
01c0: 65 72 6e 20 76 6f 69 64 20 66 72 65 65 28 29 3b  ern void free();
01d0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63 65  .extern int acce
01e0: 73 73 28 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ss();.extern int
01f0: 20 61 74 6f 69 28 29 3b 0a 0a 23 69 66 6e 64 65   atoi();..#ifnde
0200: 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23 20 20 20  f __WIN32__.#   
0210: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
0220: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
0230: 4e 33 32 29 0a 23 09 64 65 66 69 6e 65 20 5f 5f  N32).#.define __
0240: 57 49 4e 33 32 5f 5f 0a 23 20 20 20 65 6e 64 69  WIN32__.#   endi
0250: 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65  f.#endif../* #de
0260: 66 69 6e 65 20 50 52 49 56 41 54 45 20 73 74 61  fine PRIVATE sta
0270: 74 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  tic */.#define P
0280: 52 49 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54  RIVATE..#ifdef T
0290: 45 53 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52  EST.#define MAXR
02a0: 48 53 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65  HS 5       /* Se
02b0: 74 20 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73  t low to exercis
02c0: 65 20 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65  e exception code
02d0: 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e   */.#else.#defin
02e0: 65 20 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65  e MAXRHS 1000.#e
02f0: 6e 64 69 66 0a 0a 63 68 61 72 20 2a 6d 73 6f 72  ndif..char *msor
0300: 74 28 29 3b 0a 65 78 74 65 72 6e 20 76 6f 69 64  t();.extern void
0310: 20 2a 6d 61 6c 6c 6f 63 28 29 3b 0a 0a 2f 2a 2a   *malloc();../**
0320: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
0330: 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e 68 22 20  file "action.h" 
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0360: 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 61 63  *****/.struct ac
0370: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77  tion *Action_new
0380: 28 29 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f  ();.struct actio
0390: 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 29  n *Action_sort()
03a0: 3b 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64  ;.void Action_ad
03b0: 64 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  d();../*********
03c0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
03d0: 61 73 73 65 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  assert.h" ******
03e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0400: 76 6f 69 64 20 6d 79 61 73 73 65 72 74 28 29 3b  void myassert();
0410: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
0420: 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
0430: 28 58 29 20 69 66 28 21 28 58 29 29 6d 79 61 73  (X) if(!(X))myas
0440: 73 65 72 74 28 5f 5f 46 49 4c 45 5f 5f 2c 5f 5f  sert(__FILE__,__
0450: 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20  LINE__).#else.# 
0460: 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 28 58   define assert(X
0470: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a 2a 2a 2a  ).#endif../*****
0480: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
0490: 69 6c 65 20 22 62 75 69 6c 64 2e 68 22 20 2a 2a  ile "build.h" **
04a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04c0: 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c  **/.void FindRul
04d0: 65 50 72 65 63 65 64 65 6e 63 65 73 28 29 3b 0a  ePrecedences();.
04e0: 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53 65  void FindFirstSe
04f0: 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53  ts();.void FindS
0500: 74 61 74 65 73 28 29 3b 0a 76 6f 69 64 20 46 69  tates();.void Fi
0510: 6e 64 4c 69 6e 6b 73 28 29 3b 0a 76 6f 69 64 20  ndLinks();.void 
0520: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 29  FindFollowSets()
0530: 3b 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69 6f  ;.void FindActio
0540: 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ns();../********
0550: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0560: 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22 20 2a  "configlist.h" *
0570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0590: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
05a0: 74 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a  t_init(/* void *
05b0: 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  /);.struct confi
05c0: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  g *Configlist_ad
05d0: 64 28 2f 2a 20 73 74 72 75 63 74 20 72 75 6c 65  d(/* struct rule
05e0: 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a 73 74 72   *, int */);.str
05f0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
0600: 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28  iglist_addbasis(
0610: 2f 2a 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  /* struct rule *
0620: 2c 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64 20  , int */);.void 
0630: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
0640: 72 65 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  re(/* void */);.
0650: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
0660: 73 6f 72 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  sort(/* void */)
0670: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
0680: 74 5f 73 6f 72 74 62 61 73 69 73 28 2f 2a 20 76  t_sortbasis(/* v
0690: 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  oid */);.struct 
06a0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
06b0: 73 74 5f 72 65 74 75 72 6e 28 2f 2a 20 76 6f 69  st_return(/* voi
06c0: 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f  d */);.struct co
06d0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
06e0: 5f 62 61 73 69 73 28 2f 2a 20 76 6f 69 64 20 2a  _basis(/* void *
06f0: 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  /);.void Configl
0700: 69 73 74 5f 65 61 74 28 2f 2a 20 73 74 72 75 63  ist_eat(/* struc
0710: 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a  t config * */);.
0720: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
0730: 72 65 73 65 74 28 2f 2a 20 76 6f 69 64 20 2a 2f  reset(/* void */
0740: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
0750: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72  rom the file "er
0760: 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ror.h" *********
0770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0790: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 20 2f  void ErrorMsg( /
07a0: 2a 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 63  * char *, int, c
07b0: 68 61 72 20 2a 2c 20 2e 2e 2e 20 2a 2f 20 29 3b  har *, ... */ );
07c0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ../****** From t
07d0: 68 65 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e  he file "option.
07e0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
07f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73  *************/.s
0810: 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20  truct s_options 
0820: 7b 0a 20 20 65 6e 75 6d 20 7b 20 4f 50 54 5f 46  {.  enum { OPT_F
0830: 4c 41 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54 2c  LAG=1,  OPT_INT,
0840: 20 20 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54 5f    OPT_DBL,  OPT_
0850: 53 54 52 2c 0a 20 20 20 20 20 20 20 20 20 4f 50  STR,.         OP
0860: 54 5f 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49 4e  T_FFLAG, OPT_FIN
0870: 54 2c 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50 54  T, OPT_FDBL, OPT
0880: 5f 46 53 54 52 7d 20 74 79 70 65 3b 0a 20 20 63  _FSTR} type;.  c
0890: 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 20 20 63 68  har *label;.  ch
08a0: 61 72 20 2a 61 72 67 3b 0a 20 20 63 68 61 72 20  ar *arg;.  char 
08b0: 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74  *message;.};.int
08c0: 20 20 20 20 4f 70 74 49 6e 69 74 28 2f 2a 20 63      OptInit(/* c
08d0: 68 61 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f 6f  har**,struct s_o
08e0: 70 74 69 6f 6e 73 2a 2c 46 49 4c 45 2a 20 2a 2f  ptions*,FILE* */
08f0: 29 3b 0a 69 6e 74 20 20 20 20 4f 70 74 4e 41 72  );.int    OptNAr
0900: 67 73 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  gs(/* void */);.
0910: 63 68 61 72 20 20 2a 4f 70 74 41 72 67 28 2f 2a  char  *OptArg(/*
0920: 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64 20 20   int */);.void  
0930: 20 4f 70 74 45 72 72 28 2f 2a 20 69 6e 74 20 2a   OptErr(/* int *
0940: 2f 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 50 72  /);.void   OptPr
0950: 69 6e 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b  int(/* void */);
0960: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  ../******** From
0970: 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65   the file "parse
0980: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76  *************/.v
09b0: 6f 69 64 20 50 61 72 73 65 28 2f 2a 20 73 74 72  oid Parse(/* str
09c0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 20  uct lemon *lemp 
09d0: 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  */);../*********
09e0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
09f0: 70 6c 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  plink.h" *******
0a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a20: 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  /.struct plink *
0a30: 50 6c 69 6e 6b 5f 6e 65 77 28 2f 2a 20 76 6f 69  Plink_new(/* voi
0a40: 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e  d */);.void Plin
0a50: 6b 5f 61 64 64 28 2f 2a 20 73 74 72 75 63 74 20  k_add(/* struct 
0a60: 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74  plink **, struct
0a70: 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76   config * */);.v
0a80: 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 2f  oid Plink_copy(/
0a90: 2a 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  * struct plink *
0aa0: 2a 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  *, struct plink 
0ab0: 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e  * */);.void Plin
0ac0: 6b 5f 64 65 6c 65 74 65 28 2f 2a 20 73 74 72 75  k_delete(/* stru
0ad0: 63 74 20 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a  ct plink * */);.
0ae0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ./********** Fro
0af0: 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70 6f  m the file "repo
0b00: 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rt.h" **********
0b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69  ***********/.voi
0b30: 64 20 52 65 70 72 69 6e 74 28 2f 2a 20 73 74 72  d Reprint(/* str
0b40: 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b  uct lemon * */);
0b50: 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70  .void ReportOutp
0b60: 75 74 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d  ut(/* struct lem
0b70: 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52  on * */);.void R
0b80: 65 70 6f 72 74 54 61 62 6c 65 28 2f 2a 20 73 74  eportTable(/* st
0b90: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29  ruct lemon * */)
0ba0: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61  ;.void ReportHea
0bb0: 64 65 72 28 2f 2a 20 73 74 72 75 63 74 20 6c 65  der(/* struct le
0bc0: 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20  mon * */);.void 
0bd0: 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 2f  CompressTables(/
0be0: 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  * struct lemon *
0bf0: 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   */);../********
0c00: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0c10: 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a   "set.h" *******
0c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c40: 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a 65  */.void  SetSize
0c50: 28 2f 2a 20 69 6e 74 20 4e 20 2a 2f 29 3b 20 20  (/* int N */);  
0c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
0c70: 6c 20 73 65 74 73 20 77 69 6c 6c 20 62 65 20 6f  l sets will be o
0c80: 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63 68 61 72  f size N */.char
0c90: 20 2a 53 65 74 4e 65 77 28 2f 2a 20 76 6f 69 64   *SetNew(/* void
0ca0: 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20 20   */);           
0cb0: 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65 74      /* A new set
0cc0: 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e   for element 0..
0cd0: 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46 72  N */.void  SetFr
0ce0: 65 65 28 2f 2a 20 63 68 61 72 2a 20 2a 2f 29 3b  ee(/* char* */);
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0d00: 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74  Deallocate a set
0d10: 20 2a 2f 0a 0a 69 6e 74 20 53 65 74 41 64 64 28   */..int SetAdd(
0d20: 2f 2a 20 63 68 61 72 2a 2c 69 6e 74 20 2a 2f 29  /* char*,int */)
0d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0d40: 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20 61  Add element to a
0d50: 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 55   set */.int SetU
0d60: 6e 69 6f 6e 28 2f 2a 20 63 68 61 72 20 2a 41 2c  nion(/* char *A,
0d70: 63 68 61 72 20 2a 42 20 2a 2f 29 3b 20 20 20 20  char *B */);    
0d80: 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20 74  /* A <- A U B, t
0d90: 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f  hru element N */
0da0: 0a 0a 23 64 65 66 69 6e 65 20 53 65 74 46 69 6e  ..#define SetFin
0db0: 64 28 58 2c 59 29 20 28 58 5b 59 5d 29 20 20 20  d(X,Y) (X[Y])   
0dc0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 59      /* True if Y
0dd0: 20 69 73 20 69 6e 20 73 65 74 20 58 20 2a 2f 0a   is in set X */.
0de0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ./********** Fro
0df0: 6d 20 74 68 65 20 66 69 6c 65 20 22 73 74 72 75  m the file "stru
0e00: 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ct.h" **********
0e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
0e30: 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20 64 61 74  ** Principal dat
0e40: 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  a structures for
0e50: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
0e60: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
0e70: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 46  .typedef enum {F
0e80: 41 4c 53 45 3d 30 2c 20 54 52 55 45 7d 20 42 6f  ALSE=0, TRUE} Bo
0e90: 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62 6f  olean;../* Symbo
0ea0: 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 61 6e  ls (terminals an
0eb0: 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 29 20  d nonterminals) 
0ec0: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 61  of the grammar a
0ed0: 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
0ee0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
0ef0: 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
0f00: 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20  {.  char *name; 
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f20: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d 62  Name of the symb
0f30: 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65  ol */.  int inde
0f40: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
0f50: 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72   /* Index number
0f60: 20 66 6f 72 20 74 68 69 73 20 73 79 6d 62 6f 6c   for this symbol
0f70: 20 2a 2f 0a 20 20 65 6e 75 6d 20 7b 0a 20 20 20   */.  enum {.   
0f80: 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 20 20 4e   TERMINAL,.    N
0f90: 4f 4e 54 45 52 4d 49 4e 41 4c 0a 20 20 7d 20 74  ONTERMINAL.  } t
0fa0: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
0fb0: 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73        /* Symbols
0fc0: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
0fd0: 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73  TERMINALS or NTs
0fe0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
0ff0: 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f  e *rule;       /
1000: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1010: 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20 28   rules of this (
1020: 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 69  if an NT) */.  i
1030: 6e 74 20 70 72 65 63 3b 20 20 20 20 20 20 20 20  nt prec;        
1040: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 65          /* Prece
1050: 64 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65 64  dence if defined
1060: 20 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29 20   (-1 otherwise) 
1070: 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f  */.  enum e_asso
1080: 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20 20  c {.    LEFT,.  
1090: 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f 4e    RIGHT,.    NON
10a0: 45 2c 0a 20 20 20 20 55 4e 4b 0a 20 20 7d 20 61  E,.    UNK.  } a
10b0: 73 73 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20  ssoc;           
10c0: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
10d0: 74 69 76 69 74 79 20 69 66 20 70 72 65 64 65 63  tivity if predec
10e0: 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64 20  ence is defined 
10f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73 74  */.  char *first
1100: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  set;          /*
1110: 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20 61   First-set for a
1120: 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73  ll rules of this
1130: 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f 6f   symbol */.  Boo
1140: 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20 20  lean lambda;    
1150: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1160: 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e 65   NT and can gene
1170: 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73 74  rate an empty st
1180: 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ring */.  char *
1190: 64 65 73 74 72 75 63 74 6f 72 3b 20 20 20 20 20  destructor;     
11a0: 20 20 20 2f 2a 20 43 6f 64 65 20 77 68 69 63 68     /* Code which
11b0: 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65 76   executes whenev
11c0: 65 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 69  er this symbol i
11d0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
11f0: 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
1200: 73 74 61 63 6b 20 64 75 72 69 6e 67 20 65 72 72  stack during err
1210: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  or processing */
1220: 0a 20 20 69 6e 74 20 64 65 73 74 72 75 63 74 6f  .  int destructo
1230: 72 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  rln;        /* L
1240: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 64 65  ine number of de
1250: 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20 2a 2f  structor code */
1260: 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79 70  .  char *datatyp
1270: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
1280: 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66 20  he data type of 
1290: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c 64  information held
12a0: 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20 20   by this.       
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f      ** object. O
12d0: 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70 65  nly used if type
12e0: 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f  ==NONTERMINAL */
12f0: 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20 20  .  int dtnum;   
1300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1310: 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75 6d  he data type num
1320: 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61 72  ber.  In the par
1330: 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a 20  ser, the value. 
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74 61            ** sta
1360: 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20 20  ck is a union.  
1370: 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65 6e  The .yy%d elemen
1380: 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20 20  t of this.      
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69 73       ** union is
13b0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61 74   the correct dat
13c0: 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73 20  a type for this 
13d0: 6f 62 6a 65 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  object */.};../*
13e0: 20 45 61 63 68 20 70 72 6f 64 75 63 74 69 6f 6e   Each production
13f0: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61   rule in the gra
1400: 6d 6d 61 72 20 69 73 20 73 74 6f 72 65 64 20 69  mmar is stored i
1410: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
1420: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a  ** structure.  *
1430: 2f 0a 73 74 72 75 63 74 20 72 75 6c 65 20 7b 0a  /.struct rule {.
1440: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1450: 2a 6c 68 73 3b 20 20 20 20 20 20 2f 2a 20 4c 65  *lhs;      /* Le
1460: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
1470: 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 63 68  the rule */.  ch
1480: 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20  ar *lhsalias;   
1490: 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20         /* Alias 
14a0: 66 6f 72 20 74 68 65 20 4c 48 53 20 28 4e 55 4c  for the LHS (NUL
14b0: 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20  L if none) */.  
14c0: 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20  int ruleline;   
14d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
14e0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
14f0: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72  rule */.  int nr
1500: 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
1510: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1520: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
1530: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1540: 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65  *rhs;     /* The
1550: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a   RHS symbols */.
1560: 20 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69 61    char **rhsalia
1570: 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  s;         /* An
1580: 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20   alias for each 
1590: 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c  RHS symbol (NULL
15a0: 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69   if none) */.  i
15b0: 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20  nt line;        
15c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
15d0: 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20  number at which 
15e0: 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20  code begins */. 
15f0: 20 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20 20   char *code;    
1600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1610: 20 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77   code executed w
1620: 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73  hen this rule is
1630: 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74   reduced */.  st
1640: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72 65  ruct symbol *pre
1650: 63 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65 64  csym;  /* Preced
1660: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72 20  ence symbol for 
1670: 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69  this rule */.  i
1680: 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20  nt index;       
1690: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
16a0: 64 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  dex number for t
16b0: 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 42 6f  his rule */.  Bo
16c0: 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75 63 65 3b  olean canReduce;
16d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
16e0: 66 20 74 68 69 73 20 72 75 6c 65 20 69 73 20 65  f this rule is e
16f0: 76 65 72 20 72 65 64 75 63 65 64 20 2a 2f 0a 20  ver reduced */. 
1700: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65   struct rule *ne
1710: 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65 78  xtlhs;    /* Nex
1720: 74 20 72 75 6c 65 20 77 69 74 68 20 74 68 65 20  t rule with the 
1730: 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73 74  same LHS */.  st
1740: 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 3b  ruct rule *next;
1750: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72         /* Next r
1760: 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61  ule in the globa
1770: 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  l list */.};../*
1780: 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   A configuration
1790: 20 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e   is a production
17a0: 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72 61   rule of the gra
17b0: 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77 69  mmar together wi
17c0: 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64 6f  th.** a mark (do
17d0: 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20 6d  t) showing how m
17e0: 75 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c 65  uch of that rule
17f0: 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73   has been proces
1800: 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20 43  sed so far..** C
1810: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 6c  onfigurations al
1820: 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f 6c  so contain a fol
1830: 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69 73  low-set which is
1840: 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69   a list of termi
1850: 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20 77  nal.** symbols w
1860: 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65 64  hich are allowed
1870: 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   to immediately 
1880: 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20 6f  follow the end o
1890: 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20 45  f the rule..** E
18a0: 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69  very configurati
18b0: 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  on is recorded a
18c0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
18d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20   the following: 
18e0: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
18f0: 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65   {.  struct rule
1900: 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a   *rp;         /*
1910: 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77   The rule upon w
1920: 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75  hich the configu
1930: 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20  ration is based 
1940: 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20  */.  int dot;   
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1960: 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74   The parse point
1970: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b   */.  char *fws;
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1990: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72  * Follow-set for
19a0: 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74   this configurat
19b0: 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ion only */.  st
19c0: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70  ruct plink *fplp
19d0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ;      /* Follow
19e0: 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f  -set forward pro
19f0: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
1a00: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
1a10: 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20   *bplp;      /* 
1a20: 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77  Follow-set backw
1a30: 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e  ards propagation
1a40: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75   links */.  stru
1a50: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
1a60: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1a70: 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63  to state which c
1a80: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a  ontains this */.
1a90: 20 20 65 6e 75 6d 20 7b 0a 20 20 20 20 43 4f 4d    enum {.    COM
1aa0: 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20  PLETE,          
1ab0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 75      /* The statu
1ac0: 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
1ad0: 20 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20 2a   followset and *
1ae0: 2f 0a 20 20 20 20 49 4e 43 4f 4d 50 4c 45 54 45  /.    INCOMPLETE
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b00: 20 20 20 73 68 69 66 74 20 63 6f 6d 70 75 74 61     shift computa
1b10: 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 20 73 74 61  tions */.  } sta
1b20: 74 75 73 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  tus;.  struct co
1b30: 6e 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20 20  nfig *next;     
1b40: 2f 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75 72  /* Next configur
1b50: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61  ation in the sta
1b60: 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  te */.  struct c
1b70: 6f 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20  onfig *bp;      
1b80: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61 73   /* The next bas
1b90: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
1ba0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79   */.};../* Every
1bb0: 20 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65   shift or reduce
1bc0: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74   operation is st
1bd0: 6f 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74  ored as one of t
1be0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
1bf0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a  struct action {.
1c00: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1c10: 2a 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *sp;       /* Th
1c20: 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d  e look-ahead sym
1c30: 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f  bol */.  enum e_
1c40: 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 53 48 49  action {.    SHI
1c50: 46 54 2c 0a 20 20 20 20 41 43 43 45 50 54 2c 0a  FT,.    ACCEPT,.
1c60: 20 20 20 20 52 45 44 55 43 45 2c 0a 20 20 20 20      REDUCE,.    
1c70: 45 52 52 4f 52 2c 0a 20 20 20 20 43 4f 4e 46 4c  ERROR,.    CONFL
1c80: 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  ICT,            
1c90: 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65 64      /* Was a red
1ca0: 75 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f 66  uce, but part of
1cb0: 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20   a conflict */. 
1cc0: 20 20 20 53 48 5f 52 45 53 4f 4c 56 45 44 2c 20     SH_RESOLVED, 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1ce0: 61 73 20 61 20 73 68 69 66 74 2e 20 20 50 72 65  as a shift.  Pre
1cf0: 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64  cedence resolved
1d00: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20   conflict */.   
1d10: 20 52 44 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20   RD_RESOLVED,   
1d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73            /* Was
1d30: 20 72 65 64 75 63 65 2e 20 20 50 72 65 63 65 64   reduce.  Preced
1d40: 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f  ence resolved co
1d50: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 4e 4f  nflict */.    NO
1d60: 54 5f 55 53 45 44 20 20 20 20 20 20 20 20 20 20  T_USED          
1d70: 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65         /* Delete
1d80: 64 20 62 79 20 63 6f 6d 70 72 65 73 73 69 6f 6e  d by compression
1d90: 20 2a 2f 0a 20 20 7d 20 74 79 70 65 3b 0a 20 20   */.  } type;.  
1da0: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72 75  union {.    stru
1db0: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
1dc0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 73 74     /* The new st
1dd0: 61 74 65 2c 20 69 66 20 61 20 73 68 69 66 74 20  ate, if a shift 
1de0: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  */.    struct ru
1df0: 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 2f 2a  le *rp;       /*
1e00: 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20 61 20   The rule, if a 
1e10: 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78 3b  reduce */.  } x;
1e20: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
1e30: 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e   *next;     /* N
1e40: 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 74  ext action for t
1e50: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
1e60: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 63 6f  truct action *co
1e70: 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78 74 20  llide;  /* Next 
1e80: 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  action with the 
1e90: 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d 3b 0a  same hash */.};.
1ea0: 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65 20 6f  ./* Each state o
1eb0: 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
1ec0: 70 61 72 73 65 72 27 73 20 66 69 6e 69 74 65 20  parser's finite 
1ed0: 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 2a 2a  state machine.**
1ee0: 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20 61   is encoded as a
1ef0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1f00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1f10: 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75 63 74  cture. */.struct
1f20: 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72 75 63   state {.  struc
1f30: 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20 20  t config *bp;   
1f40: 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73      /* The basis
1f50: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
1f60: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20 2a  for this state *
1f70: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
1f80: 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a 20  g *cfp;      /* 
1f90: 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  All configuratio
1fa0: 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74 20 2a  ns in this set *
1fb0: 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20  /.  int index;  
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd0: 53 65 71 75 65 6e 63 69 61 6c 20 6e 75 6d 62 65  Sequencial numbe
1fe0: 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
1ff0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
2000: 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20 20 2f  ion *ap;       /
2010: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 6f  * Array of actio
2020: 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  ns for this stat
2030: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 61 63 74 69  e */.  int nacti
2040: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
2050: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74  /* Number of act
2060: 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74  ions for this st
2070: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62  ate */.  int tab
2080: 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  start;          
2090: 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 64 65 78    /* First index
20a0: 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74   of the action t
20b0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 61  able */.  int ta
20c0: 62 64 66 6c 74 61 63 74 3b 20 20 20 20 20 20 20  bdfltact;       
20d0: 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 61 63     /* Default ac
20e0: 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41  tion */.};../* A
20f0: 20 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61   followset propa
2100: 67 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69  gation link indi
2110: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
2120: 6f 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a  ontents of one.*
2130: 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * configuration 
2140: 66 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64  followset should
2150: 20 62 65 20 70 72 6f 70 61 67 61 74 65 64 20 74   be propagated t
2160: 6f 20 61 6e 6f 74 68 65 72 20 77 68 65 6e 65 76  o another whenev
2170: 65 72 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  er.** the first 
2180: 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75  changes. */.stru
2190: 63 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72  ct plink {.  str
21a0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
21b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
21c0: 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 77 68  figuration to wh
21d0: 69 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20  ich linked */.  
21e0: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
21f0: 78 74 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  xt;      /* The 
2200: 6e 65 78 74 20 70 72 6f 70 61 67 61 74 65 20 6c  next propagate l
2210: 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ink */.};../* Th
2220: 65 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 66  e state vector f
2230: 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  or the entire pa
2240: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69  rser generator i
2250: 73 20 72 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a  s recorded as.**
2260: 20 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f   follows.  (LEMO
2270: 4e 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c  N uses no global
2280: 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6d   variables and m
2290: 61 6b 65 73 20 6c 69 74 74 6c 65 20 75 73 65 20  akes little use 
22a0: 6f 66 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72  of.** static var
22b0: 69 61 62 6c 65 73 2e 20 20 46 69 65 6c 64 73 20  iables.  Fields 
22c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
22d0: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
22e0: 65 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20  e thought.** of 
22f0: 61 73 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20  as begin global 
2300: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65  variables in the
2310: 20 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74   program.) */.st
2320: 72 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73  ruct lemon {.  s
2330: 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 73 6f  truct state **so
2340: 72 74 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65  rted;   /* Table
2350: 20 6f 66 20 73 74 61 74 65 73 20 73 6f 72 74 65   of states sorte
2360: 64 20 62 79 20 73 74 61 74 65 20 6e 75 6d 62 65  d by state numbe
2370: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  r */.  struct ru
2380: 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20  le *rule;       
2390: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72  /* List of all r
23a0: 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 73  ules */.  int ns
23b0: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
23c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23d0: 73 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20  states */.  int 
23e0: 6e 72 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20  nrule;          
23f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2400: 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74  f rules */.  int
2410: 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20   nsymbol;       
2420: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2430: 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20  of terminal and 
2440: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  nonterminal symb
2450: 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74 65  ols */.  int nte
2460: 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  rminal;         
2470: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2480: 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20  erminal symbols 
2490: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
24a0: 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a  ol **symbols; /*
24b0: 20 53 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66   Sorted array of
24c0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d   pointers to sym
24d0: 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72  bols */.  int er
24e0: 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20  rorcnt;         
24f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2500: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75  errors */.  stru
2510: 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79  ct symbol *errsy
2520: 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f  m;   /* The erro
2530: 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 63 68  r symbol */.  ch
2540: 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
2550: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2560: 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
2570: 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72  parser */.  char
2580: 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20 20   *arg;          
2590: 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61 74       /* Declarat
25a0: 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20 61  ion of the 3th a
25b0: 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73 65  rgument to parse
25c0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  r */.  char *tok
25d0: 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  entype;         
25e0: 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d 69  /* Type of termi
25f0: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74  nal symbols in t
2600: 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
2610: 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74 79  */.  char *varty
2620: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pe;           /*
2630: 20 54 68 65 20 64 65 66 61 75 6c 74 20 74 79 70   The default typ
2640: 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  e of non-termina
2650: 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63  l symbols */.  c
2660: 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20 20  har *start;     
2670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2680: 6f 66 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  of the start sym
2690: 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61 6d  bol for the gram
26a0: 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73  mar */.  char *s
26b0: 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20 20  tacksize;       
26c0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
26d0: 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a 2f   parser stack */
26e0: 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64 65  .  char *include
26f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
2700: 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20 74 68  ode to put at th
2710: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 43  e start of the C
2720: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 20   file */.  int  
2730: 69 6e 63 6c 75 64 65 6c 6e 3b 20 20 20 20 20 20  includeln;      
2740: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
2750: 65 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  er for start of 
2760: 69 6e 63 6c 75 64 65 20 63 6f 64 65 20 2a 2f 0a  include code */.
2770: 20 20 63 68 61 72 20 2a 65 72 72 6f 72 3b 20 20    char *error;  
2780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2790: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 77 68  de to execute wh
27a0: 65 6e 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73  en an error is s
27b0: 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 20 65 72  een */.  int  er
27c0: 72 6f 72 6c 6e 3b 20 20 20 20 20 20 20 20 20 20  rorln;          
27d0: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
27e0: 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 65 72   for start of er
27f0: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  ror code */.  ch
2800: 61 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20  ar *overflow;   
2810: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
2820: 6f 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73  o execute on a s
2830: 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f  tack overflow */
2840: 0a 20 20 69 6e 74 20 20 6f 76 65 72 66 6c 6f 77  .  int  overflow
2850: 6c 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ln;         /* L
2860: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  ine number for s
2870: 74 61 72 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  tart of overflow
2880: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
2890: 2a 66 61 69 6c 75 72 65 3b 20 20 20 20 20 20 20  *failure;       
28a0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
28b0: 78 65 63 75 74 65 20 6f 6e 20 70 61 72 73 65 72  xecute on parser
28c0: 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 69 6e   failure */.  in
28d0: 74 20 20 66 61 69 6c 75 72 65 6c 6e 3b 20 20 20  t  failureln;   
28e0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
28f0: 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74 20  umber for start 
2900: 6f 66 20 66 61 69 6c 75 72 65 20 63 6f 64 65 20  of failure code 
2910: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65 70  */.  char *accep
2920: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2930: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
2940: 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
2950: 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 69 6e   excepts */.  in
2960: 74 20 20 61 63 63 65 70 74 6c 6e 3b 20 20 20 20  t  acceptln;    
2970: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
2980: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 74  umber for the st
2990: 61 72 74 20 6f 66 20 61 63 63 65 70 74 20 63 6f  art of accept co
29a0: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78  de */.  char *ex
29b0: 74 72 61 63 6f 64 65 3b 20 20 20 20 20 20 20 20  tracode;        
29c0: 20 2f 2a 20 43 6f 64 65 20 61 70 70 65 6e 64 65   /* Code appende
29d0: 64 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74  d to the generat
29e0: 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
29f0: 20 20 65 78 74 72 61 63 6f 64 65 6c 6e 3b 20 20    extracodeln;  
2a00: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
2a10: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 74 61  mber for the sta
2a20: 72 74 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  rt of the extra 
2a30: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
2a40: 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20  tokendest;      
2a50: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2a60: 65 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79  ecute to destroy
2a70: 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20   token data */. 
2a80: 20 69 6e 74 20 20 74 6f 6b 65 6e 64 65 73 74 6c   int  tokendestl
2a90: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e  n;        /* Lin
2aa0: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 6f 6b  e number for tok
2ab0: 65 6e 20 64 65 73 74 72 6f 79 65 72 20 63 6f 64  en destroyer cod
2ac0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72  e */.  char *var
2ad0: 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
2ae0: 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74 68 65 20  /* Code for the 
2af0: 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74 65 72 6d  default non-term
2b00: 69 6e 61 6c 20 64 65 73 74 72 75 63 74 6f 72 20  inal destructor 
2b10: 2a 2f 0a 20 20 69 6e 74 20 20 76 61 72 64 65 73  */.  int  vardes
2b20: 74 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  tln;          /*
2b30: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
2b40: 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74 65 72   default non-ter
2b50: 6d 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64  m destructor cod
2b60: 65 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  e*/.  char *file
2b70: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 2f  name;          /
2b80: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
2b90: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  put file */.  ch
2ba0: 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20 20 20  ar *outname;    
2bb0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2bc0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75  f the current ou
2bd0: 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 63  tput file */.  c
2be0: 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66 69 78  har *tokenprefix
2bf0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70 72 65  ;       /* A pre
2c00: 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 6f 6b  fix added to tok
2c10: 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  en names in the 
2c20: 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  .h file */.  int
2c30: 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20 20 20   nconflict;     
2c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c50: 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c  of parsing confl
2c60: 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61  icts */.  int ta
2c70: 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20 20 20  blesize;        
2c80: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
2c90: 65 20 70 61 72 73 65 20 74 61 62 6c 65 73 20 2a  e parse tables *
2ca0: 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66 6c 61  /.  int basisfla
2cb0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g;           /* 
2cc0: 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73 69 73  Print only basis
2cd0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
2ce0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30  */.  char *argv0
2cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d00: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
2d10: 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  gram */.};..#def
2d20: 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ine MemoryCheck(
2d30: 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c  X) if((X)==0){ \
2d40: 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d  .  extern void m
2d50: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
2d60: 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  .  memory_error(
2d70: 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ); \.}../*******
2d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
2d90: 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68  he file "table.h
2da0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
2db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dc0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
2dd0: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
2de0: 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
2df0: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
2e00: 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
2e10: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
2e20: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
2e30: 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
2e40: 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
2e50: 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
2e60: 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
2e70: 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
2e80: 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
2e90: 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
2ea0: 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
2eb0: 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
2ec0: 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
2ed0: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
2ee0: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
2ef0: 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
2f00: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
2f10: 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 6f 75 74 69  or..*/../* Routi
2f20: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
2f30: 20 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63   a strings */..c
2f40: 68 61 72 20 2a 53 74 72 73 61 66 65 28 29 3b 0a  har *Strsafe();.
2f50: 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e  .void Strsafe_in
2f60: 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  it(/* void */);.
2f70: 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
2f80: 72 74 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29  rt(/* char * */)
2f90: 3b 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  ;.char *Strsafe_
2fa0: 66 69 6e 64 28 2f 2a 20 63 68 61 72 20 2a 20 2a  find(/* char * *
2fb0: 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73  /);../* Routines
2fc0: 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73 79   for handling sy
2fd0: 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61  mbols of the gra
2fe0: 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20  mmar */..struct 
2ff0: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
3000: 65 77 28 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c  ew();.int Symbol
3010: 63 6d 70 70 28 2f 2a 20 73 74 72 75 63 74 20 73  cmpp(/* struct s
3020: 79 6d 62 6f 6c 20 2a 2a 2c 20 73 74 72 75 63 74  ymbol **, struct
3030: 20 73 79 6d 62 6f 6c 20 2a 2a 20 2a 2f 29 3b 0a   symbol ** */);.
3040: 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  void Symbol_init
3050: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e  (/* void */);.in
3060: 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28  t Symbol_insert(
3070: 2f 2a 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  /* struct symbol
3080: 20 2a 2c 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a   *, char * */);.
3090: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
30a0: 79 6d 62 6f 6c 5f 66 69 6e 64 28 2f 2a 20 63 68  ymbol_find(/* ch
30b0: 61 72 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ar * */);.struct
30c0: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
30d0: 4e 74 68 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a  Nth(/* int */);.
30e0: 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  int Symbol_count
30f0: 28 2f 2a 20 20 2a 2f 29 3b 0a 73 74 72 75 63 74  (/*  */);.struct
3100: 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
3110: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
3120: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74  ;../* Routines t
3130: 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61  o manage the sta
3140: 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74  te table */..int
3150: 20 43 6f 6e 66 69 67 63 6d 70 28 2f 2a 20 73 74   Configcmp(/* st
3160: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2c 20 73  ruct config *, s
3170: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a  truct config * *
3180: 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  /);.struct state
3190: 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 3b 0a 76   *State_new();.v
31a0: 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 2f  oid State_init(/
31b0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
31c0: 53 74 61 74 65 5f 69 6e 73 65 72 74 28 2f 2a 20  State_insert(/* 
31d0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20  struct state *, 
31e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
31f0: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74  */);.struct stat
3200: 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 2f 2a  e *State_find(/*
3210: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
3220: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61   */);.struct sta
3230: 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79  te **State_array
3240: 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20  of(/*  */);../* 
3250: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 6f  Routines used fo
3260: 72 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e 20  r efficiency in 
3270: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20 2a  Configlist_add *
3280: 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  /..void Configta
3290: 62 6c 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  ble_init(/* void
32a0: 20 2a 2f 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67   */);.int Config
32b0: 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 2f 2a 20  table_insert(/* 
32c0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
32d0: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  */);.struct conf
32e0: 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ig *Configtable_
32f0: 66 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63  find(/* struct c
3300: 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69  onfig * */);.voi
3310: 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c  d Configtable_cl
3320: 65 61 72 28 2f 2a 20 69 6e 74 28 2a 29 28 73 74  ear(/* int(*)(st
3330: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 2a  ruct config *) *
3340: 2f 29 3b 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /);./***********
3350: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
3360: 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22   file "action.c"
3370: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
3380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3390: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
33a0: 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61 72 73   processing pars
33b0: 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68  er actions in th
33c0: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
33d0: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
33e0: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
33f0: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f  parser action */
3400: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  .struct action *
3410: 41 63 74 69 6f 6e 5f 6e 65 77 28 29 7b 0a 20 20  Action_new(){.  
3420: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63  static struct ac
3430: 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73 74 20 3d  tion *freelist =
3440: 20 30 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74   0;.  struct act
3450: 69 6f 6e 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28  ion *new;..  if(
3460: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
3470: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
3480: 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20  nt amt = 100;.  
3490: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74    freelist = (st
34a0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 61  ruct action *)ma
34b0: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
34c0: 75 63 74 20 61 63 74 69 6f 6e 29 2a 61 6d 74 20  uct action)*amt 
34d0: 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c  );.    if( freel
34e0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
34f0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
3500: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
3510: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
3520: 6e 65 77 20 70 61 72 73 65 72 20 61 63 74 69 6f  new parser actio
3530: 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  n.");.      exit
3540: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
3550: 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b  or(i=0; i<amt-1;
3560: 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69   i++) freelist[i
3570: 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69  ].next = &freeli
3580: 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65  st[i+1];.    fre
3590: 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
35a0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
35b0: 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66   = freelist;.  f
35c0: 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69  reelist = freeli
35d0: 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75  st->next;.  retu
35e0: 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 43 6f  rn new;.}../* Co
35f0: 6d 70 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e  mpare two action
3600: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
3610: 61 63 74 69 6f 6e 63 6d 70 28 61 70 31 2c 61 70  actioncmp(ap1,ap
3620: 32 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  2).struct action
3630: 20 2a 61 70 31 3b 0a 73 74 72 75 63 74 20 61 63   *ap1;.struct ac
3640: 74 69 6f 6e 20 2a 61 70 32 3b 0a 7b 0a 20 20 69  tion *ap2;.{.  i
3650: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 61 70  nt rc;.  rc = ap
3660: 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d 20 61  1->sp->index - a
3670: 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b 0a 20  p2->sp->index;. 
3680: 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
3690: 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70 65  = (int)ap1->type
36a0: 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79 70   - (int)ap2->typ
36b0: 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  e;.  if( rc==0 )
36c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  {.    assert( ap
36d0: 31 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  1->type==REDUCE 
36e0: 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52 44  || ap1->type==RD
36f0: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 20 61 70 31  _RESOLVED || ap1
3700: 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43 54  ->type==CONFLICT
3710: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
3720: 70 32 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  p2->type==REDUCE
3730: 20 7c 7c 20 61 70 32 2d 3e 74 79 70 65 3d 3d 52   || ap2->type==R
3740: 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 20 61 70  D_RESOLVED || ap
3750: 32 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43  2->type==CONFLIC
3760: 54 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 70 31  T);.    rc = ap1
3770: 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2d 20  ->x.rp->index - 
3780: 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78  ap2->x.rp->index
3790: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37a0: 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70 61  c;.}../* Sort pa
37b0: 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f 0a  rser actions */.
37c0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
37d0: 63 74 69 6f 6e 5f 73 6f 72 74 28 61 70 29 0a 73  ction_sort(ap).s
37e0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
37f0: 3b 0a 7b 0a 20 20 61 70 20 3d 20 28 73 74 72 75  ;.{.  ap = (stru
3800: 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f 72  ct action *)msor
3810: 74 28 61 70 2c 26 61 70 2d 3e 6e 65 78 74 2c 61  t(ap,&ap->next,a
3820: 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72 65 74  ctioncmp);.  ret
3830: 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20  urn ap;.}..void 
3840: 41 63 74 69 6f 6e 5f 61 64 64 28 61 70 70 2c 74  Action_add(app,t
3850: 79 70 65 2c 73 70 2c 61 72 67 29 0a 73 74 72 75  ype,sp,arg).stru
3860: 63 74 20 61 63 74 69 6f 6e 20 2a 2a 61 70 70 3b  ct action **app;
3870: 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74  .enum e_action t
3880: 79 70 65 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  ype;.struct symb
3890: 6f 6c 20 2a 73 70 3b 0a 63 68 61 72 20 2a 61 72  ol *sp;.char *ar
38a0: 67 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 61 63  g;.{.  struct ac
38b0: 74 69 6f 6e 20 2a 6e 65 77 3b 0a 20 20 6e 65 77  tion *new;.  new
38c0: 20 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b   = Action_new();
38d0: 0a 20 20 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 2a  .  new->next = *
38e0: 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20 6e 65  app;.  *app = ne
38f0: 77 3b 0a 20 20 6e 65 77 2d 3e 74 79 70 65 20 3d  w;.  new->type =
3900: 20 74 79 70 65 3b 0a 20 20 6e 65 77 2d 3e 73 70   type;.  new->sp
3910: 20 3d 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70   = sp;.  if( typ
3920: 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20  e==SHIFT ){.    
3930: 6e 65 77 2d 3e 78 2e 73 74 70 20 3d 20 28 73 74  new->x.stp = (st
3940: 72 75 63 74 20 73 74 61 74 65 20 2a 29 61 72 67  ruct state *)arg
3950: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
3960: 65 77 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75  ew->x.rp = (stru
3970: 63 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20  ct rule *)arg;. 
3980: 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
3990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
39a0: 6d 20 74 68 65 20 66 69 6c 65 20 22 61 73 73 65  m the file "asse
39b0: 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rt.c" **********
39c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39d0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 6d 6f 72 65  **/./*.** A more
39e0: 20 65 66 66 69 63 69 65 6e 74 20 77 61 79 20 6f   efficient way o
39f0: 66 20 68 61 6e 64 6c 69 6e 67 20 61 73 73 65 72  f handling asser
3a00: 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 6d  tions..*/.void m
3a10: 79 61 73 73 65 72 74 28 66 69 6c 65 2c 6c 69 6e  yassert(file,lin
3a20: 65 29 0a 63 68 61 72 20 2a 66 69 6c 65 3b 0a 69  e).char *file;.i
3a30: 6e 74 20 6c 69 6e 65 3b 0a 7b 0a 20 20 66 70 72  nt line;.{.  fpr
3a40: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 41 73 73  intf(stderr,"Ass
3a50: 65 72 74 69 6f 6e 20 66 61 69 6c 65 64 20 6f 6e  ertion failed on
3a60: 20 6c 69 6e 65 20 25 64 20 6f 66 20 66 69 6c 65   line %d of file
3a70: 20 5c 22 25 73 5c 22 5c 6e 22 2c 6c 69 6e 65 2c   \"%s\"\n",line,
3a80: 66 69 6c 65 29 3b 0a 20 20 65 78 69 74 28 31 29  file);.  exit(1)
3a90: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
3aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
3ab0: 20 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64   the file "build
3ac0: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
3ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3ae0: 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  */./*.** Routine
3af0: 73 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f  s to constructio
3b00: 6e 20 74 68 65 20 66 69 6e 69 74 65 20 73 74 61  n the finite sta
3b10: 74 65 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74  te machine for t
3b20: 68 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73  he LEMON.** pars
3b30: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
3b40: 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 70 72 65 63  ../* Find a prec
3b50: 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66  edence symbol of
3b60: 20 65 76 65 72 79 20 72 75 6c 65 20 69 6e 20 74   every rule in t
3b70: 68 65 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a  he grammar..** .
3b80: 2a 2a 20 54 68 6f 73 65 20 72 75 6c 65 73 20 77  ** Those rules w
3b90: 68 69 63 68 20 68 61 76 65 20 61 20 70 72 65 63  hich have a prec
3ba0: 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f  edence symbol co
3bb0: 64 65 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74  ded in the input
3bc0: 0a 2a 2a 20 67 72 61 6d 6d 61 72 20 75 73 69 6e  .** grammar usin
3bd0: 67 20 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22  g the "[symbol]"
3be0: 20 63 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c 20   construct will 
3bf0: 61 6c 72 65 61 64 79 20 68 61 76 65 20 74 68 65  already have the
3c00: 0a 2a 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d 20  .** rp->precsym 
3c10: 66 69 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f  field filled.  O
3c20: 74 68 65 72 20 72 75 6c 65 73 20 74 61 6b 65 20  ther rules take 
3c30: 61 73 20 74 68 65 69 72 20 70 72 65 63 65 64 65  as their precede
3c40: 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68  nce.** symbol th
3c50: 65 20 66 69 72 73 74 20 52 48 53 20 73 79 6d 62  e first RHS symb
3c60: 6f 6c 20 77 69 74 68 20 61 20 64 65 66 69 6e 65  ol with a define
3c70: 64 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 49  d precedence.  I
3c80: 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
3c90: 6f 74 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77  ot RHS symbols w
3ca0: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72  ith a defined pr
3cb0: 65 63 65 64 65 6e 63 65 2c 20 74 68 65 20 70 72  ecedence, the pr
3cc0: 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62  ecedence.** symb
3cd0: 6f 6c 20 66 69 65 6c 64 20 69 73 20 6c 65 66 74  ol field is left
3ce0: 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20   blank..*/.void 
3cf0: 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e  FindRulePreceden
3d00: 63 65 73 28 78 70 29 0a 73 74 72 75 63 74 20 6c  ces(xp).struct l
3d10: 65 6d 6f 6e 20 2a 78 70 3b 0a 7b 0a 20 20 73 74  emon *xp;.{.  st
3d20: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
3d30: 20 66 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65   for(rp=xp->rule
3d40: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
3d50: 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  t){.    if( rp->
3d60: 70 72 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20  precsym==0 ){.  
3d70: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
3d80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
3d90: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
3da0: 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b      if( rp->rhs[
3db0: 69 5d 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20  i]->prec>=0 ){. 
3dc0: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65           rp->pre
3dd0: 63 73 79 6d 20 3d 20 72 70 2d 3e 72 68 73 5b 69  csym = rp->rhs[i
3de0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ];.          bre
3df0: 61 6b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20  ak;..}.      }. 
3e00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3e10: 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c  n;.}../* Find al
3e20: 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77  l nonterminals w
3e30: 68 69 63 68 20 77 69 6c 6c 20 67 65 6e 65 72 61  hich will genera
3e40: 74 65 20 74 68 65 20 65 6d 70 74 79 20 73 74 72  te the empty str
3e50: 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f 20  ing..** Then go 
3e60: 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74 65  back and compute
3e70: 20 74 68 65 20 66 69 72 73 74 20 73 65 74 73 20   the first sets 
3e80: 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74 65 72 6d  of every nonterm
3e90: 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69 72  inal..** The fir
3ea0: 73 74 20 73 65 74 20 69 73 20 74 68 65 20 73 65  st set is the se
3eb0: 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61  t of all termina
3ec0: 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  l symbols which 
3ed0: 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20 73  can begin.** a s
3ee0: 74 72 69 6e 67 20 67 65 6e 65 72 61 74 65 64 20  tring generated 
3ef0: 62 79 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d 69  by that nontermi
3f00: 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  nal..*/.void Fin
3f10: 64 46 69 72 73 74 53 65 74 73 28 6c 65 6d 70 29  dFirstSets(lemp)
3f20: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
3f30: 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp;.{.  int i;.
3f40: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
3f50: 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73  p;.  int progres
3f60: 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  s;..  for(i=0; i
3f70: 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
3f80: 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e  i++){.    lemp->
3f90: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62  symbols[i]->lamb
3fa0: 64 61 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a  da = FALSE;.  }.
3fb0: 20 20 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74    for(i=lemp->nt
3fc0: 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d  erminal; i<lemp-
3fd0: 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
3fe0: 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c      lemp->symbol
3ff0: 73 5b 69 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d  s[i]->firstset =
4000: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a   SetNew();.  }..
4010: 20 20 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70 75    /* First compu
4020: 74 65 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a  te all lambdas *
4030: 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67  /.  do{.    prog
4040: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
4050: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
4060: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
4070: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  ){.      if( rp-
4080: 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63  >lhs->lambda ) c
4090: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
40a0: 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
40b0: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
40c0: 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69     if( rp->rhs[i
40d0: 5d 2d 3e 6c 61 6d 62 64 61 3d 3d 46 41 4c 53 45  ]->lambda==FALSE
40e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
40f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72  }.      if( i==r
4100: 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20  p->nrhs ){.     
4110: 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62     rp->lhs->lamb
4120: 64 61 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  da = TRUE;.     
4130: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
4140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4150: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
4160: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
4170: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
4180: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
4190: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
41a0: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
41b0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
41c0: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
41d0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
41e0: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
41f0: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
4200: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
4210: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
4220: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
4230: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
4240: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
4250: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
4260: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
4270: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
4280: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
4290: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65        break;..}e
42a0: 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29  lse if( s1==s2 )
42b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
42c0: 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 46 41 4c 53  s1->lambda==FALS
42d0: 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73  E ) break;..}els
42e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f  e{.          pro
42f0: 67 72 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f  gress += SetUnio
4300: 6e 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73  n(s1->firstset,s
4310: 32 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20  2->firstset);.  
4320: 20 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e          if( s2->
4330: 6c 61 6d 62 64 61 3d 3d 46 41 4c 53 45 20 29 20  lambda==FALSE ) 
4340: 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 20 20  break;..}.      
4350: 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
4360: 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 20 20  ( progress );.  
4370: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f  return;.}../* Co
4380: 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20  mpute all LR(0) 
4390: 73 74 61 74 65 73 20 66 6f 72 20 74 68 65 20 67  states for the g
43a0: 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a  rammar.  Links.*
43b0: 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 62  * are added to b
43c0: 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74 61 74  etween some stat
43d0: 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 4c  es so that the L
43e0: 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74 73  R(1) follow sets
43f0: 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70 75  .** can be compu
4400: 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52  ted later..*/.PR
4410: 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74 61  IVATE struct sta
4420: 74 65 20 2a 67 65 74 73 74 61 74 65 28 2f 2a 20  te *getstate(/* 
4430: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a  struct lemon * *
4440: 2f 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20  /);  /* forward 
4450: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69  reference */.voi
4460: 64 20 46 69 6e 64 53 74 61 74 65 73 28 6c 65 6d  d FindStates(lem
4470: 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
4480: 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63  *lemp;.{.  struc
4490: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
44a0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
44b0: 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69  ..  Configlist_i
44c0: 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  nit();..  /* Fin
44d0: 64 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  d the start symb
44e0: 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  ol */.  if( lemp
44f0: 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73  ->start ){.    s
4500: 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
4510: 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20  lemp->start);.  
4520: 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20    if( sp==0 ){. 
4530: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
4540: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
4550: 22 54 68 65 20 73 70 65 63 69 66 69 65 64 20 73  "The specified s
4560: 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73  tart symbol \"%s
4570: 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61  \" is not \.in a
4580: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20   nonterminal of 
4590: 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22  the grammar.  \"
45a0: 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73 65  %s\" will be use
45b0: 64 20 61 73 20 74 68 65 20 73 74 61 72 74 20 5c  d as the start \
45c0: 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e  .symbol instead.
45d0: 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65  ",lemp->start,le
45e0: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e 6e  mp->rule->lhs->n
45f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  ame);.      lemp
4600: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
4610: 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72      sp = lemp->r
4620: 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a  ule->lhs;.    }.
4630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20    }else{.    sp 
4640: 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  = lemp->rule->lh
4650: 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  s;.  }..  /* Mak
4660: 65 20 73 75 72 65 20 74 68 65 20 73 74 61 72 74  e sure the start
4670: 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20   symbol doesn't 
4680: 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69 67  occur on the rig
4690: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 0a  ht-hand side of.
46a0: 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20    ** any rule.  
46b0: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
46c0: 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59 41  if it does.  (YA
46d0: 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61 74  CC would generat
46e0: 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61  e a new.  ** sta
46f0: 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69  rt symbol in thi
4700: 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f  s case.) */.  fo
4710: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
4720: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
4730: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
4740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
4750: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
4760: 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69     if( rp->rhs[i
4770: 5d 3d 3d 73 70 20 29 7b 0a 20 20 20 20 20 20 20  ]==sp ){.       
4780: 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
4790: 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65  filename,0,."The
47a0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22   start symbol \"
47b0: 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e 20 74  %s\" occurs on t
47c0: 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e 64 20  he \.right-hand 
47d0: 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65 2e 20  side of a rule. 
47e0: 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75 6c 74  This will result
47f0: 20 69 6e 20 61 20 70 61 72 73 65 72 20 77 68 69   in a parser whi
4800: 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20 77 6f  ch \.does not wo
4810: 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c 73 70  rk properly.",sp
4820: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
4830: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
4840: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
4850: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62  .  }..  /* The b
4860: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
4870: 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65 20 66  on set for the f
4880: 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a 2a 20  irst state.  ** 
4890: 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77 68 69  is all rules whi
48a0: 63 68 20 68 61 76 65 20 74 68 65 20 73 74 61 72  ch have the star
48b0: 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68 65 69  t symbol as thei
48c0: 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e 64  r.  ** left-hand
48d0: 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72 28 72   side */.  for(r
48e0: 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  p=sp->rule; rp; 
48f0: 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b  rp=rp->nextlhs){
4900: 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .    struct conf
4910: 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20 20 20  ig *newcfp;.    
4920: 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c  newcfp = Configl
4930: 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70 2c  ist_addbasis(rp,
4940: 30 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28 6e  0);.    SetAdd(n
4950: 65 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a 20  ewcfp->fws,0);. 
4960: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
4970: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
4980: 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 61  .  All other sta
4990: 74 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a  tes will be.  **
49a0: 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61   computed automa
49b0: 74 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20 74  tically during t
49c0: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f  he computation o
49d0: 66 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e  f the first one.
49e0: 0a 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  .  ** The return
49f0: 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ed pointer to th
4a00: 65 20 66 69 72 73 74 20 73 74 61 74 65 20 69 73  e first state is
4a10: 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20   not used. */.  
4a20: 28 76 6f 69 64 29 67 65 74 73 74 61 74 65 28 6c  (void)getstate(l
4a30: 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  emp);.  return;.
4a40: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
4a50: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
4a60: 65 20 77 68 69 63 68 20 69 73 20 64 65 73 63 72  e which is descr
4a70: 69 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e 66  ibed by the conf
4a80: 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73  iguration.** lis
4a90: 74 20 77 68 69 63 68 20 68 61 73 20 62 65 65 6e  t which has been
4aa0: 20 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c 6c   built from call
4ab0: 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74 5f  s to Configlist_
4ac0: 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  add..*/.PRIVATE 
4ad0: 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73  void buildshifts
4ae0: 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (/* struct lemon
4af0: 20 2a 2c 20 73 74 72 75 63 74 20 73 74 61 74 65   *, struct state
4b00: 20 2a 20 2a 2f 29 3b 20 2f 2a 20 46 6f 72 77 64   * */); /* Forwd
4b10: 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45 20   ref */.PRIVATE 
4b20: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67 65  struct state *ge
4b30: 74 73 74 61 74 65 28 6c 65 6d 70 29 0a 73 74 72  tstate(lemp).str
4b40: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
4b50: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
4b60: 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20  ig *cfp, *bp;.  
4b70: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
4b80: 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74  p;..  /* Extract
4b90: 20 74 68 65 20 73 6f 72 74 65 64 20 62 61 73 69   the sorted basi
4ba0: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74 61  s of the new sta
4bb0: 74 65 2e 20 20 54 68 65 20 62 61 73 69 73 20 77  te.  The basis w
4bc0: 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20  as constructed. 
4bd0: 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61 6c   ** by prior cal
4be0: 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73  ls to "Configlis
4bf0: 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20 2a  t_addbasis()". *
4c00: 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  /.  Configlist_s
4c10: 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62 70  ortbasis();.  bp
4c20: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61   = Configlist_ba
4c30: 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  sis();..  /* Get
4c40: 20 61 20 73 74 61 74 65 20 77 69 74 68 20 74 68   a state with th
4c50: 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a  e same basis */.
4c60: 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66 69    stp = State_fi
4c70: 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73 74  nd(bp);.  if( st
4c80: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74  p ){.    /* A st
4c90: 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ate with the sam
4ca0: 65 20 62 61 73 69 73 20 61 6c 72 65 61 64 79 20  e basis already 
4cb0: 65 78 69 73 74 73 21 20 20 43 6f 70 79 20 61 6c  exists!  Copy al
4cc0: 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74  l the follow-set
4cd0: 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61 74  .    ** propagat
4ce0: 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74  ion links from t
4cf0: 68 65 20 73 74 61 74 65 20 75 6e 64 65 72 20 63  he state under c
4d00: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f  onstruction into
4d10: 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65 65   the.    ** pree
4d20: 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20 74  xisting state, t
4d30: 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
4d40: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 65  nter to the pree
4d50: 78 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a 2f  xisting state */
4d60: 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .    struct conf
4d70: 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66  ig *x, *y;.    f
4d80: 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e  or(x=bp, y=stp->
4d90: 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78 2d  bp; x && y; x=x-
4da0: 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20  >bp, y=y->bp){. 
4db0: 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28       Plink_copy(
4dc0: 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70  &y->bplp,x->bplp
4dd0: 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64  );.      Plink_d
4de0: 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a  elete(x->fplp);.
4df0: 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20        x->fplp = 
4e00: 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20  x->bplp = 0;.   
4e10: 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e   }.    cfp = Con
4e20: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
4e30: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  ;.    Configlist
4e40: 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c  _eat(cfp);.  }el
4e50: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
4e60: 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77 20  really is a new 
4e70: 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75 63  state.  Construc
4e80: 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69 6c  t all the detail
4e90: 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c  s */.    Configl
4ea0: 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70  ist_closure(lemp
4eb0: 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );    /* Compute
4ec0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
4ed0: 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20  on closure */.  
4ee0: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72    Configlist_sor
4ef0: 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f  t();           /
4f00: 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69  * Sort the confi
4f10: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
4f20: 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43 6f   */.    cfp = Co
4f30: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
4f40: 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  );   /* Get a po
4f50: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6e  inter to the con
4f60: 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  fig list */.    
4f70: 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77 28  stp = State_new(
4f80: 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );           /* 
4f90: 41 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75  A new state stru
4fa0: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  cture */.    Mem
4fb0: 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a 20  oryCheck(stp);. 
4fc0: 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b     stp->bp = bp;
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
4ff0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 61  configuration ba
5000: 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  sis */.    stp->
5010: 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20 20  cfp = cfp;      
5020: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d          /* Remem
5030: 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ber the configur
5040: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
5050: 0a 20 20 20 20 73 74 70 2d 3e 69 6e 64 65 78 20  .    stp->index 
5060: 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b  = lemp->nstate++
5070: 3b 20 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65  ; /* Every state
5080: 20 67 65 74 73 20 61 20 73 65 71 75 65 6e 63 65   gets a sequence
5090: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73   number */.    s
50a0: 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20  tp->ap = 0;     
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
50c0: 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20  o actions, yet. 
50d0: 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73  */.    State_ins
50e0: 65 72 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29  ert(stp,stp->bp)
50f0: 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68  ;   /* Add to th
5100: 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f  e state table */
5110: 0a 20 20 20 20 62 75 69 6c 64 73 68 69 66 74 73  .    buildshifts
5120: 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20  (lemp,stp);     
5130: 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79    /* Recursively
5140: 20 63 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73   compute success
5150: 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d  or states */.  }
5160: 0a 20 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d  .  return stp;.}
5170: 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  ../* Construct a
5180: 6c 6c 20 73 75 63 63 65 73 73 6f 72 20 73 74 61  ll successor sta
5190: 74 65 73 20 74 6f 20 74 68 65 20 67 69 76 65 6e  tes to the given
51a0: 20 73 74 61 74 65 2e 20 20 41 20 22 73 75 63 63   state.  A "succ
51b0: 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20  essor".** state 
51c0: 69 73 20 61 6e 79 20 73 74 61 74 65 20 77 68 69  is any state whi
51d0: 63 68 20 63 61 6e 20 62 65 20 72 65 61 63 68 65  ch can be reache
51e0: 64 20 62 79 20 61 20 73 68 69 66 74 20 61 63 74  d by a shift act
51f0: 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ion..*/.PRIVATE 
5200: 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73  void buildshifts
5210: 28 6c 65 6d 70 2c 73 74 70 29 0a 73 74 72 75 63  (lemp,stp).struc
5220: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73  t lemon *lemp;.s
5230: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
5240: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61  ;     /* The sta
5250: 74 65 20 66 72 6f 6d 20 77 68 69 63 68 20 73 75  te from which su
5260: 63 63 65 73 73 6f 72 73 20 61 72 65 20 63 6f 6d  ccessors are com
5270: 70 75 74 65 64 20 2a 2f 0a 7b 0a 20 20 73 74 72  puted */.{.  str
5280: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
5290: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
52a0: 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66 69 67   thru the config
52b0: 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70   closure of "stp
52c0: 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  " */.  struct co
52d0: 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46  nfig *bcfp; /* F
52e0: 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  or the inner loo
52f0: 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73  p on config clos
5300: 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a  ure of "stp" */.
5310: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
5320: 2a 6e 65 77 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73  *new;  /* */.  s
5330: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
5340: 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f  ;   /* Symbol fo
5350: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20  llowing the dot 
5360: 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  in configuration
5370: 20 22 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75   "cfp" */.  stru
5380: 63 74 20 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20  ct symbol *bsp; 
5390: 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f   /* Symbol follo
53a0: 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20  wing the dot in 
53b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 62  configuration "b
53c0: 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74  cfp" */.  struct
53d0: 20 73 74 61 74 65 20 2a 6e 65 77 73 74 70 3b 20   state *newstp; 
53e0: 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  /* A pointer to 
53f0: 61 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74  a successor stat
5400: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20  e */..  /* Each 
5410: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 65  configuration be
5420: 63 6f 6d 65 73 20 63 6f 6d 70 6c 65 74 65 20 61  comes complete a
5430: 66 74 65 72 20 69 74 20 63 6f 6e 74 69 62 75 74  fter it contibut
5440: 65 73 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f  es to a successo
5450: 72 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 49  r.  ** state.  I
5460: 6e 69 74 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f  nitially, all co
5470: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 72 65  nfigurations are
5480: 20 69 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20   incomplete */. 
5490: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
54a0: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
54b0: 3e 6e 65 78 74 29 20 63 66 70 2d 3e 73 74 61 74  >next) cfp->stat
54c0: 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b  us = INCOMPLETE;
54d0: 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f  ..  /* Loop thro
54e0: 75 67 68 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72  ugh all configur
54f0: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 74  ations of the st
5500: 61 74 65 20 22 73 74 70 22 20 2a 2f 0a 20 20 66  ate "stp" */.  f
5510: 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b  or(cfp=stp->cfp;
5520: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
5530: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 63 66  ext){.    if( cf
5540: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
5550: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ETE ) continue; 
5560: 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73     /* Already us
5570: 65 64 20 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70  ed by inner loop
5580: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 66 70 2d   */.    if( cfp-
5590: 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e  >dot>=cfp->rp->n
55a0: 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  rhs ) continue; 
55b0: 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20   /* Can't shift 
55c0: 74 68 69 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20  this config */. 
55d0: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65     Configlist_re
55e0: 73 65 74 28 29 3b 20 20 20 20 20 20 20 20 20 20  set();          
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
5600: 65 73 65 74 20 74 68 65 20 6e 65 77 20 63 6f 6e  eset the new con
5610: 66 69 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 73  fig set */.    s
5620: 70 20 3d 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73  p = cfp->rp->rhs
5630: 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20  [cfp->dot];     
5640: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f          /* Symbo
5650: 6c 20 61 66 74 65 72 20 74 68 65 20 64 6f 74 20  l after the dot 
5660: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65  */..    /* For e
5670: 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69  very configurati
5680: 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  on in the state 
5690: 22 73 74 70 22 20 77 68 69 63 68 20 68 61 73 20  "stp" which has 
56a0: 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a  the symbol "sp".
56b0: 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
56c0: 20 69 74 73 20 64 6f 74 2c 20 61 64 64 20 74 68   its dot, add th
56d0: 65 20 73 61 6d 65 20 63 6f 6e 66 69 67 75 72 61  e same configura
56e0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 62 61 73 69  tion to the basi
56f0: 73 20 73 65 74 20 75 6e 64 65 72 0a 20 20 20 20  s set under.    
5700: 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  ** construction 
5710: 62 75 74 20 77 69 74 68 20 74 68 65 20 64 6f 74  but with the dot
5720: 20 73 68 69 66 74 65 64 20 6f 6e 65 20 73 79 6d   shifted one sym
5730: 62 6f 6c 20 74 6f 20 74 68 65 20 72 69 67 68 74  bol to the right
5740: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 62 63 66  . */.    for(bcf
5750: 70 3d 63 66 70 3b 20 62 63 66 70 3b 20 62 63 66  p=cfp; bcfp; bcf
5760: 70 3d 62 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  p=bcfp->next){. 
5770: 20 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 73       if( bcfp->s
5780: 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20  tatus==COMPLETE 
5790: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f  ) continue;    /
57a0: 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20 2a  * Already used *
57b0: 2f 0a 20 20 20 20 20 20 69 66 28 20 62 63 66 70  /.      if( bcfp
57c0: 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d  ->dot>=bcfp->rp-
57d0: 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65  >nrhs ) continue
57e0: 3b 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74  ; /* Can't shift
57f0: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20   this one */.   
5800: 20 20 20 62 73 70 20 3d 20 62 63 66 70 2d 3e 72     bsp = bcfp->r
5810: 70 2d 3e 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74  p->rhs[bcfp->dot
5820: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ];           /* 
5830: 47 65 74 20 73 79 6d 62 6f 6c 20 61 66 74 65 72  Get symbol after
5840: 20 64 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66   dot */.      if
5850: 28 20 62 73 70 21 3d 73 70 20 29 20 63 6f 6e 74  ( bsp!=sp ) cont
5860: 69 6e 75 65 3b 20 20 20 20 20 20 20 20 20 20 20  inue;           
5870: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
5880: 62 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 22  be same as for "
5890: 63 66 70 22 20 2a 2f 0a 20 20 20 20 20 20 62 63  cfp" */.      bc
58a0: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d  fp->status = COM
58b0: 50 4c 45 54 45 3b 20 20 20 20 20 20 20 20 20 20  PLETE;          
58c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20          /* Mark 
58d0: 74 68 69 73 20 63 6f 6e 66 69 67 20 61 73 20 75  this config as u
58e0: 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77  sed */.      new
58f0: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64   = Configlist_ad
5900: 64 62 61 73 69 73 28 62 63 66 70 2d 3e 72 70 2c  dbasis(bcfp->rp,
5910: 62 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20  bcfp->dot+1);.  
5920: 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e      Plink_add(&n
5930: 65 77 2d 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a  ew->bplp,bcfp);.
5940: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
5950: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
5960: 68 65 20 73 74 61 74 65 20 64 65 73 63 72 69 62  he state describ
5970: 65 64 20 62 79 20 74 68 65 20 62 61 73 69 73 20  ed by the basis 
5980: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  configuration se
5990: 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75  t.    ** constru
59a0: 63 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 63  cted in the prec
59b0: 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20  eding loop */.  
59c0: 20 20 6e 65 77 73 74 70 20 3d 20 67 65 74 73 74    newstp = getst
59d0: 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20  ate(lemp);..    
59e0: 2f 2a 20 54 68 65 20 73 74 61 74 65 20 22 6e 65  /* The state "ne
59f0: 77 73 74 70 22 20 69 73 20 72 65 61 63 68 65 64  wstp" is reached
5a00: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20   from the state 
5a10: 22 73 74 70 22 20 62 79 20 61 20 73 68 69 66 74  "stp" by a shift
5a20: 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f   action.    ** o
5a30: 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70  n the symbol "sp
5a40: 22 20 2a 2f 0a 20 20 20 20 41 63 74 69 6f 6e 5f  " */.    Action_
5a50: 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49  add(&stp->ap,SHI
5a60: 46 54 2c 73 70 2c 6e 65 77 73 74 70 29 3b 0a 20  FT,sp,newstp);. 
5a70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
5a80: 74 72 75 63 74 20 74 68 65 20 70 72 6f 70 61 67  truct the propag
5a90: 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76  ation links.*/.v
5aa0: 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 6c 65  oid FindLinks(le
5ab0: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
5ac0: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
5ad0: 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  i;.  struct conf
5ae0: 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b  ig *cfp, *other;
5af0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
5b00: 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70  *stp;.  struct p
5b10: 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a  link *plp;..  /*
5b20: 20 48 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65   Housekeeping de
5b30: 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74  tail:.  ** Add t
5b40: 6f 20 65 76 65 72 79 20 70 72 6f 70 61 67 61 74  o every propagat
5b50: 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72  e link a pointer
5b60: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61   back to the sta
5b70: 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68  te to.  ** which
5b80: 20 74 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74   the link is att
5b90: 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  ached. */.  for(
5ba0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
5bb0: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
5bc0: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
5bd0: 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66  d[i];.    for(cf
5be0: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
5bf0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
5c00: 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20  .      cfp->stp 
5c10: 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  = stp;.    }.  }
5c20: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61  ..  /* Convert a
5c30: 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74  ll backlinks int
5c40: 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e  o forward links.
5c50: 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61    Only the forwa
5c60: 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72  rd.  ** links ar
5c70: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f  e used in the fo
5c80: 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61  llow-set computa
5c90: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
5ca0: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
5cb0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
5cc0: 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
5cd0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70  [i];.    for(cfp
5ce0: 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20  =stp->cfp; cfp; 
5cf0: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
5d00: 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66        for(plp=cf
5d10: 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c  p->bplp; plp; pl
5d20: 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=plp->next){.  
5d30: 20 20 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c        other = pl
5d40: 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20  p->cfp;.        
5d50: 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72  Plink_add(&other
5d60: 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20  ->fplp,cfp);.   
5d70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
5d80: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c  ../* Compute all
5d90: 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a   followsets..**.
5da0: 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69  ** A followset i
5db0: 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c  s the set of all
5dc0: 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63   symbols which c
5dd0: 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74  an come immediat
5de0: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63  ely.** after a c
5df0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f  onfiguration..*/
5e00: 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77  .void FindFollow
5e10: 53 65 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  Sets(lemp).struc
5e20: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
5e30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
5e40: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
5e50: 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
5e60: 70 6c 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72  plp;.  int progr
5e70: 65 73 73 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67  ess;.  int chang
5e80: 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e;..  for(i=0; i
5e90: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
5ea0: 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 63 66 70  ++){.    for(cfp
5eb0: 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d  =lemp->sorted[i]
5ec0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
5ed0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
5ee0: 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20    cfp->status = 
5ef0: 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20  INCOMPLETE;.    
5f00: 7d 0a 20 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20  }.  }.  .  do{. 
5f10: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b     progress = 0;
5f20: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5f30: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
5f40: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 63 66  +){.      for(cf
5f50: 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  p=lemp->sorted[i
5f60: 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  ]->cfp; cfp; cfp
5f70: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
5f80: 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74       if( cfp->st
5f90: 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29  atus==COMPLETE )
5fa0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5fb0: 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e     for(plp=cfp->
5fc0: 66 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70  fplp; plp; plp=p
5fd0: 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  lp->next){.     
5fe0: 20 20 20 20 20 63 68 61 6e 67 65 20 3d 20 53 65       change = Se
5ff0: 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d  tUnion(plp->cfp-
6000: 3e 66 77 73 2c 63 66 70 2d 3e 66 77 73 29 3b 0a  >fws,cfp->fws);.
6010: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 68            if( ch
6020: 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ange ){.        
6030: 20 20 20 20 70 6c 70 2d 3e 63 66 70 2d 3e 73 74      plp->cfp->st
6040: 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54  atus = INCOMPLET
6050: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  E;.            p
6060: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 09 20 20  rogress = 1;..  
6070: 7d 0a 09 7d 0a 20 20 20 20 20 20 20 20 63 66 70  }..}.        cfp
6080: 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c  ->status = COMPL
6090: 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
60a0: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f   }.  }while( pro
60b0: 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61 74  gress );.}..stat
60c0: 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63  ic int resolve_c
60d0: 6f 6e 66 6c 69 63 74 28 29 3b 0a 0a 2f 2a 20 43  onflict();../* C
60e0: 6f 6d 70 75 74 65 20 74 68 65 20 72 65 64 75 63  ompute the reduc
60f0: 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72  e actions, and r
6100: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
6110: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63  ..*/.void FindAc
6120: 74 69 6f 6e 73 28 6c 65 6d 70 29 0a 73 74 72 75  tions(lemp).stru
6130: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
6140: 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73  {.  int i,j;.  s
6150: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
6160: 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  p;.  struct stat
6170: 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
6180: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73   symbol *sp;.  s
6190: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
61a0: 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66  .  /* Add all of
61b0: 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
61c0: 6f 6e 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75  ons .  ** A redu
61d0: 63 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64  ce action is add
61e0: 65 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d  ed for each elem
61f0: 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ent of the follo
6200: 77 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63  wset of.  ** a c
6210: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69  onfiguration whi
6220: 63 68 20 68 61 73 20 69 74 73 20 64 6f 74 20 61  ch has its dot a
6230: 74 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69  t the extreme ri
6240: 67 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ght..  */.  for(
6250: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
6260: 61 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20  ate; i++){   /* 
6270: 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74  Loop over all st
6280: 61 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20  ates */.    stp 
6290: 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
62a0: 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73  ];.    for(cfp=s
62b0: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
62c0: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f  p=cfp->next){  /
62d0: 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  * Loop over all 
62e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
62f0: 2f 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d  /.      if( cfp-
6300: 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e  >rp->nrhs==cfp->
6310: 64 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a  dot ){        /*
6320: 20 49 73 20 64 6f 74 20 61 74 20 65 78 74 72 65   Is dot at extre
6330: 6d 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20  me right? */.   
6340: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
6350: 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
6360: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
6370: 20 69 66 28 20 53 65 74 46 69 6e 64 28 63 66 70   if( SetFind(cfp
6380: 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20  ->fws,j) ){.    
6390: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61          /* Add a
63a0: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74   reduce action t
63b0: 6f 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  o the state "stp
63c0: 22 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64  " which will red
63d0: 75 63 65 20 62 79 20 74 68 65 0a 20 20 20 20 20  uce by the.     
63e0: 20 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22         ** rule "
63f0: 63 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20  cfp->rp" if the 
6400: 6c 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c  lookahead symbol
6410: 20 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f   is "lemp->symbo
6420: 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20  ls[j]" */.      
6430: 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64        Action_add
6440: 28 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45  (&stp->ap,REDUCE
6450: 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a  ,lemp->symbols[j
6460: 5d 2c 63 66 70 2d 3e 72 70 29 3b 0a 20 20 20 20  ],cfp->rp);.    
6470: 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 20        }..}.     
6480: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
6490: 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63 65 70  /* Add the accep
64a0: 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  ting token */.  
64b0: 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20  if( lemp->start 
64c0: 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62  ){.    sp = Symb
64d0: 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74  ol_find(lemp->st
64e0: 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70  art);.    if( sp
64f0: 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d  ==0 ) sp = lemp-
6500: 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65  >rule->lhs;.  }e
6510: 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  lse{.    sp = le
6520: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
6530: 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74 6f 20 74   }.  /* Add to t
6540: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20 28  he first state (
6550: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20  which is always 
6560: 74 68 65 20 73 74 61 72 74 69 6e 67 20 73 74 61  the starting sta
6570: 74 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  te of the.  ** f
6580: 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68  inite state mach
6590: 69 6e 65 29 20 61 6e 20 61 63 74 69 6f 6e 20 74  ine) an action t
65a0: 6f 20 41 43 43 45 50 54 20 69 66 20 74 68 65 20  o ACCEPT if the 
65b0: 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20 74 68 65  lookahead is the
65c0: 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e 6f 6e 74  .  ** start nont
65d0: 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41  erminal.  */.  A
65e0: 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65 6d 70 2d  ction_add(&lemp-
65f0: 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61 70 2c 41  >sorted[0]->ap,A
6600: 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a 0a 20 20  CCEPT,sp,0);..  
6610: 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6e 66 6c  /* Resolve confl
6620: 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  icts */.  for(i=
6630: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
6640: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
6650: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20  uct action *ap, 
6660: 2a 6e 61 70 3b 0a 20 20 20 20 73 74 72 75 63 74  *nap;.    struct
6670: 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 20   state *stp;.   
6680: 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
6690: 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  ted[i];.    asse
66a0: 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 0a 20  rt( stp->ap );. 
66b0: 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74     stp->ap = Act
66c0: 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70  ion_sort(stp->ap
66d0: 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  );.    for(ap=st
66e0: 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61 70 2d  p->ap; ap && ap-
66f0: 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e 6e 65  >next; ap=ap->ne
6700: 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e  xt){.      for(n
6710: 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e 61 70  ap=ap->next; nap
6720: 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d   && nap->sp==ap-
6730: 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65  >sp; nap=nap->ne
6740: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 2f 2a  xt){.         /*
6750: 20 54 68 65 20 74 77 6f 20 61 63 74 69 6f 6e 73   The two actions
6760: 20 22 61 70 22 20 61 6e 64 20 22 6e 61 70 22 20   "ap" and "nap" 
6770: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6c 6f  have the same lo
6780: 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 20 20 20  okahead..       
6790: 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
67a0: 77 68 69 63 68 20 6f 6e 65 20 73 68 6f 75 6c 64  which one should
67b0: 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20 20 20   be used */.    
67c0: 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66       lemp->nconf
67d0: 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76 65 5f  lict += resolve_
67e0: 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61 70 2c  conflict(ap,nap,
67f0: 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 29 3b 0a 20  lemp->errsym);. 
6800: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6810: 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 61 6e  ..  /* Report an
6820: 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63 68 20   error for each 
6830: 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20 6e 65  rule that can ne
6840: 76 65 72 20 62 65 20 72 65 64 75 63 65 64 2e 20  ver be reduced. 
6850: 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
6860: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
6870: 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63 61 6e  p->next) rp->can
6880: 52 65 64 75 63 65 20 3d 20 46 41 4c 53 45 3b 0a  Reduce = FALSE;.
6890: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
68a0: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
68b0: 0a 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69  .    struct acti
68c0: 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28  on *ap;.    for(
68d0: 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  ap=lemp->sorted[
68e0: 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  i]->ap; ap; ap=a
68f0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
6900: 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
6910: 44 55 43 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d  DUCE ) ap->x.rp-
6920: 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 54 52 55  >canReduce = TRU
6930: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  E;.    }.  }.  f
6940: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
6950: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
6960: 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  t){.    if( rp->
6970: 63 61 6e 52 65 64 75 63 65 20 29 20 63 6f 6e 74  canReduce ) cont
6980: 69 6e 75 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d  inue;.    ErrorM
6990: 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
69a0: 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22  e,rp->ruleline,"
69b0: 54 68 69 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f  This rule can no
69c0: 74 20 62 65 20 72 65 64 75 63 65 64 2e 5c 6e 22  t be reduced.\n"
69d0: 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
69e0: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  orcnt++;.  }.}..
69f0: 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e  /* Resolve a con
6a00: 66 6c 69 63 74 20 62 65 74 77 65 65 6e 20 74 68  flict between th
6a10: 65 20 74 77 6f 20 67 69 76 65 6e 20 61 63 74 69  e two given acti
6a20: 6f 6e 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20  ons.  If the.** 
6a30: 63 6f 6e 66 6c 69 63 74 20 63 61 6e 27 74 20 62  conflict can't b
6a40: 65 20 72 65 73 6f 6c 76 65 2c 20 72 65 74 75 72  e resolve, retur
6a50: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a  n non-zero..**.*
6a60: 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45  * NO LONGER TRUE
6a70: 3a 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76  :.**   To resolv
6a80: 65 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69  e a conflict, fi
6a90: 72 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20  rst look to see 
6aa0: 69 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e  if either action
6ab0: 0a 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65  .**   is on an e
6ac0: 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74  rror rule.  In t
6ad0: 68 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74  hat case, take t
6ae0: 68 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a  he action which.
6af0: 2a 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f  **   is not asso
6b00: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
6b10: 65 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20  error rule.  If 
6b20: 6e 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a  neither or both.
6b30: 2a 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65  **   actions are
6b40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6b50: 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20   an error rule, 
6b60: 74 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20  then try to.**  
6b70: 20 75 73 65 20 70 72 65 63 65 64 65 6e 63 65 20   use precedence 
6b80: 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63  to resolve the c
6b90: 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49  onflict..**.** I
6ba0: 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20  f either action 
6bb0: 69 73 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e  is a SHIFT, then
6bc0: 20 69 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e   it must be apx.
6bd0: 20 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69    This.** functi
6be0: 6f 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66  on won't work if
6bf0: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apx->type==REDU
6c00: 43 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65  CE and apy->type
6c10: 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74  ==SHIFT..*/.stat
6c20: 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63  ic int resolve_c
6c30: 6f 6e 66 6c 69 63 74 28 61 70 78 2c 61 70 79 2c  onflict(apx,apy,
6c40: 65 72 72 73 79 6d 29 0a 73 74 72 75 63 74 20 61  errsym).struct a
6c50: 63 74 69 6f 6e 20 2a 61 70 78 3b 0a 73 74 72 75  ction *apx;.stru
6c60: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 79 3b 0a  ct action *apy;.
6c70: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65  struct symbol *e
6c80: 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20  rrsym;   /* The 
6c90: 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 28 69 66  error symbol (if
6ca0: 20 64 65 66 69 6e 65 64 2e 20 20 4e 55 4c 4c 20   defined.  NULL 
6cb0: 6f 74 68 65 72 77 69 73 65 29 20 2a 2f 0a 7b 0a  otherwise) */.{.
6cc0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
6cd0: 2a 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e  *spx, *spy;.  in
6ce0: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
6cf0: 61 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d  assert( apx->sp=
6d00: 3d 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20  =apy->sp );  /* 
6d10: 4f 74 68 65 72 77 69 73 65 20 74 68 65 72 65 20  Otherwise there 
6d20: 77 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66  would be no conf
6d30: 6c 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70  lict */.  if( ap
6d40: 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26  x->type==SHIFT &
6d50: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44  & apy->type==RED
6d60: 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d  UCE ){.    spx =
6d70: 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20 73 70   apx->sp;.    sp
6d80: 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70  y = apy->x.rp->p
6d90: 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20  recsym;.    if( 
6da0: 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70  spy==0 || spx->p
6db0: 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e 70 72  rec<0 || spy->pr
6dc0: 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ec<0 ){.      /*
6dd0: 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72 65 63   Not enough prec
6de0: 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  edence informati
6df0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  on. */.      apy
6e00: 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46 4c 49 43  ->type = CONFLIC
6e10: 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b  T;.      errcnt+
6e20: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
6e30: 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e   spx->prec>spy->
6e40: 70 72 65 63 20 29 7b 20 20 20 20 2f 2a 20 4c 6f  prec ){    /* Lo
6e50: 77 65 72 20 70 72 65 63 65 64 65 6e 63 65 20 77  wer precedence w
6e60: 69 6e 73 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  ins */.      apy
6e70: 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f  ->type = RD_RESO
6e80: 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20  LVED;.    }else 
6e90: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70  if( spx->prec<sp
6ea0: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
6eb0: 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f   apx->type = SH_
6ec0: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
6ed0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
6ee0: 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20  c==spy->prec && 
6ef0: 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48  spx->assoc==RIGH
6f00: 54 20 29 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72  T ){ /* Use oper
6f10: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 61 70  ator */.      ap
6f20: 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53  y->type = RD_RES
6f30: 4f 4c 56 45 44 3b 20 20 20 20 20 20 20 20 20 20  OLVED;          
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f50: 20 20 20 2f 2a 20 61 73 73 6f 63 69 61 74 69 76     /* associativ
6f60: 69 74 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ity */.    }else
6f70: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d   if( spx->prec==
6f80: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
6f90: 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b  ->assoc==LEFT ){
6fa0: 20 20 2f 2a 20 74 6f 20 62 72 65 61 6b 20 74 69    /* to break ti
6fb0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e  e */.      apx->
6fc0: 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56  type = SH_RESOLV
6fd0: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ED;.    }else{. 
6fe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 70 78       assert( spx
6ff0: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
7000: 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d  c && spx->assoc=
7010: 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 61  =NONE );.      a
7020: 70 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46 4c  py->type = CONFL
7030: 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e  ICT;.      errcn
7040: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  t++;.    }.  }el
7050: 73 65 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65  se if( apx->type
7060: 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 79 2d  ==REDUCE && apy-
7070: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b  >type==REDUCE ){
7080: 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e  .    spx = apx->
7090: 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20  x.rp->precsym;. 
70a0: 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e     spy = apy->x.
70b0: 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20  rp->precsym;.   
70c0: 20 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20 73   if( spx==0 || s
70d0: 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72  py==0 || spx->pr
70e0: 65 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79 2d  ec<0 ||.    spy-
70f0: 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d 3e  >prec<0 || spx->
7100: 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20  prec==spy->prec 
7110: 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ){.      apy->ty
7120: 70 65 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20  pe = CONFLICT;. 
7130: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
7140: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
7150: 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63  ->prec>spy->prec
7160: 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ){.      apy->t
7170: 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45  ype = RD_RESOLVE
7180: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
7190: 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e   spx->prec<spy->
71a0: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
71b0: 78 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53  x->type = RD_RES
71c0: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  OLVED;.    }.  }
71d0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
71e0: 28 20 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ( .      apx->ty
71f0: 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20  pe==SH_RESOLVED 
7200: 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ||.      apx->ty
7210: 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20  pe==RD_RESOLVED 
7220: 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ||.      apx->ty
7230: 70 65 3d 3d 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a  pe==CONFLICT ||.
7240: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d        apy->type=
7250: 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a  =SH_RESOLVED ||.
7260: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d        apy->type=
7270: 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a  =RD_RESOLVED ||.
7280: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d        apy->type=
7290: 3d 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29 3b  =CONFLICT.    );
72a0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 52 45 44 55  .    /* The REDU
72b0: 43 45 2f 53 48 49 46 54 20 63 61 73 65 20 63 61  CE/SHIFT case ca
72c0: 6e 6e 6f 74 20 68 61 70 70 65 6e 20 62 65 63 61  nnot happen beca
72d0: 75 73 65 20 53 48 49 46 54 73 20 63 6f 6d 65 20  use SHIFTs come 
72e0: 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52 45  before.    ** RE
72f0: 44 55 43 45 73 20 6f 6e 20 74 68 65 20 6c 69 73  DUCEs on the lis
7300: 74 2e 20 20 49 66 20 77 65 20 72 65 61 63 68 20  t.  If we reach 
7310: 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 75  this point it mu
7320: 73 74 20 62 65 20 62 65 63 61 75 73 65 0a 20 20  st be because.  
7330: 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 72 20    ** the parser 
7340: 63 6f 6e 66 6c 69 63 74 20 68 61 64 20 61 6c 72  conflict had alr
7350: 65 61 64 79 20 62 65 65 6e 20 72 65 73 6f 6c 76  eady been resolv
7360: 65 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  ed. */.  }.  ret
7370: 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a  urn errcnt;.}./*
7380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7390: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
73a0: 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63  le "configlist.c
73b0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
73c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
73d0: 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 70  ** Routines to p
73e0: 72 6f 63 65 73 73 69 6e 67 20 61 20 63 6f 6e 66  rocessing a conf
73f0: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  iguration list a
7400: 6e 64 20 62 75 69 6c 64 69 6e 67 20 61 20 73 74  nd building a st
7410: 61 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45  ate.** in the LE
7420: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
7430: 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ator..*/..static
7440: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
7450: 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 20 20 20  freelist = 0;   
7460: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72     /* List of fr
7470: 65 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ee configuration
7480: 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  s */.static stru
7490: 63 74 20 63 6f 6e 66 69 67 20 2a 63 75 72 72 65  ct config *curre
74a0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nt = 0;       /*
74b0: 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20   Top of list of 
74c0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
74d0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
74e0: 63 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e 74  config **current
74f0: 65 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61  end = 0;   /* La
7500: 73 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f  st on list of co
7510: 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20  nfigs */.static 
7520: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
7530: 61 73 69 73 20 3d 20 30 3b 20 20 20 20 20 20 20  asis = 0;       
7540: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74    /* Top of list
7550: 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67   of basis config
7560: 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  s */.static stru
7570: 63 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69  ct config **basi
7580: 73 65 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a  send = 0;     /*
7590: 20 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66 20   End of list of 
75a0: 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f  basis configs */
75b0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
75c0: 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
75d0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a  onfiguration */.
75e0: 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20 63  PRIVATE struct c
75f0: 6f 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67  onfig *newconfig
7600: 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  (){.  struct con
7610: 66 69 67 20 2a 6e 65 77 3b 0a 20 20 69 66 28 20  fig *new;.  if( 
7620: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
7630: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
7640: 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20 66  t amt = 3;.    f
7650: 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
7660: 74 20 63 6f 6e 66 69 67 20 2a 29 6d 61 6c 6c 6f  t config *)mallo
7670: 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
7680: 20 63 6f 6e 66 69 67 29 2a 61 6d 74 20 29 3b 0a   config)*amt );.
7690: 20 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74      if( freelist
76a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
76b0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61  intf(stderr,"Una
76c0: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
76d0: 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77  memory for a new
76e0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22   configuration."
76f0: 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  );.      exit(1)
7700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
7710: 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b  i=0; i<amt-1; i+
7720: 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e  +) freelist[i].n
7730: 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b  ext = &freelist[
7740: 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69  i+1];.    freeli
7750: 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d  st[amt-1].next =
7760: 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20   0;.  }.  new = 
7770: 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65  freelist;.  free
7780: 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d  list = freelist-
7790: 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
77a0: 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  new;.}../* The c
77b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 6f 6c  onfiguration "ol
77c0: 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  d" is no longer 
77d0: 75 73 65 64 20 2a 2f 0a 50 52 49 56 41 54 45 20  used */.PRIVATE 
77e0: 76 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e 66 69  void deleteconfi
77f0: 67 28 6f 6c 64 29 0a 73 74 72 75 63 74 20 63 6f  g(old).struct co
7800: 6e 66 69 67 20 2a 6f 6c 64 3b 0a 7b 0a 20 20 6f  nfig *old;.{.  o
7810: 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c  ld->next = freel
7820: 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20  ist;.  freelist 
7830: 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69  = old;.}../* Ini
7840: 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e  tialized the con
7850: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
7860: 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20  builder */.void 
7870: 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28  Configlist_init(
7880: 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30  ){.  current = 0
7890: 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d  ;.  currentend =
78a0: 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73   &current;.  bas
78b0: 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65  is = 0;.  basise
78c0: 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43  nd = &basis;.  C
78d0: 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28  onfigtable_init(
78e0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
78f0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74  /* Initialized t
7900: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
7910: 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f   list builder */
7920: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
7930: 5f 72 65 73 65 74 28 29 7b 0a 20 20 63 75 72 72  _reset(){.  curr
7940: 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65  ent = 0;.  curre
7950: 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74  ntend = &current
7960: 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20  ;.  basis = 0;. 
7970: 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73   basisend = &bas
7980: 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c  is;.  Configtabl
7990: 65 5f 63 6c 65 61 72 28 30 29 3b 0a 20 20 72 65  e_clear(0);.  re
79a0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  turn;.}../* Add 
79b0: 61 6e 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72  another configur
79c0: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e  ation to the con
79d0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
79e0: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
79f0: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
7a00: 28 72 70 2c 64 6f 74 29 0a 73 74 72 75 63 74 20  (rp,dot).struct 
7a10: 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 2f 2a 20  rule *rp;    /* 
7a20: 54 68 65 20 72 75 6c 65 20 2a 2f 0a 69 6e 74 20  The rule */.int 
7a30: 64 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  dot;            
7a40: 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
7a50: 65 20 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c  e RHS of the rul
7a60: 65 20 77 68 65 72 65 20 74 68 65 20 64 6f 74 20  e where the dot 
7a70: 67 6f 65 73 20 2a 2f 0a 7b 0a 20 20 73 74 72 75  goes */.{.  stru
7a80: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20  ct config *cfp, 
7a90: 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74  model;..  assert
7aa0: 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20  ( currentend!=0 
7ab0: 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20  );.  model.rp = 
7ac0: 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20  rp;.  model.dot 
7ad0: 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43  = dot;.  cfp = C
7ae0: 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28  onfigtable_find(
7af0: 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63  &model);.  if( c
7b00: 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70  fp==0 ){.    cfp
7b10: 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a   = newconfig();.
7b20: 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70      cfp->rp = rp
7b30: 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d  ;.    cfp->dot =
7b40: 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66   dot;.    cfp->f
7b50: 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20  ws = SetNew();. 
7b60: 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b     cfp->stp = 0;
7b70: 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d  .    cfp->fplp =
7b80: 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a   cfp->bplp = 0;.
7b90: 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20      cfp->next = 
7ba0: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d  0;.    cfp->bp =
7bb0: 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74   0;.    *current
7bc0: 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63  end = cfp;.    c
7bd0: 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70  urrentend = &cfp
7be0: 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f 6e 66  ->next;.    Conf
7bf0: 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63  igtable_insert(c
7c00: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
7c10: 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  n cfp;.}../* Add
7c20: 20 61 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75   a basis configu
7c30: 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f  ration to the co
7c40: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
7c50: 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69   */.struct confi
7c60: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  g *Configlist_ad
7c70: 64 62 61 73 69 73 28 72 70 2c 64 6f 74 29 0a 73  dbasis(rp,dot).s
7c80: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
7c90: 69 6e 74 20 64 6f 74 3b 0a 7b 0a 20 20 73 74 72  int dot;.{.  str
7ca0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c  uct config *cfp,
7cb0: 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72   model;..  asser
7cc0: 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30 20 29  t( basisend!=0 )
7cd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72  ;.  assert( curr
7ce0: 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d  entend!=0 );.  m
7cf0: 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20  odel.rp = rp;.  
7d00: 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b  model.dot = dot;
7d10: 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74  .  cfp = Configt
7d20: 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c  able_find(&model
7d30: 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20  );.  if( cfp==0 
7d40: 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77  ){.    cfp = new
7d50: 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66  config();.    cf
7d60: 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20  p->rp = rp;.    
7d70: 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a  cfp->dot = dot;.
7d80: 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53      cfp->fws = S
7d90: 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70  etNew();.    cfp
7da0: 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63  ->stp = 0;.    c
7db0: 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e  fp->fplp = cfp->
7dc0: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  bplp = 0;.    cf
7dd0: 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20  p->next = 0;.   
7de0: 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20   cfp->bp = 0;.  
7df0: 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20    *currentend = 
7e00: 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74  cfp;.    current
7e10: 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74  end = &cfp->next
7e20: 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e 64 20  ;.    *basisend 
7e30: 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73 69 73  = cfp;.    basis
7e40: 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70 3b 0a  end = &cfp->bp;.
7e50: 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f      Configtable_
7e60: 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d  insert(cfp);.  }
7e70: 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d  .  return cfp;.}
7e80: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  ../* Compute the
7e90: 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68 65 20   closure of the 
7ea0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
7eb0: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
7ec0: 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65  glist_closure(le
7ed0: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
7ee0: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
7ef0: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20  ct config *cfp, 
7f00: 2a 6e 65 77 63 66 70 3b 0a 20 20 73 74 72 75 63  *newcfp;.  struc
7f10: 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77  t rule *rp, *new
7f20: 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  rp;.  struct sym
7f30: 62 6f 6c 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20  bol *sp, *xsp;. 
7f40: 20 69 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20   int i, dot;..  
7f50: 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65  assert( currente
7f60: 6e 64 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63  nd!=0 );.  for(c
7f70: 66 70 3d 63 75 72 72 65 6e 74 3b 20 63 66 70 3b  fp=current; cfp;
7f80: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
7f90: 0a 20 20 20 20 72 70 20 3d 20 63 66 70 2d 3e 72  .    rp = cfp->r
7fa0: 70 3b 0a 20 20 20 20 64 6f 74 20 3d 20 63 66 70  p;.    dot = cfp
7fb0: 2d 3e 64 6f 74 3b 0a 20 20 20 20 69 66 28 20 64  ->dot;.    if( d
7fc0: 6f 74 3e 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63  ot>=rp->nrhs ) c
7fd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 70 20  ontinue;.    sp 
7fe0: 3d 20 72 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a  = rp->rhs[dot];.
7ff0: 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
8000: 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b  ==NONTERMINAL ){
8010: 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 72  .      if( sp->r
8020: 75 6c 65 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65  ule==0 && sp!=le
8030: 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20  mp->errsym ){.  
8040: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
8050: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
8060: 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69  ->line,"Nontermi
8070: 6e 61 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 6e  nal \"%s\" has n
8080: 6f 20 72 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20  o rules.",.     
8090: 20 20 20 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a       sp->name);.
80a0: 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72          lemp->er
80b0: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
80c0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 65 77 72  }.      for(newr
80d0: 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72  p=sp->rule; newr
80e0: 70 3b 20 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e  p; newrp=newrp->
80f0: 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 20 20  nextlhs){.      
8100: 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69    newcfp = Confi
8110: 67 6c 69 73 74 5f 61 64 64 28 6e 65 77 72 70 2c  glist_add(newrp,
8120: 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  0);.        for(
8130: 69 3d 64 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e  i=dot+1; i<rp->n
8140: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
8150: 20 20 20 20 20 78 73 70 20 3d 20 72 70 2d 3e 72       xsp = rp->r
8160: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
8170: 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d   if( xsp->type==
8180: 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
8190: 20 20 20 20 20 20 20 20 53 65 74 41 64 64 28 6e          SetAdd(n
81a0: 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e  ewcfp->fws,xsp->
81b0: 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
81c0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 20 20 7d 65      break;..  }e
81d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
81e0: 20 53 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70   SetUnion(newcfp
81f0: 2d 3e 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74  ->fws,xsp->first
8200: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  set);.          
8210: 20 20 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64    if( xsp->lambd
8220: 61 3d 3d 46 41 4c 53 45 20 29 20 62 72 65 61 6b  a==FALSE ) break
8230: 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20  ;..  }..}.      
8240: 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
8250: 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28 26 63  s ) Plink_add(&c
8260: 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66 70 29  fp->fplp,newcfp)
8270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
8290: 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e  ./* Sort the con
82a0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
82b0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
82c0: 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63 75 72  st_sort(){.  cur
82d0: 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74 20 63  rent = (struct c
82e0: 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 63 75  onfig *)msort(cu
82f0: 72 72 65 6e 74 2c 26 28 63 75 72 72 65 6e 74 2d  rrent,&(current-
8300: 3e 6e 65 78 74 29 2c 43 6f 6e 66 69 67 63 6d 70  >next),Configcmp
8310: 29 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20  );.  currentend 
8320: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
8330: 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 62 61  ../* Sort the ba
8340: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
8350: 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43  n list */.void C
8360: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61  onfiglist_sortba
8370: 73 69 73 28 29 7b 0a 20 20 62 61 73 69 73 20 3d  sis(){.  basis =
8380: 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20   (struct config 
8390: 2a 29 6d 73 6f 72 74 28 63 75 72 72 65 6e 74 2c  *)msort(current,
83a0: 26 28 63 75 72 72 65 6e 74 2d 3e 62 70 29 2c 43  &(current->bp),C
83b0: 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 62 61 73  onfigcmp);.  bas
83c0: 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74  isend = 0;.  ret
83d0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  urn;.}../* Retur
83e0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
83f0: 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 63  he head of the c
8400: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
8410: 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74  t and.** reset t
8420: 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  he list */.struc
8430: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
8440: 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 7b 0a 20  list_return(){. 
8450: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
8460: 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72  old;.  old = cur
8470: 72 65 6e 74 3b 0a 20 20 63 75 72 72 65 6e 74 20  rent;.  current 
8480: 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  = 0;.  currenten
8490: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
84a0: 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  old;.}../* Retur
84b0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
84c0: 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 63  he head of the c
84d0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
84e0: 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74  t and.** reset t
84f0: 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  he list */.struc
8500: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
8510: 6c 69 73 74 5f 62 61 73 69 73 28 29 7b 0a 20 20  list_basis(){.  
8520: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f  struct config *o
8530: 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69  ld;.  old = basi
8540: 73 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a  s;.  basis = 0;.
8550: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a    basisend = 0;.
8560: 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a    return old;.}.
8570: 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65 6c 65  ./* Free all ele
8580: 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76  ments of the giv
8590: 65 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  en configuration
85a0: 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f   list */.void Co
85b0: 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 63 66 70  nfiglist_eat(cfp
85c0: 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
85d0: 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  *cfp;.{.  struct
85e0: 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74 63 66 70   config *nextcfp
85f0: 3b 0a 20 20 66 6f 72 28 3b 20 63 66 70 3b 20 63  ;.  for(; cfp; c
8600: 66 70 3d 6e 65 78 74 63 66 70 29 7b 0a 20 20 20  fp=nextcfp){.   
8610: 20 6e 65 78 74 63 66 70 20 3d 20 63 66 70 2d 3e   nextcfp = cfp->
8620: 6e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74  next;.    assert
8630: 28 20 63 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29  ( cfp->fplp==0 )
8640: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 66  ;.    assert( cf
8650: 70 2d 3e 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20  p->bplp==0 );.  
8660: 20 20 69 66 28 20 63 66 70 2d 3e 66 77 73 20 29    if( cfp->fws )
8670: 20 53 65 74 46 72 65 65 28 63 66 70 2d 3e 66 77   SetFree(cfp->fw
8680: 73 29 3b 0a 20 20 20 20 64 65 6c 65 74 65 63 6f  s);.    deleteco
8690: 6e 66 69 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20  nfig(cfp);.  }. 
86a0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a   return;.}./****
86b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
86c0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72 72  om the file "err
86d0: 6f 72 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  or.c" **********
86e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
86f0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43  *******/./*.** C
8700: 6f 64 65 20 66 6f 72 20 70 72 69 6e 74 69 6e 67  ode for printing
8710: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
8720: 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 67 6f  */../* Find a go
8730: 6f 64 20 70 6c 61 63 65 20 74 6f 20 62 72 65 61  od place to brea
8740: 6b 20 22 6d 73 67 22 20 73 6f 20 74 68 61 74 20  k "msg" so that 
8750: 69 74 73 20 6c 65 6e 67 74 68 20 69 73 20 61 74  its length is at
8760: 20 6c 65 61 73 74 20 22 6d 69 6e 22 0a 2a 2a 20   least "min".** 
8770: 62 75 74 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  but no more than
8780: 20 22 6d 61 78 22 2e 20 20 4d 61 6b 65 20 74 68   "max".  Make th
8790: 65 20 70 6f 69 6e 74 20 61 73 20 63 6c 6f 73 65  e point as close
87a0: 20 74 6f 20 6d 61 78 20 61 73 20 70 6f 73 73 69   to max as possi
87b0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
87c0: 6e 74 20 66 69 6e 64 62 72 65 61 6b 28 6d 73 67  nt findbreak(msg
87d0: 2c 6d 69 6e 2c 6d 61 78 29 0a 63 68 61 72 20 2a  ,min,max).char *
87e0: 6d 73 67 3b 0a 69 6e 74 20 6d 69 6e 3b 0a 69 6e  msg;.int min;.in
87f0: 74 20 6d 61 78 3b 0a 7b 0a 20 20 69 6e 74 20 69  t max;.{.  int i
8800: 2c 73 70 6f 74 3b 0a 20 20 63 68 61 72 20 63 3b  ,spot;.  char c;
8810: 0a 20 20 66 6f 72 28 69 3d 73 70 6f 74 3d 6d 69  .  for(i=spot=mi
8820: 6e 3b 20 69 3c 3d 6d 61 78 3b 20 69 2b 2b 29 7b  n; i<=max; i++){
8830: 0a 20 20 20 20 63 20 3d 20 6d 73 67 5b 69 5d 3b  .    c = msg[i];
8840: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 74 27  .    if( c=='\t'
8850: 20 29 20 6d 73 67 5b 69 5d 20 3d 20 27 20 27 3b   ) msg[i] = ' ';
8860: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27  .    if( c=='\n'
8870: 20 29 7b 20 6d 73 67 5b 69 5d 20 3d 20 27 20 27   ){ msg[i] = ' '
8880: 3b 20 73 70 6f 74 20 3d 20 69 3b 20 62 72 65 61  ; spot = i; brea
8890: 6b 3b 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d  k; }.    if( c==
88a0: 30 20 29 7b 20 73 70 6f 74 20 3d 20 69 3b 20 62  0 ){ spot = i; b
88b0: 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69 66 28 20  reak; }.    if( 
88c0: 63 3d 3d 27 2d 27 20 26 26 20 69 3c 6d 61 78 2d  c=='-' && i<max-
88d0: 31 20 29 20 73 70 6f 74 20 3d 20 69 2b 31 3b 0a  1 ) spot = i+1;.
88e0: 20 20 20 20 69 66 28 20 63 3d 3d 27 20 27 20 29      if( c==' ' )
88f0: 20 73 70 6f 74 20 3d 20 69 3b 0a 20 20 7d 0a 20   spot = i;.  }. 
8900: 20 72 65 74 75 72 6e 20 73 70 6f 74 3b 0a 7d 0a   return spot;.}.
8910: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 72 72 6f 72  ./*.** The error
8920: 20 6d 65 73 73 61 67 65 20 69 73 20 73 70 6c 69   message is spli
8930: 74 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c  t across multipl
8940: 65 20 6c 69 6e 65 73 20 69 66 20 6e 65 63 65 73  e lines if neces
8950: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 73 70  sary.  The.** sp
8960: 6c 69 74 73 20 6f 63 63 75 72 20 61 74 20 61 20  lits occur at a 
8970: 73 70 61 63 65 2c 20 69 66 20 74 68 65 72 65 20  space, if there 
8980: 69 73 20 61 20 73 70 61 63 65 20 61 76 61 69 6c  is a space avail
8990: 61 62 6c 65 20 6e 65 61 72 20 74 68 65 20 65 6e  able near the en
89a0: 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6c 69 6e 65  d.** of the line
89b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 45 52 52  ..*/.#define ERR
89c0: 4d 53 47 53 49 5a 45 20 20 31 30 30 30 30 20 2f  MSGSIZE  10000 /
89d0: 2a 20 48 6f 70 65 20 74 68 69 73 20 69 73 20 62  * Hope this is b
89e0: 69 67 20 65 6e 6f 75 67 68 2e 20 20 4e 6f 20 77  ig enough.  No w
89f0: 61 79 20 74 6f 20 65 72 72 6f 72 20 63 68 65 63  ay to error chec
8a00: 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 4e  k */.#define LIN
8a10: 45 57 49 44 54 48 20 20 20 20 20 20 37 39 20 2f  EWIDTH      79 /
8a20: 2a 20 4d 61 78 20 77 69 64 74 68 20 6f 66 20 61  * Max width of a
8a30: 6e 79 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 2a  ny output line *
8a40: 2f 0a 23 64 65 66 69 6e 65 20 50 52 45 46 49 58  /.#define PREFIX
8a50: 4c 49 4d 49 54 20 20 20 20 33 30 20 2f 2a 20 4d  LIMIT    30 /* M
8a60: 61 78 20 77 69 64 74 68 20 6f 66 20 74 68 65 20  ax width of the 
8a70: 70 72 65 66 69 78 20 6f 6e 20 65 61 63 68 20 6c  prefix on each l
8a80: 69 6e 65 20 2a 2f 0a 76 6f 69 64 20 45 72 72 6f  ine */.void Erro
8a90: 72 4d 73 67 28 76 61 5f 61 6c 69 73 74 29 0a 76  rMsg(va_alist).v
8aa0: 61 5f 64 63 6c 0a 7b 0a 20 20 63 68 61 72 20 2a  a_dcl.{.  char *
8ab0: 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  filename;.  int 
8ac0: 6c 69 6e 65 6e 6f 3b 0a 20 20 63 68 61 72 20 2a  lineno;.  char *
8ad0: 66 6f 72 6d 61 74 3b 0a 20 20 63 68 61 72 20 65  format;.  char e
8ae0: 72 72 6d 73 67 5b 45 52 52 4d 53 47 53 49 5a 45  rrmsg[ERRMSGSIZE
8af0: 5d 3b 0a 20 20 63 68 61 72 20 70 72 65 66 69 78  ];.  char prefix
8b00: 5b 50 52 45 46 49 58 4c 49 4d 49 54 2b 31 30 5d  [PREFIXLIMIT+10]
8b10: 3b 0a 20 20 69 6e 74 20 65 72 72 6d 73 67 73 69  ;.  int errmsgsi
8b20: 7a 65 3b 0a 20 20 69 6e 74 20 70 72 65 66 69 78  ze;.  int prefix
8b30: 73 69 7a 65 3b 0a 20 20 69 6e 74 20 61 76 61 69  size;.  int avai
8b40: 6c 61 62 6c 65 77 69 64 74 68 3b 0a 20 20 76 61  lablewidth;.  va
8b50: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
8b60: 65 6e 64 2c 20 72 65 73 74 61 72 74 2c 20 62 61  end, restart, ba
8b70: 73 65 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28  se;..  va_start(
8b80: 61 70 29 3b 0a 20 20 66 69 6c 65 6e 61 6d 65 20  ap);.  filename 
8b90: 3d 20 76 61 5f 61 72 67 28 61 70 2c 63 68 61 72  = va_arg(ap,char
8ba0: 2a 29 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 76  *);.  lineno = v
8bb0: 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
8bc0: 20 66 6f 72 6d 61 74 20 3d 20 76 61 5f 61 72 67   format = va_arg
8bd0: 28 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 2f 2a  (ap,char*);.  /*
8be0: 20 50 72 65 70 61 72 65 20 61 20 70 72 65 66 69   Prepare a prefi
8bf0: 78 20 74 6f 20 62 65 20 70 72 65 70 65 6e 64 65  x to be prepende
8c00: 64 20 74 6f 20 65 76 65 72 79 20 6f 75 74 70 75  d to every outpu
8c10: 74 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20  t line */.  if( 
8c20: 6c 69 6e 65 6e 6f 3e 30 20 29 7b 0a 20 20 20 20  lineno>0 ){.    
8c30: 73 70 72 69 6e 74 66 28 70 72 65 66 69 78 2c 22  sprintf(prefix,"
8c40: 25 2e 2a 73 3a 25 64 3a 20 22 2c 50 52 45 46 49  %.*s:%d: ",PREFI
8c50: 58 4c 49 4d 49 54 2d 31 30 2c 66 69 6c 65 6e 61  XLIMIT-10,filena
8c60: 6d 65 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 65  me,lineno);.  }e
8c70: 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  lse{.    sprintf
8c80: 28 70 72 65 66 69 78 2c 22 25 2e 2a 73 3a 20 22  (prefix,"%.*s: "
8c90: 2c 50 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c  ,PREFIXLIMIT-10,
8ca0: 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  filename);.  }. 
8cb0: 20 70 72 65 66 69 78 73 69 7a 65 20 3d 20 73 74   prefixsize = st
8cc0: 72 6c 65 6e 28 70 72 65 66 69 78 29 3b 0a 20 20  rlen(prefix);.  
8cd0: 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68 20 3d  availablewidth =
8ce0: 20 4c 49 4e 45 57 49 44 54 48 20 2d 20 70 72 65   LINEWIDTH - pre
8cf0: 66 69 78 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 47  fixsize;..  /* G
8d00: 65 6e 65 72 61 74 65 20 74 68 65 20 65 72 72 6f  enerate the erro
8d10: 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 76  r message */.  v
8d20: 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 66  sprintf(errmsg,f
8d30: 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f  ormat,ap);.  va_
8d40: 65 6e 64 28 61 70 29 3b 0a 20 20 65 72 72 6d 73  end(ap);.  errms
8d50: 67 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28 65  gsize = strlen(e
8d60: 72 72 6d 73 67 29 3b 0a 20 20 2f 2a 20 52 65 6d  rrmsg);.  /* Rem
8d70: 6f 76 65 20 74 72 61 69 6c 69 6e 67 20 27 5c 6e  ove trailing '\n
8d80: 27 73 20 66 72 6f 6d 20 74 68 65 20 65 72 72 6f  's from the erro
8d90: 72 20 6d 65 73 73 61 67 65 2e 20 2a 2f 0a 20 20  r message. */.  
8da0: 77 68 69 6c 65 28 20 65 72 72 6d 73 67 73 69 7a  while( errmsgsiz
8db0: 65 3e 30 20 26 26 20 65 72 72 6d 73 67 5b 65 72  e>0 && errmsg[er
8dc0: 72 6d 73 67 73 69 7a 65 2d 31 5d 3d 3d 27 5c 6e  rmsgsize-1]=='\n
8dd0: 27 20 29 7b 0a 20 20 20 20 20 65 72 72 6d 73 67  ' ){.     errmsg
8de0: 5b 2d 2d 65 72 72 6d 73 67 73 69 7a 65 5d 20 3d  [--errmsgsize] =
8df0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72   0;.  }..  /* Pr
8e00: 69 6e 74 20 74 68 65 20 65 72 72 6f 72 20 6d 65  int the error me
8e10: 73 73 61 67 65 20 2a 2f 0a 20 20 62 61 73 65 20  ssage */.  base 
8e20: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 65 72  = 0;.  while( er
8e30: 72 6d 73 67 5b 62 61 73 65 5d 21 3d 30 20 29 7b  rmsg[base]!=0 ){
8e40: 0a 20 20 20 20 65 6e 64 20 3d 20 72 65 73 74 61  .    end = resta
8e50: 72 74 20 3d 20 66 69 6e 64 62 72 65 61 6b 28 26  rt = findbreak(&
8e60: 65 72 72 6d 73 67 5b 62 61 73 65 5d 2c 30 2c 61  errmsg[base],0,a
8e70: 76 61 69 6c 61 62 6c 65 77 69 64 74 68 29 3b 0a  vailablewidth);.
8e80: 20 20 20 20 72 65 73 74 61 72 74 20 2b 3d 20 62      restart += b
8e90: 61 73 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ase;.    while( 
8ea0: 65 72 72 6d 73 67 5b 72 65 73 74 61 72 74 5d 3d  errmsg[restart]=
8eb0: 3d 27 20 27 20 29 20 72 65 73 74 61 72 74 2b 2b  =' ' ) restart++
8ec0: 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ;.    fprintf(st
8ed0: 64 6f 75 74 2c 22 25 73 25 2e 2a 73 5c 6e 22 2c  dout,"%s%.*s\n",
8ee0: 70 72 65 66 69 78 2c 65 6e 64 2c 26 65 72 72 6d  prefix,end,&errm
8ef0: 73 67 5b 62 61 73 65 5d 29 3b 0a 20 20 20 20 62  sg[base]);.    b
8f00: 61 73 65 20 3d 20 72 65 73 74 61 72 74 3b 0a 20  ase = restart;. 
8f10: 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
8f20: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
8f30: 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a  file "main.c" **
8f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70  **/./*.** Main p
8f70: 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72 20  rogram file for 
8f80: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
8f90: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
8fa0: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74  /* Report an out
8fb0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69  -of-memory condi
8fc0: 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20  tion and abort. 
8fd0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
8fe0: 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c 79  * is used mostly
8ff0: 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79 43   by the "MemoryC
9000: 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73  heck" macro in s
9010: 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20  truct.h.*/.void 
9020: 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a  memory_error(){.
9030: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
9040: 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
9050: 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22    Aborting...\n"
9060: 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a  );.  exit(1);.}.
9070: 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72  ../* The main pr
9080: 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68  ogram.  Parse th
9090: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61  e command line a
90a0: 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69  nd do it... */.i
90b0: 6e 74 20 6d 61 69 6e 28 61 72 67 63 2c 61 72 67  nt main(argc,arg
90c0: 76 29 0a 69 6e 74 20 61 72 67 63 3b 0a 63 68 61  v).int argc;.cha
90d0: 72 20 2a 2a 61 72 67 76 3b 0a 7b 0a 20 20 73 74  r **argv;.{.  st
90e0: 61 74 69 63 20 69 6e 74 20 76 65 72 73 69 6f 6e  atic int version
90f0: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
9100: 6e 74 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a 20  nt rpflag = 0;. 
9110: 20 73 74 61 74 69 63 20 69 6e 74 20 62 61 73 69   static int basi
9120: 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  sflag = 0;.  sta
9130: 74 69 63 20 69 6e 74 20 63 6f 6d 70 72 65 73 73  tic int compress
9140: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
9150: 6e 74 20 71 75 69 65 74 20 3d 20 30 3b 0a 20 20  nt quiet = 0;.  
9160: 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 69  static int stati
9170: 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 73 74 61  stics = 0;.  sta
9180: 74 69 63 20 69 6e 74 20 6d 68 66 6c 61 67 20 3d  tic int mhflag =
9190: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72   0;.  static str
91a0: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70  uct s_options op
91b0: 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  tions[] = {.    
91c0: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20  {OPT_FLAG, "b", 
91d0: 28 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61  (char*)&basisfla
91e0: 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74  g, "Print only t
91f0: 68 65 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f  he basis in repo
9200: 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  rt."},.    {OPT_
9210: 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72  FLAG, "c", (char
9220: 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f  *)&compress, "Do
9230: 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65  n't compress the
9240: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d   action table."}
9250: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
9260: 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72 70   "g", (char*)&rp
9270: 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72 61  flag, "Print gra
9280: 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63 74  mmar without act
9290: 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  ions."},.    {OP
92a0: 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68  T_FLAG, "m", (ch
92b0: 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75  ar*)&mhflag, "Ou
92c0: 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65  tput a makeheade
92d0: 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69  rs compatible fi
92e0: 6c 65 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  le"},.    {OPT_F
92f0: 4c 41 47 2c 20 22 71 22 2c 20 28 63 68 61 72 2a  LAG, "q", (char*
9300: 29 26 71 75 69 65 74 2c 20 22 28 51 75 69 65 74  )&quiet, "(Quiet
9310: 29 20 44 6f 6e 27 74 20 70 72 69 6e 74 20 74 68  ) Don't print th
9320: 65 20 72 65 70 6f 72 74 20 66 69 6c 65 2e 22 7d  e report file."}
9330: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
9340: 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74   "s", (char*)&st
9350: 61 74 69 73 74 69 63 73 2c 20 22 50 72 69 6e 74  atistics, "Print
9360: 20 70 61 72 73 65 72 20 73 74 61 74 73 20 74 6f   parser stats to
9370: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
9380: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
9390: 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a 29  AG, "x", (char*)
93a0: 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e 74  &version, "Print
93b0: 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
93c0: 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ber."},.    {OPT
93d0: 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a 20 20 7d  _FLAG,0,0,0}.  }
93e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
93f0: 75 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a 0a  uct lemon lem;..
9400: 20 20 4f 70 74 49 6e 69 74 28 61 72 67 76 2c 6f    OptInit(argv,o
9410: 70 74 69 6f 6e 73 2c 73 74 64 65 72 72 29 3b 0a  ptions,stderr);.
9420: 20 20 69 66 28 20 76 65 72 73 69 6f 6e 20 29 7b    if( version ){
9430: 0a 20 20 20 20 20 70 72 69 6e 74 66 28 22 4c 65  .     printf("Le
9440: 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 5c  mon version 1.0\
9450: 6e 22 29 3b 0a 20 20 20 20 20 65 78 69 74 28 30  n");.     exit(0
9460: 29 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 4f 70  ); .  }.  if( Op
9470: 74 4e 41 72 67 73 28 29 21 3d 31 20 29 7b 0a 20  tNArgs()!=1 ){. 
9480: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
9490: 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e 65 20 66  r,"Exactly one f
94a0: 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
94b0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 5c 6e 22   is required.\n"
94c0: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
94d0: 20 20 7d 0a 20 20 6c 65 6d 2e 65 72 72 6f 72 63    }.  lem.errorc
94e0: 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e  nt = 0;..  /* In
94f0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 63  itialize the mac
9500: 68 69 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61 66  hine */.  Strsaf
9510: 65 5f 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d 62  e_init();.  Symb
9520: 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74 61  ol_init();.  Sta
9530: 74 65 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65 6d  te_init();.  lem
9540: 2e 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d  .argv0 = argv[0]
9550: 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65  ;.  lem.filename
9560: 20 3d 20 4f 70 74 41 72 67 28 30 29 3b 0a 20 20   = OptArg(0);.  
9570: 6c 65 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d 20  lem.basisflag = 
9580: 62 61 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65 6d  basisflag;.  lem
9590: 2e 6e 63 6f 6e 66 6c 69 63 74 20 3d 20 30 3b 0a  .nconflict = 0;.
95a0: 20 20 6c 65 6d 2e 6e 61 6d 65 20 3d 20 6c 65 6d    lem.name = lem
95b0: 2e 69 6e 63 6c 75 64 65 20 3d 20 6c 65 6d 2e 61  .include = lem.a
95c0: 72 67 20 3d 20 6c 65 6d 2e 74 6f 6b 65 6e 74 79  rg = lem.tokenty
95d0: 70 65 20 3d 20 6c 65 6d 2e 73 74 61 72 74 20 3d  pe = lem.start =
95e0: 20 30 3b 0a 20 20 6c 65 6d 2e 76 61 72 74 79 70   0;.  lem.vartyp
95f0: 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 73 74 61  e = 0;.  lem.sta
9600: 63 6b 73 69 7a 65 20 3d 20 30 3b 0a 20 20 6c 65  cksize = 0;.  le
9610: 6d 2e 65 72 72 6f 72 20 3d 20 6c 65 6d 2e 6f 76  m.error = lem.ov
9620: 65 72 66 6c 6f 77 20 3d 20 6c 65 6d 2e 66 61 69  erflow = lem.fai
9630: 6c 75 72 65 20 3d 20 6c 65 6d 2e 61 63 63 65 70  lure = lem.accep
9640: 74 20 3d 20 6c 65 6d 2e 74 6f 6b 65 6e 64 65 73  t = lem.tokendes
9650: 74 20 3d 0a 20 20 20 20 20 6c 65 6d 2e 74 6f 6b  t =.     lem.tok
9660: 65 6e 70 72 65 66 69 78 20 3d 20 6c 65 6d 2e 6f  enprefix = lem.o
9670: 75 74 6e 61 6d 65 20 3d 20 6c 65 6d 2e 65 78 74  utname = lem.ext
9680: 72 61 63 6f 64 65 20 3d 20 30 3b 0a 20 20 6c 65  racode = 0;.  le
9690: 6d 2e 76 61 72 64 65 73 74 20 3d 20 30 3b 0a 20  m.vardest = 0;. 
96a0: 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 20 3d   lem.tablesize =
96b0: 20 30 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77   0;.  Symbol_new
96c0: 28 22 24 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72  ("$");.  lem.err
96d0: 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  sym = Symbol_new
96e0: 28 22 65 72 72 6f 72 22 29 3b 0a 0a 20 20 2f 2a  ("error");..  /*
96f0: 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74   Parse the input
9700: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65   file */.  Parse
9710: 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65  (&lem);.  if( le
9720: 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78 69  m.errorcnt ) exi
9730: 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b  t(lem.errorcnt);
9740: 0a 20 20 69 66 28 20 6c 65 6d 2e 72 75 6c 65 3d  .  if( lem.rule=
9750: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
9760: 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20  f(stderr,"Empty 
9770: 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20  grammar.\n");.  
9780: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a    exit(1);.  }..
9790: 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69    /* Count and i
97a0: 6e 64 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73  ndex the symbols
97b0: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
97c0: 2a 2f 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c  */.  lem.nsymbol
97d0: 20 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28   = Symbol_count(
97e0: 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  );.  Symbol_new(
97f0: 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20  "{default}");.  
9800: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79  lem.symbols = Sy
9810: 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a  mbol_arrayof();.
9820: 20 20 71 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62    qsort(lem.symb
9830: 6f 6c 73 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b  ols,lem.nsymbol+
9840: 31 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  1,sizeof(struct 
9850: 73 79 6d 62 6f 6c 2a 29 2c 0a 20 20 20 20 20 20  symbol*),.      
9860: 20 20 28 69 6e 74 28 2a 29 28 29 29 53 79 6d 62    (int(*)())Symb
9870: 6f 6c 63 6d 70 70 29 3b 0a 20 20 66 6f 72 28 69  olcmpp);.  for(i
9880: 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62  =0; i<=lem.nsymb
9890: 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d  ol; i++) lem.sym
98a0: 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d  bols[i]->index =
98b0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69   i;.  for(i=1; i
98c0: 73 75 70 70 65 72 28 6c 65 6d 2e 73 79 6d 62 6f  supper(lem.symbo
98d0: 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b  ls[i]->name[0]);
98e0: 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65   i++);.  lem.nte
98f0: 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f  rminal = i;..  /
9900: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70  * Generate a rep
9910: 72 69 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d  rint of the gram
9920: 6d 61 72 2c 20 69 66 20 72 65 71 75 65 73 74 65  mar, if requeste
9930: 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  d on the command
9940: 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72   line */.  if( r
9950: 70 66 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70  pflag ){.    Rep
9960: 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65  rint(&lem);.  }e
9970: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  lse{.    /* Init
9980: 69 61 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20  ialize the size 
9990: 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61  for all follow a
99a0: 6e 64 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f  nd first sets */
99b0: 0a 20 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d  .    SetSize(lem
99c0: 2e 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 0a 20 20  .nterminal);..  
99d0: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72    /* Find the pr
99e0: 65 63 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65  ecedence for eve
99f0: 72 79 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75  ry production ru
9a00: 6c 65 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65  le (that has one
9a10: 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c  ) */.    FindRul
9a20: 65 50 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65  ePrecedences(&le
9a30: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
9a40: 75 74 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e  ute the lambda-n
9a50: 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20  onterminals and 
9a60: 74 68 65 20 66 69 72 73 74 2d 73 65 74 73 20 66  the first-sets f
9a70: 6f 72 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20  or every.    ** 
9a80: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20  nonterminal */. 
9a90: 20 20 20 46 69 6e 64 46 69 72 73 74 53 65 74 73     FindFirstSets
9aa0: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
9ab0: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30  Compute all LR(0
9ac0: 29 20 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20  ) states.  Also 
9ad0: 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65  record follow-se
9ae0: 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20  t propagation.  
9af0: 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68    ** links so th
9b00: 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  at the follow-se
9b10: 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65  t can be compute
9b20: 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c  d later */.    l
9b30: 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20  em.nstate = 0;. 
9b40: 20 20 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c     FindStates(&l
9b50: 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72  em);.    lem.sor
9b60: 74 65 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61  ted = State_arra
9b70: 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  yof();..    /* T
9b80: 69 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73  ie up loose ends
9b90: 20 6f 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74   on the propagat
9ba0: 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20  ion links */.   
9bb0: 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29   FindLinks(&lem)
9bc0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
9bd0: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74  e the follow set
9be0: 20 6f 66 20 65 76 65 72 79 20 72 65 64 75 63 69   of every reduci
9bf0: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
9c00: 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c  n */.    FindFol
9c10: 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  lowSets(&lem);..
9c20: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
9c30: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73  he action tables
9c40: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69   */.    FindActi
9c50: 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ons(&lem);..    
9c60: 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20  /* Compress the 
9c70: 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f  action tables */
9c80: 0a 20 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73  .    if( compres
9c90: 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54  s==0 ) CompressT
9ca0: 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  ables(&lem);..  
9cb0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
9cc0: 72 65 70 6f 72 74 20 6f 66 20 74 68 65 20 70 61  report of the pa
9cd0: 72 73 65 72 20 67 65 6e 65 72 61 74 65 64 2e 20  rser generated. 
9ce0: 20 28 74 68 65 20 22 79 2e 6f 75 74 70 75 74 22   (the "y.output"
9cf0: 20 66 69 6c 65 29 20 2a 2f 0a 20 20 20 20 69 66   file) */.    if
9d00: 28 20 21 71 75 69 65 74 20 29 20 52 65 70 6f 72  ( !quiet ) Repor
9d10: 74 4f 75 74 70 75 74 28 26 6c 65 6d 29 3b 0a 0a  tOutput(&lem);..
9d20: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
9d30: 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20  the source code 
9d40: 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
9d50: 2f 0a 20 20 20 20 52 65 70 6f 72 74 54 61 62 6c  /.    ReportTabl
9d60: 65 28 26 6c 65 6d 2c 20 6d 68 66 6c 61 67 29 3b  e(&lem, mhflag);
9d70: 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 64 75 63 65  ..    /* Produce
9d80: 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20 66   a header file f
9d90: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 73 63  or use by the sc
9da0: 61 6e 6e 65 72 2e 20 20 28 54 68 69 73 20 73 74  anner.  (This st
9db0: 65 70 20 69 73 0a 20 20 20 20 2a 2a 20 6f 6d 69  ep is.    ** omi
9dc0: 74 74 65 64 20 69 66 20 74 68 65 20 22 2d 6d 22  tted if the "-m"
9dd0: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20   option is used 
9de0: 62 65 63 61 75 73 65 20 6d 61 6b 65 68 65 61 64  because makehead
9df0: 65 72 73 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ers will.    ** 
9e00: 67 65 6e 65 72 61 74 65 20 74 68 65 20 66 69 6c  generate the fil
9e10: 65 20 66 6f 72 20 75 73 2e 29 20 2a 2f 0a 20 20  e for us.) */.  
9e20: 20 20 69 66 28 20 21 6d 68 66 6c 61 67 20 29 20    if( !mhflag ) 
9e30: 52 65 70 6f 72 74 48 65 61 64 65 72 28 26 6c 65  ReportHeader(&le
9e40: 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  m);.  }.  if( st
9e50: 61 74 69 73 74 69 63 73 20 29 7b 0a 20 20 20 20  atistics ){.    
9e60: 70 72 69 6e 74 66 28 22 50 61 72 73 65 72 20 73  printf("Parser s
9e70: 74 61 74 69 73 74 69 63 73 3a 20 25 64 20 74 65  tatistics: %d te
9e80: 72 6d 69 6e 61 6c 73 2c 20 25 64 20 6e 6f 6e 74  rminals, %d nont
9e90: 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20 72 75 6c  erminals, %d rul
9ea0: 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d  es\n",.      lem
9eb0: 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e  .nterminal, lem.
9ec0: 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74  nsymbol - lem.nt
9ed0: 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75  erminal, lem.nru
9ee0: 6c 65 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28  le);.    printf(
9ef0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
9f00: 20 20 20 20 25 64 20 73 74 61 74 65 73 2c 20 25      %d states, %
9f10: 64 20 70 61 72 73 65 72 20 74 61 62 6c 65 20 65  d parser table e
9f20: 6e 74 72 69 65 73 2c 20 25 64 20 63 6f 6e 66 6c  ntries, %d confl
9f30: 69 63 74 73 5c 6e 22 2c 0a 20 20 20 20 20 20 6c  icts\n",.      l
9f40: 65 6d 2e 6e 73 74 61 74 65 2c 20 6c 65 6d 2e 74  em.nstate, lem.t
9f50: 61 62 6c 65 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63  ablesize, lem.nc
9f60: 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20  onflict);.  }.  
9f70: 69 66 28 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63  if( lem.nconflic
9f80: 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  t ){.    fprintf
9f90: 28 73 74 64 65 72 72 2c 22 25 64 20 70 61 72 73  (stderr,"%d pars
9fa0: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e  ing conflicts.\n
9fb0: 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  ",lem.nconflict)
9fc0: 3b 0a 20 20 7d 0a 20 20 65 78 69 74 28 6c 65 6d  ;.  }.  exit(lem
9fd0: 2e 65 72 72 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e  .errorcnt + lem.
9fe0: 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 7d 0a 2f 2a  nconflict);.}./*
9ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a000: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
a010: 65 20 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a  e "msort.c" ****
a020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
a040: 2a 2a 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72  ** A generic mer
a050: 67 65 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e  ge-sort program.
a060: 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a  .**.** USAGE:.**
a070: 20 4c 65 74 20 22 70 74 72 22 20 62 65 20 61 20   Let "ptr" be a 
a080: 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20  pointer to some 
a090: 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20  structure which 
a0a0: 69 73 20 61 74 20 74 68 65 20 68 65 61 64 20 6f  is at the head o
a0b0: 66 0a 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d  f.** a null-term
a0c0: 69 6e 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68  inated list.  Th
a0d0: 65 6e 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c  en to sort the l
a0e0: 69 73 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  ist call:.**.** 
a0f0: 20 20 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28      ptr = msort(
a100: 70 74 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29  ptr,&(ptr->next)
a110: 2c 63 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20  ,cmpfnc);.**.** 
a120: 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63  In the above, "c
a130: 6d 70 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e  mpfnc" is a poin
a140: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
a150: 6e 20 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73  n which compares
a160: 0a 2a 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65  .** two instance
a170: 73 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  s of the structu
a180: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  re and returns a
a190: 6e 20 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e  n integer, as in
a1a0: 0a 2a 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65  .** strcmp.  The
a1b0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
a1c0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
a1d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
a1e0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c  the.** second el
a1f0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e  ement of the lin
a200: 6b 65 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20  ked list.  This 
a210: 61 64 64 72 65 73 73 20 69 73 20 75 73 65 64 20  address is used 
a220: 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68  to compute.** th
a230: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
a240: 22 6e 65 78 74 22 20 66 69 65 6c 64 20 77 69 74  "next" field wit
a250: 68 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hin the structur
a260: 65 2e 20 20 54 68 65 20 6f 66 66 73 65 74 20 74  e.  The offset t
a270: 6f 0a 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20  o.** the "next" 
a280: 66 69 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f  field must be co
a290: 6e 73 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73  nstant for all s
a2a0: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
a2b0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
a2c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
a2d0: 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  s a new pointer 
a2e0: 77 68 69 63 68 20 69 73 20 74 68 65 20 68 65 61  which is the hea
a2f0: 64 20 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a  d of the list.**
a300: 20 61 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a   after sorting..
a310: 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a  **.** ALGORITHM:
a320: 0a 2a 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a  .** Merge-sort..
a330: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
a340: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
a350: 65 20 6e 65 78 74 20 73 74 72 75 63 74 75 72 65  e next structure
a360: 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
a370: 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ist..*/.#define 
a380: 4e 45 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a  NEXT(A) (*(char*
a390: 2a 29 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  *)(((unsigned lo
a3a0: 6e 67 29 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a  ng)A)+offset))..
a3b0: 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a  /*.** Inputs:.**
a3c0: 20 20 20 61 3a 20 20 20 20 20 20 20 41 20 73 6f     a:       A so
a3d0: 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69  rted, null-termi
a3e0: 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73  nated linked lis
a3f0: 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c  t.  (May be null
a400: 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20 20  )..**   b:      
a410: 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d   A sorted, null-
a420: 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65  terminated linke
a430: 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65  d list.  (May be
a440: 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70   null)..**   cmp
a450: 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65 72 20  :     A pointer 
a460: 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  to the compariso
a470: 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20  n function..**  
a480: 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73 65 74   offset:  Offset
a490: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
a4a0: 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20  e to the "next" 
a4b0: 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  field..**.** Ret
a4c0: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
a4d0: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
a4e0: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
a4f0: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
a500: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
a510: 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20 61 6e  *   of both a an
a520: 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20  d b..**.** Side 
a530: 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68  effects:.**   Th
a540: 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72  e "next" pointer
a550: 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69  s for elements i
a560: 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20 61 6e  n the lists a an
a570: 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63 68 61  d b are.**   cha
a580: 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
a590: 63 68 61 72 20 2a 6d 65 72 67 65 28 61 2c 62 2c  char *merge(a,b,
a5a0: 63 6d 70 2c 6f 66 66 73 65 74 29 0a 63 68 61 72  cmp,offset).char
a5b0: 20 2a 61 3b 0a 63 68 61 72 20 2a 62 3b 0a 69 6e   *a;.char *b;.in
a5c0: 74 20 28 2a 63 6d 70 29 28 29 3b 0a 69 6e 74 20  t (*cmp)();.int 
a5d0: 6f 66 66 73 65 74 3b 0a 7b 0a 20 20 63 68 61 72  offset;.{.  char
a5e0: 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20   *ptr, *head;.. 
a5f0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
a600: 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c   head = b;.  }el
a610: 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20  se if( b==0 ){. 
a620: 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d     head = a;.  }
a630: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 28 2a  else{.    if( (*
a640: 63 6d 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a 20  cmp)(a,b)<0 ){. 
a650: 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20       ptr = a;.  
a660: 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b      a = NEXT(a);
a670: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a680: 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20    ptr = b;.     
a690: 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20   b = NEXT(b);.  
a6a0: 20 20 7d 0a 20 20 20 20 68 65 61 64 20 3d 20 70    }.    head = p
a6b0: 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 61  tr;.    while( a
a6c0: 20 26 26 20 62 20 29 7b 0a 20 20 20 20 20 20 69   && b ){.      i
a6d0: 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 30  f( (*cmp)(a,b)<0
a6e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54   ){.        NEXT
a6f0: 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 20  (ptr) = a;.     
a700: 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20     ptr = a;.    
a710: 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b      a = NEXT(a);
a720: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a730: 20 20 20 20 20 20 4e 45 58 54 28 70 74 72 29 20        NEXT(ptr) 
a740: 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 70 74 72  = b;.        ptr
a750: 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62 20   = b;.        b 
a760: 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 20  = NEXT(b);.     
a770: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
a780: 20 61 20 29 20 4e 45 58 54 28 70 74 72 29 20 3d   a ) NEXT(ptr) =
a790: 20 61 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20   a;.    else    
a7a0: 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20  NEXT(ptr) = b;. 
a7b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 65 61 64   }.  return head
a7c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74  ;.}../*.** Input
a7d0: 73 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a 20 20 20  s:.**   list:   
a7e0: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20     Pointer to a 
a7f0: 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20 6c 69  singly-linked li
a800: 73 74 20 6f 66 20 73 74 72 75 63 74 75 72 65 73  st of structures
a810: 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a 20 20 20 20  ..**   next:    
a820: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69    Pointer to poi
a830: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 65 63 6f  nter to the seco
a840: 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  nd element of th
a850: 65 20 6c 69 73 74 2e 0a 2a 2a 20 20 20 63 6d 70  e list..**   cmp
a860: 3a 20 20 20 20 20 20 20 41 20 63 6f 6d 70 61 72  :       A compar
a870: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ison function..*
a880: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75  *.** Return Valu
a890: 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65  e:.**   A pointe
a8a0: 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
a8b0: 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63   a sorted list c
a8c0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c  ontaining the el
a8d0: 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 72 67 69  ements.**   orgi
a8e0: 6e 61 6c 6c 79 20 69 6e 20 6c 69 73 74 2e 0a 2a  nally in list..*
a8f0: 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65 63 74  *.** Side effect
a900: 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65 78  s:.**   The "nex
a910: 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f 72 20  t" pointers for 
a920: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73 74  elements in list
a930: 20 61 72 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f   are changed..*/
a940: 0a 23 64 65 66 69 6e 65 20 4c 49 53 54 53 49 5a  .#define LISTSIZ
a950: 45 20 33 30 0a 63 68 61 72 20 2a 6d 73 6f 72 74  E 30.char *msort
a960: 28 6c 69 73 74 2c 6e 65 78 74 2c 63 6d 70 29 0a  (list,next,cmp).
a970: 63 68 61 72 20 2a 6c 69 73 74 3b 0a 63 68 61 72  char *list;.char
a980: 20 2a 2a 6e 65 78 74 3b 0a 69 6e 74 20 28 2a 63   **next;.int (*c
a990: 6d 70 29 28 29 3b 0a 7b 0a 20 20 75 6e 73 69 67  mp)();.{.  unsig
a9a0: 6e 65 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ned long offset;
a9b0: 0a 20 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63  .  char *ep;.  c
a9c0: 68 61 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a  har *set[LISTSIZ
a9d0: 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f  E];.  int i;.  o
a9e0: 66 66 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65  ffset = (unsigne
a9f0: 64 20 6c 6f 6e 67 29 6e 65 78 74 20 2d 20 28 75  d long)next - (u
aa00: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6c 69 73  nsigned long)lis
aa10: 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
aa20: 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73  LISTSIZE; i++) s
aa30: 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69  et[i] = 0;.  whi
aa40: 6c 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20  le( list ){.    
aa50: 65 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c  ep = list;.    l
aa60: 69 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29  ist = NEXT(list)
aa70: 3b 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d  ;.    NEXT(ep) =
aa80: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
aa90: 20 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26   i<LISTSIZE-1 &&
aaa0: 20 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29   set[i]!=0; i++)
aab0: 7b 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72  {.      ep = mer
aac0: 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70  ge(ep,set[i],cmp
aad0: 2c 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  ,offset);.      
aae0: 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  set[i] = 0;.    
aaf0: 7d 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65  }.    set[i] = e
ab00: 70 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b  p;.  }.  ep = 0;
ab10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49  .  for(i=0; i<LI
ab20: 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28  STSIZE; i++) if(
ab30: 20 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d   set[i] ) ep = m
ab40: 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63  erge(ep,set[i],c
ab50: 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65  mp,offset);.  re
ab60: 74 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a  turn ep;.}./****
ab70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ab80: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
ab90: 6c 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a  le "option.c" **
aba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
abb0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63  ********/.static
abc0: 20 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74   char **argv;.st
abd0: 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70  atic struct s_op
abe0: 74 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69  tions *op;.stati
abf0: 63 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61  c FILE *errstrea
ac00: 6d 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50  m;..#define ISOP
ac10: 54 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d  T(X) ((X)[0]=='-
ac20: 27 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c  '||(X)[0]=='+'||
ac30: 73 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21  strchr((X),'=')!
ac40: 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  =0)../*.** Print
ac50: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
ac60: 65 20 77 69 74 68 20 61 20 63 61 72 72 6f 74 20  e with a carrot 
ac70: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
ac80: 6b 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a  k-th character.*
ac90: 2a 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69  * of the n-th fi
aca0: 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
acb0: 6f 69 64 20 65 72 72 6c 69 6e 65 28 6e 2c 6b 2c  oid errline(n,k,
acc0: 65 72 72 29 0a 69 6e 74 20 6e 3b 0a 69 6e 74 20  err).int n;.int 
acd0: 6b 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a  k;.FILE *err;.{.
ace0: 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a    int spcnt, i;.
acf0: 20 20 73 70 63 6e 74 20 3d 20 30 3b 0a 20 20 69    spcnt = 0;.  i
ad00: 66 28 20 61 72 67 76 5b 30 5d 20 29 20 66 70 72  f( argv[0] ) fpr
ad10: 69 6e 74 66 28 65 72 72 2c 22 25 73 22 2c 61 72  intf(err,"%s",ar
ad20: 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63 6e 74 20  gv[0]);.  spcnt 
ad30: 3d 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d  = strlen(argv[0]
ad40: 29 20 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31  ) + 1;.  for(i=1
ad50: 3b 20 69 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d  ; i<n && argv[i]
ad60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69  ; i++){.    fpri
ad70: 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72  ntf(err," %s",ar
ad80: 67 76 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e  gv[i]);.    spcn
ad90: 74 20 2b 3d 20 73 74 72 6c 65 6e 28 61 72 67 76  t += strlen(argv
ada0: 5b 69 5d 2b 31 29 3b 0a 20 20 7d 0a 20 20 73 70  [i]+1);.  }.  sp
adb0: 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28  cnt += k;.  for(
adc0: 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20  ; argv[i]; i++) 
add0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73  fprintf(err," %s
ade0: 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66  ",argv[i]);.  if
adf0: 28 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20  ( spcnt<20 ){.  
ae00: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c    fprintf(err,"\
ae10: 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c  n%*s^-- here\n",
ae20: 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c  spcnt,"");.  }el
ae30: 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
ae40: 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d  err,"\n%*shere -
ae50: 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22  -^\n",spcnt-7,""
ae60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ae70: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
ae80: 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e   of the N-th non
ae90: 2d 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74  -switch argument
aea0: 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
aeb0: 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72  if N is out of r
aec0: 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ange..*/.static 
aed0: 69 6e 74 20 61 72 67 69 6e 64 65 78 28 6e 29 0a  int argindex(n).
aee0: 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69  int n;.{.  int i
aef0: 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68  ;.  int dashdash
af00: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76   = 0;.  if( argv
af10: 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20  !=0 && *argv!=0 
af20: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
af30: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
af40: 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
af50: 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
af60: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
af70: 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72  if( n==0 ) retur
af80: 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d  n i;.        n--
af90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
afa0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
afb0: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
afc0: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
afd0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  }.  }.  return -
afe0: 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61  1;.}..static cha
aff0: 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d  r emsg[] = "Comm
b000: 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20  and line syntax 
b010: 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a  error: ";../*.**
b020: 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20   Process a flag 
b030: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67  command line arg
b040: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
b050: 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73   int handleflags
b060: 28 69 2c 65 72 72 29 0a 69 6e 74 20 69 3b 0a 46  (i,err).int i;.F
b070: 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e  ILE *err;.{.  in
b080: 74 20 76 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e  t v;.  int errcn
b090: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  t = 0;.  int j;.
b0a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d    for(j=0; op[j]
b0b0: 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  .label; j++){.  
b0c0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 26 61 72    if( strcmp(&ar
b0d0: 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e 6c  gv[i][1],op[j].l
b0e0: 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b  abel)==0 ) break
b0f0: 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76  ;.  }.  v = argv
b100: 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20  [i][0]=='-' ? 1 
b110: 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d  : 0;.  if( op[j]
b120: 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  .label==0 ){.   
b130: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
b140: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
b150: 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f  sundefined optio
b160: 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  n.\n",emsg);.   
b170: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65     errline(i,1,e
b180: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  rr);.    }.    e
b190: 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rrcnt++;.  }else
b1a0: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
b1b0: 3d 4f 50 54 5f 46 4c 41 47 20 29 7b 0a 20 20 20  =OPT_FLAG ){.   
b1c0: 20 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61   *((int*)op[j].a
b1d0: 72 67 29 20 3d 20 76 3b 0a 20 20 7d 65 6c 73 65  rg) = v;.  }else
b1e0: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
b1f0: 3d 4f 50 54 5f 46 46 4c 41 47 20 29 7b 0a 20 20  =OPT_FFLAG ){.  
b200: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28    (*(void(*)())(
b210: 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a  op[j].arg))(v);.
b220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
b230: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70   err ){.      fp
b240: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6d 69 73  rintf(err,"%smis
b250: 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e  sing argument on
b260: 20 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73 67   switch.\n",emsg
b270: 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65  );.      errline
b280: 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d  (i,1,err);.    }
b290: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
b2a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
b2b0: 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  nt;.}../*.** Pro
b2c0: 63 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20 6c  cess a command l
b2d0: 69 6e 65 20 73 77 69 74 63 68 20 77 68 69 63 68  ine switch which
b2e0: 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74   has an argument
b2f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b300: 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69 2c 65  handleswitch(i,e
b310: 72 72 29 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20  rr).int i;.FILE 
b320: 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 6c 76  *err;.{.  int lv
b330: 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64   = 0;.  double d
b340: 76 20 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20  v = 0.0;.  char 
b350: 2a 73 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20  *sv = 0, *end;. 
b360: 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74   char *cp;.  int
b370: 20 6a 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74   j;.  int errcnt
b380: 20 3d 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72   = 0;.  cp = str
b390: 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29  chr(argv[i],'=')
b3a0: 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 66  ;.  *cp = 0;.  f
b3b0: 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61  or(j=0; op[j].la
b3c0: 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  bel; j++){.    i
b3d0: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
b3e0: 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d  ],op[j].label)==
b3f0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
b400: 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69 66   *cp = '=';.  if
b410: 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30  ( op[j].label==0
b420: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20   ){.    if( err 
b430: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
b440: 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65  (err,"%sundefine
b450: 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73  d option.\n",ems
b460: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
b470: 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,0,err);.    
b480: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
b490: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70 2b    }else{.    cp+
b4a0: 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  +;.    switch( o
b4b0: 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[j].type ){.   
b4c0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
b4d0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
b4e0: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
b4f0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
b500: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
b510: 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75 69  ,"%soption requi
b520: 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e  res an argument.
b530: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
b540: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30       errline(i,0
b550: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ,err);.        }
b560: 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b  .        errcnt+
b570: 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  +;.        break
b580: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
b590: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
b5a0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
b5b0: 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28 63     dv = strtod(c
b5c0: 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20 20  p,&end);.       
b5d0: 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20   if( *end ){.   
b5e0: 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29         if( err )
b5f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70  {.            fp
b600: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c  rintf(err,"%sill
b610: 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 69  egal character i
b620: 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74  n floating-point
b630: 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d   argument.\n",em
b640: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
b650: 20 65 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73   errline(i,((uns
b660: 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d  igned long)end)-
b670: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61  (unsigned long)a
b680: 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20  rgv[i],err);.   
b690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b6a0: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
b6b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
b6c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b6d0: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
b6e0: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
b6f0: 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74 72 74         lv = strt
b700: 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a 20  ol(cp,&end,0);. 
b710: 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20         if( *end 
b720: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
b730: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
b740: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
b750: 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61  "%sillegal chara
b760: 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65 72 20  cter in integer 
b770: 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73  argument.\n",ems
b780: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
b790: 65 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69  errline(i,((unsi
b7a0: 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28  gned long)end)-(
b7b0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72  unsigned long)ar
b7c0: 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20  gv[i],err);.    
b7d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b7e0: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
b7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
b800: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b810: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63  OPT_STR:.      c
b820: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
b830: 20 20 20 20 20 20 73 76 20 3d 20 63 70 3b 0a 20        sv = cp;. 
b840: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b850: 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
b860: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
b870: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
b880: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
b890: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
b8a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b8b0: 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20  se OPT_DBL:.    
b8c0: 20 20 20 20 2a 28 64 6f 75 62 6c 65 2a 29 28 6f      *(double*)(o
b8d0: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 64 76 3b 0a  p[j].arg) = dv;.
b8e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b8f0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
b900: 42 4c 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  BL:.        (*(v
b910: 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e  oid(*)())(op[j].
b920: 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20 20  arg))(dv);.     
b930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b940: 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20  case OPT_INT:.  
b950: 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70        *(int*)(op
b960: 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20  [j].arg) = lv;. 
b970: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b980: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e      case OPT_FIN
b990: 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f  T:.        (*(vo
b9a0: 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61  id(*)())(op[j].a
b9b0: 72 67 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20  rg))((int)lv);. 
b9c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b9d0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
b9e0: 3a 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  :.        *(char
b9f0: 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  **)(op[j].arg) =
ba00: 20 73 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65   sv;.        bre
ba10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
ba20: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
ba30: 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f   (*(void(*)())(o
ba40: 70 5b 6a 5d 2e 61 72 67 29 29 28 73 76 29 3b 0a  p[j].arg))(sv);.
ba50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ba60: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ba70: 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74  n errcnt;.}..int
ba80: 20 4f 70 74 49 6e 69 74 28 61 2c 6f 2c 65 72 72   OptInit(a,o,err
ba90: 29 0a 63 68 61 72 20 2a 2a 61 3b 0a 73 74 72 75  ).char **a;.stru
baa0: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 3b  ct s_options *o;
bab0: 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20  .FILE *err;.{.  
bac0: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
bad0: 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70    argv = a;.  op
bae0: 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65 61   = o;.  errstrea
baf0: 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20 61  m = err;.  if( a
bb00: 72 67 76 20 26 26 20 2a 61 72 67 76 20 26 26 20  rgv && *argv && 
bb10: 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  op ){.    int i;
bb20: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72  .    for(i=1; ar
bb30: 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  gv[i]; i++){.   
bb40: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30     if( argv[i][0
bb50: 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69  ]=='+' || argv[i
bb60: 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
bb70: 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68       errcnt += h
bb80: 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72  andleflags(i,err
bb90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
bba0: 66 28 20 73 74 72 63 68 72 28 61 72 67 76 5b 69  f( strchr(argv[i
bbb0: 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20  ],'=') ){.      
bbc0: 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64    errcnt += hand
bbd0: 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29 3b  leswitch(i,err);
bbe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bbf0: 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74 3e   }.  if( errcnt>
bc00: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
bc10: 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d  (err,"Valid comm
bc20: 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73  and line options
bc30: 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65 3a   for \"%s\" are:
bc40: 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74  \n",*a);.    Opt
bc50: 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78 69  Print();.    exi
bc60: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  t(1);.  }.  retu
bc70: 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74  rn 0;.}..int Opt
bc80: 4e 41 72 67 73 28 29 7b 0a 20 20 69 6e 74 20 63  NArgs(){.  int c
bc90: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61  nt = 0;.  int da
bca0: 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  shdash = 0;.  in
bcb0: 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 21  t i;.  if( argv!
bcc0: 3d 30 20 26 26 20 61 72 67 76 5b 30 5d 21 3d 30  =0 && argv[0]!=0
bcd0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
bce0: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   argv[i]; i++){.
bcf0: 20 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61        if( dashda
bd00: 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67  sh || !ISOPT(arg
bd10: 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20  v[i]) ) cnt++;. 
bd20: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
bd30: 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30  argv[i],"--")==0
bd40: 20 29 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b   ) dashdash = 1;
bd50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
bd60: 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72  urn cnt;.}..char
bd70: 20 2a 4f 70 74 41 72 67 28 6e 29 0a 69 6e 74 20   *OptArg(n).int 
bd80: 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n;.{.  int i;.  
bd90: 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b  i = argindex(n);
bda0: 0a 20 20 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f  .  return i>=0 ?
bdb0: 20 61 72 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a   argv[i] : 0;.}.
bdc0: 0a 76 6f 69 64 20 4f 70 74 45 72 72 28 6e 29 0a  .void OptErr(n).
bdd0: 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69  int n;.{.  int i
bde0: 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78  ;.  i = argindex
bdf0: 28 6e 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20  (n);.  if( i>=0 
be00: 29 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72  ) errline(i,0,er
be10: 72 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69  rstream);.}..voi
be20: 64 20 4f 70 74 50 72 69 6e 74 28 29 7b 0a 20 20  d OptPrint(){.  
be30: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 78  int i;.  int max
be40: 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20 3d 20 30  , len;.  max = 0
be50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b  ;.  for(i=0; op[
be60: 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a  i].label; i++){.
be70: 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
be80: 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20  (op[i].label) + 
be90: 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  1;.    switch( o
bea0: 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[i].type ){.   
beb0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
bec0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
bed0: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
bee0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bef0: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
bf00: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
bf10: 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39          len += 9
bf20: 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74  ;       /* lengt
bf30: 68 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e 22  h of "<integer>"
bf40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
bf50: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
bf60: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
bf70: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
bf80: 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20      len += 6;   
bf90: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
bfa0: 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20   "<real>" */.   
bfb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bfc0: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
bfd0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
bfe0: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e  STR:.        len
bff0: 20 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a 20   += 8;       /* 
c000: 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72 69  length of "<stri
c010: 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  ng>" */.        
c020: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c030: 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d   if( len>max ) m
c040: 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20  ax = len;.  }.  
c050: 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c  for(i=0; op[i].l
c060: 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  abel; i++){.    
c070: 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79  switch( op[i].ty
c080: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
c090: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
c0a0: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
c0b0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
c0c0: 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25  (errstream,"  -%
c0d0: 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f  -*s  %s\n",max,o
c0e0: 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d  p[i].label,op[i]
c0f0: 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
c100: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c110: 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20  case OPT_INT:.  
c120: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e      case OPT_FIN
c130: 54 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  T:.        fprin
c140: 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20  tf(errstream,"  
c150: 25 73 3d 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20  %s=<integer>%*s 
c160: 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62   %s\n",op[i].lab
c170: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 6d 61  el,.          ma
c180: 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  x-strlen(op[i].l
c190: 61 62 65 6c 29 2d 39 2c 22 22 2c 6f 70 5b 69 5d  abel)-9,"",op[i]
c1a0: 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
c1b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c1c0: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
c1d0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
c1e0: 4c 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  L:.        fprin
c1f0: 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20  tf(errstream,"  
c200: 25 73 3d 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73  %s=<real>%*s  %s
c210: 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  \n",op[i].label,
c220: 0a 20 20 20 20 20 20 20 20 20 20 6d 61 78 2d 73  .          max-s
c230: 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65  trlen(op[i].labe
c240: 6c 29 2d 36 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  l)-6,"",op[i].me
c250: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
c260: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c270: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
c280: 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
c290: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
c2a0: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d  errstream,"  %s=
c2b0: 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c  <string>%*s  %s\
c2c0: 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
c2d0: 20 20 20 20 20 20 20 20 20 20 6d 61 78 2d 73 74            max-st
c2e0: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
c2f0: 29 2d 38 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73  )-8,"",op[i].mes
c300: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
c310: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c320: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
c330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
c340: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
c350: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
c360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
c370: 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c  ./*.** Input fil
c380: 65 20 70 61 72 73 65 72 20 66 6f 72 20 74 68 65  e parser for the
c390: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
c3a0: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
c3b0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
c3c0: 20 70 61 72 73 65 72 20 2a 2f 0a 73 74 72 75 63   parser */.struc
c3d0: 74 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61  t pstate {.  cha
c3e0: 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20  r *filename;    
c3f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
c400: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
c410: 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e    int tokenlinen
c420: 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e  o;      /* Linen
c430: 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63  umber at which c
c440: 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61  urrent token sta
c450: 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  rts */.  int err
c460: 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  orcnt;         /
c470: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
c480: 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63  rs so far */.  c
c490: 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b  har *tokenstart;
c4a0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
c4b0: 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  current token */
c4c0: 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
c4d0: 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62  *gp;     /* Glob
c4e0: 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20  al state vector 
c4f0: 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74  */.  enum e_stat
c500: 65 20 7b 0a 20 20 20 20 49 4e 49 54 49 41 4c 49  e {.    INITIALI
c510: 5a 45 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f  ZE,.    WAITING_
c520: 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
c530: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
c540: 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a  R_DECL_KEYWORD,.
c550: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
c560: 44 45 43 4c 5f 41 52 47 2c 0a 20 20 20 20 57 41  DECL_ARG,.    WA
c570: 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
c580: 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20  ENCE_SYMBOL,.   
c590: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52   WAITING_FOR_ARR
c5a0: 4f 57 2c 0a 20 20 20 20 49 4e 5f 52 48 53 2c 0a  OW,.    IN_RHS,.
c5b0: 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c      LHS_ALIAS_1,
c5c0: 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32  .    LHS_ALIAS_2
c5d0: 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f  ,.    LHS_ALIAS_
c5e0: 33 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53  3,.    RHS_ALIAS
c5f0: 5f 31 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41  _1,.    RHS_ALIA
c600: 53 5f 32 2c 0a 20 20 20 20 50 52 45 43 45 44 45  S_2,.    PRECEDE
c610: 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 20 20  NCE_MARK_1,.    
c620: 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
c630: 32 2c 0a 20 20 20 20 52 45 53 59 4e 43 5f 41 46  2,.    RESYNC_AF
c640: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a  TER_RULE_ERROR,.
c650: 20 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52      RESYNC_AFTER
c660: 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 20  _DECL_ERROR,.   
c670: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53   WAITING_FOR_DES
c680: 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a  TRUCTOR_SYMBOL,.
c690: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
c6a0: 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 0a  DATATYPE_SYMBOL.
c6b0: 20 20 7d 20 73 74 61 74 65 3b 20 20 20 20 20 20    } state;      
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c6d0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
c6e0: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 73 74 72   parser */.  str
c6f0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b  uct symbol *lhs;
c700: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
c710: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 75 72  hand side of cur
c720: 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63  rent rule */.  c
c730: 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20  har *lhsalias;  
c740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69            /* Ali
c750: 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 2a  as for the LHS *
c760: 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20  /.  int nrhs;   
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c780: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68  * Number of righ
c790: 74 2d 68 61 6e 64 20 73 69 64 65 20 73 79 6d 62  t-hand side symb
c7a0: 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74  ols seen */.  st
c7b0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73  ruct symbol *rhs
c7c0: 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48  [MAXRHS];  /* RH
c7d0: 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63  S symbols */.  c
c7e0: 68 61 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48  har *alias[MAXRH
c7f0: 53 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 69  S];       /* Ali
c800: 61 73 65 73 20 66 6f 72 20 65 61 63 68 20 52 48  ases for each RH
c810: 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c  S symbol (or NUL
c820: 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  L) */.  struct r
c830: 75 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b 20 20  ule *prevrule;  
c840: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
c850: 75 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a 20 20  ule parsed */.  
c860: 63 68 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72  char *declkeywor
c870: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65  d;         /* Ke
c880: 79 77 6f 72 64 20 6f 66 20 61 20 64 65 63 6c 61  yword of a decla
c890: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72  ration */.  char
c8a0: 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20   **declargslot; 
c8b0: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
c8c0: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c8d0: 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
c8e0: 62 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  be put */.  int 
c8f0: 2a 64 65 63 6c 6c 6e 73 6c 6f 74 3b 20 20 20 20  *decllnslot;    
c900: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
c910: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
c920: 6c 69 6e 65 6e 75 6d 62 65 72 20 69 73 20 70 75  linenumber is pu
c930: 74 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73  t */.  enum e_as
c940: 73 6f 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20  soc declassoc;  
c950: 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73    /* Assign this
c960: 20 61 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20   association to 
c970: 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a  decl arguments *
c980: 2f 0a 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e  /.  int preccoun
c990: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ter;           /
c9a0: 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 70 72  * Assign this pr
c9b0: 65 63 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c  ecedence to decl
c9c0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
c9d0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72  struct rule *fir
c9e0: 73 74 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f  strule;    /* Po
c9f0: 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 72  inter to first r
ca00: 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ule in the gramm
ca10: 61 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  ar */.  struct r
ca20: 75 6c 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20  ule *lastrule;  
ca30: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
ca40: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
ca50: 6c 79 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a  ly parsed rule *
ca60: 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61  /.};../* Parse a
ca70: 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f   single token */
ca80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72  .static void par
ca90: 73 65 6f 6e 65 74 6f 6b 65 6e 28 70 73 70 29 0a  seonetoken(psp).
caa0: 73 74 72 75 63 74 20 70 73 74 61 74 65 20 2a 70  struct pstate *p
cab0: 73 70 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 78 3b  sp;.{.  char *x;
cac0: 0a 20 20 78 20 3d 20 53 74 72 73 61 66 65 28 70  .  x = Strsafe(p
cad0: 73 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b  sp->tokenstart);
cae0: 20 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65       /* Save the
caf0: 20 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74   token permanent
cb00: 6c 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72  ly */.#if 0.  pr
cb10: 69 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b  intf("%s:%d: Tok
cb20: 65 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64  en=[%s] state=%d
cb30: 5c 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  \n",psp->filenam
cb40: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
cb50: 6e 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73  no,.    x,psp->s
cb60: 74 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  tate);.#endif.  
cb70: 73 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61  switch( psp->sta
cb80: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49  te ){.    case I
cb90: 4e 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20  NITIALIZE:.     
cba0: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d   psp->prevrule =
cbb0: 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70   0;.      psp->p
cbc0: 72 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  reccounter = 0;.
cbd0: 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74        psp->first
cbe0: 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74  rule = psp->last
cbf0: 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
cc00: 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d  psp->gp->nrule =
cc10: 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   0;.      /* Fal
cc20: 6c 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63  l thru to next c
cc30: 61 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ase */.    case 
cc40: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
cc50: 5f 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20  _OR_RULE:.      
cc60: 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b  if( x[0]=='%' ){
cc70: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
cc80: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
cc90: 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a  R_DECL_KEYWORD;.
cca0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ccb0: 69 73 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b  islower(x[0]) ){
ccc0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68  .        psp->lh
ccd0: 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  s = Symbol_new(x
cce0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
ccf0: 6e 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  nrhs = 0;.      
cd00: 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20    psp->lhsalias 
cd10: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
cd20: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
cd30: 47 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20  G_FOR_ARROW;.   
cd40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
cd50: 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20  ]=='{' ){.      
cd60: 20 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72    if( psp->prevr
cd70: 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ule==0 ){.      
cd80: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
cd90: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
cda0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68  tokenlineno,."Th
cdb0: 65 72 65 20 69 73 20 6e 6f 74 20 70 72 69 6f 72  ere is not prior
cdc0: 20 72 75 6c 65 20 6f 70 6f 6e 20 77 68 69 63 68   rule opon which
cdd0: 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20 63   to attach the c
cde0: 6f 64 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77  ode \.fragment w
cdf0: 68 69 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74  hich begins on t
ce00: 68 69 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20  his line.");.   
ce10: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
ce20: 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69  rcnt++;..}else i
ce30: 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
ce40: 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20  ->code!=0 ){.   
ce50: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
ce60: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
ce70: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
ce80: 22 43 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62  "Code fragment b
ce90: 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73  eginning on this
cea0: 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65   line is not the
ceb0: 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c   first \.to foll
cec0: 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ow the previous 
ced0: 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  rule.");.       
cee0: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
cef0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
cf00: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
cf10: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65  ->prevrule->line
cf20: 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e   = psp->tokenlin
cf30: 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70  eno;.          p
cf40: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f  sp->prevrule->co
cf50: 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a 20  de = &x[1];..}. 
cf60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
cf70: 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  [0]=='[' ){.    
cf80: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
cf90: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
cfa0: 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _1;.      }else{
cfb0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
cfc0: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
cfd0: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
cfe0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b  ,.          "Tok
cff0: 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64  en \"%s\" should
d000: 20 62 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c   be either \"%%\
d010: 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e  " or a nontermin
d020: 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20  al name.",.     
d030: 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20       x);.       
d040: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
d050: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d060: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
d070: 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
d080: 31 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  1:.      if( !is
d090: 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  upper(x[0]) ){. 
d0a0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
d0b0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
d0c0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
d0d0: 20 20 20 20 20 20 20 20 20 20 22 54 68 65 20 70            "The p
d0e0: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
d0f0: 20 6d 75 73 74 20 62 65 20 61 20 74 65 72 6d 69   must be a termi
d100: 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  nal.");.        
d110: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
d120: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
d130: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d   psp->prevrule==
d140: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  0 ){.        Err
d150: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
d160: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
d170: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
d180: 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69  "There is no pri
d190: 6f 72 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67  or rule to assig
d1a0: 6e 20 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b  n precedence \"[
d1b0: 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20  %s]\".",x);.    
d1c0: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
d1d0: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
d1e0: 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
d1f0: 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29  le->precsym!=0 )
d200: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
d210: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
d220: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
d230: 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d  o,."Precedence m
d240: 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ark on this line
d250: 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73   is not the firs
d260: 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68  t \.to follow th
d270: 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e  e previous rule.
d280: 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
d290: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
d2a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d2b0: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
d2c0: 3e 70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f  >precsym = Symbo
d2d0: 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
d2e0: 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61  }.      psp->sta
d2f0: 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f  te = PRECEDENCE_
d300: 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72  MARK_2;.      br
d310: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52  eak;.    case PR
d320: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a  ECEDENCE_MARK_2:
d330: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21  .      if( x[0]!
d340: 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
d350: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
d360: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
d370: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
d380: 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c     "Missing \"]\
d390: 22 20 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20  " on precedence 
d3a0: 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20  mark.");.       
d3b0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
d3c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d3d0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
d3e0: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
d3f0: 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65  _RULE;.      bre
d400: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
d410: 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a  TING_FOR_ARROW:.
d420: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
d430: 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27  ':' && x[1]==':'
d440: 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b   && x[2]=='=' ){
d450: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
d460: 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20  ate = IN_RHS;.  
d470: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
d480: 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20  0]=='(' ){.     
d490: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
d4a0: 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20  LHS_ALIAS_1;.   
d4b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d4c0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
d4d0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
d4e0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
d4f0: 20 20 20 20 20 22 45 78 70 65 63 74 65 64 20 74       "Expected t
d500: 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f  o see a \":\" fo
d510: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20  llowing the LHS 
d520: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c  symbol \"%s\".",
d530: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
d540: 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  lhs->name);.    
d550: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
d560: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
d570: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
d580: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
d590: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
d5a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
d5b0: 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20   LHS_ALIAS_1:.  
d5c0: 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28      if( isalpha(
d5d0: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
d5e0: 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d   psp->lhsalias =
d5f0: 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   x;.        psp-
d600: 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49  >state = LHS_ALI
d610: 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_2;.      }els
d620: 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
d630: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
d640: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
d650: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c  no,.          "\
d660: 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76  "%s\" is not a v
d670: 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74  alid alias for t
d680: 68 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22  he LHS \"%s\"\n"
d690: 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73  ,.          x,ps
d6a0: 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
d6b0: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
d6c0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
d6d0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
d6e0: 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
d6f0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
d700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
d710: 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a  ase LHS_ALIAS_2:
d720: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
d730: 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =')' ){.        
d740: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53  psp->state = LHS
d750: 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20  _ALIAS_3;.      
d760: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
d770: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
d780: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
d790: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
d7a0: 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22    "Missing \")\"
d7b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61   following LHS a
d7c0: 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22  lias name \"%s\"
d7d0: 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73  .",psp->lhsalias
d7e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
d7f0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
d800: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
d810: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
d820: 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
d830: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
d840: 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41     case LHS_ALIA
d850: 53 5f 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78  S_3:.      if( x
d860: 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d  [0]==':' && x[1]
d870: 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27  ==':' && x[2]=='
d880: 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  =' ){.        ps
d890: 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48  p->state = IN_RH
d8a0: 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
d8b0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
d8c0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
d8d0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
d8e0: 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
d8f0: 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f  ing \"->\" follo
d900: 77 69 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22  wing: \"%s(%s)\"
d910: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  .",.           p
d920: 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73  sp->lhs->name,ps
d930: 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
d940: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
d950: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
d960: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
d970: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
d980: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
d990: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
d9a0: 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20  se IN_RHS:.     
d9b0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
d9c0: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
d9d0: 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20   rule *rp;.     
d9e0: 20 20 20 72 70 20 3d 20 28 73 74 72 75 63 74 20     rp = (struct 
d9f0: 72 75 6c 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73  rule *)malloc( s
da00: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c  izeof(struct rul
da10: 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20  e) + .          
da20: 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74     sizeof(struct
da30: 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e   symbol*)*psp->n
da40: 72 68 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61  rhs + sizeof(cha
da50: 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 29 3b  r*)*psp->nrhs );
da60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70 3d  .        if( rp=
da70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
da80: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
da90: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
daa0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
dab0: 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f       "Can't allo
dac0: 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f  cate enough memo
dad0: 72 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65  ry for this rule
dae0: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
daf0: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
db00: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
db10: 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 09 7d 65  revrule = 0;..}e
db20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
db30: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
db40: 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70  rp->ruleline = p
db50: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  sp->tokenlineno;
db60: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
db70: 68 73 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  hs = (struct sym
db80: 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20  bol**)&rp[1];.  
db90: 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61          rp->rhsa
dba0: 6c 69 61 73 20 3d 20 28 63 68 61 72 2a 2a 29 26  lias = (char**)&
dbb0: 28 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  (rp->rhs[psp->nr
dbc0: 68 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  hs]);.          
dbd0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e  for(i=0; i<psp->
dbe0: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
dbf0: 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b          rp->rhs[
dc00: 69 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d  i] = psp->rhs[i]
dc10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70  ;.            rp
dc20: 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20  ->rhsalias[i] = 
dc30: 70 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09  psp->alias[i];..
dc40: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 70    }.          rp
dc50: 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73  ->lhs = psp->lhs
dc60: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
dc70: 6c 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e  lhsalias = psp->
dc80: 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20 20  lhsalias;.      
dc90: 20 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70      rp->nrhs = p
dca0: 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20  sp->nrhs;.      
dcb0: 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30      rp->code = 0
dcc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
dcd0: 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20  precsym = 0;.   
dce0: 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78         rp->index
dcf0: 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c   = psp->gp->nrul
dd00: 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e++;.          r
dd10: 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d  p->nextlhs = rp-
dd20: 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20  >lhs->rule;.    
dd30: 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72        rp->lhs->r
dd40: 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ule = rp;.      
dd50: 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30      rp->next = 0
dd60: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
dd70: 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d  psp->firstrule==
dd80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
dd90: 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20   psp->firstrule 
dda0: 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20  = psp->lastrule 
ddb0: 3d 20 72 70 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a  = rp;..  }else{.
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d              psp-
ddd0: 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20  >lastrule->next 
dde0: 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
ddf0: 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20    psp->lastrule 
de00: 3d 20 72 70 3b 0a 09 20 20 7d 0a 20 20 20 20 20  = rp;..  }.     
de10: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
de20: 6c 65 20 3d 20 72 70 3b 0a 09 7d 0a 20 20 20 20  le = rp;..}.    
de30: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
de40: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
de50: 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
de60: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c 70   }else if( isalp
de70: 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ha(x[0]) ){.    
de80: 20 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72 68      if( psp->nrh
de90: 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20 20  s>=MAXRHS ){.   
dea0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
deb0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
dec0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 6f 6f              "Too
dee0: 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 20 6f 6e 20   many symbol on 
def0: 52 48 53 20 6f 72 20 72 75 6c 65 20 62 65 67 69  RHS or rule begi
df00: 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e  nning at \"%s\".
df10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 78  ",.            x
df20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
df30: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
df40: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
df50: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
df60: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d  R_RULE_ERROR;..}
df70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
df80: 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
df90: 68 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  hs] = Symbol_new
dfa0: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  (x);.          p
dfb0: 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e  sp->alias[psp->n
dfc0: 72 68 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  rhs] = 0;.      
dfd0: 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b      psp->nrhs++;
dfe0: 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ..}.      }else 
dff0: 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26  if( x[0]=='(' &&
e000: 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a   psp->nrhs>0 ){.
e010: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
e020: 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31  te = RHS_ALIAS_1
e030: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
e040: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
e050: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
e060: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
e070: 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67            "Illeg
e080: 61 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20  al character on 
e090: 52 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25  RHS of rule: \"%
e0a0: 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
e0b0: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
e0c0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
e0d0: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
e0e0: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
e0f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e100: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
e110: 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20  HS_ALIAS_1:.    
e120: 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b    if( isalpha(x[
e130: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
e140: 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e  sp->alias[psp->n
e150: 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20  rhs-1] = x;.    
e160: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
e170: 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20   RHS_ALIAS_2;.  
e180: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e190: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
e1a0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
e1b0: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
e1c0: 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73        "\"%s\" is
e1d0: 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69   not a valid ali
e1e0: 61 73 20 66 6f 72 20 74 68 65 20 52 48 53 20 73  as for the RHS s
e1f0: 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c  ymbol \"%s\"\n",
e200: 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70  .          x,psp
e210: 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d  ->rhs[psp->nrhs-
e220: 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  1]->name);.     
e230: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
e240: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
e250: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
e260: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
e270: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e280: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
e290: 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20  RHS_ALIAS_2:.   
e2a0: 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27     if( x[0]==')'
e2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
e2c0: 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
e2d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e2e0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
e2f0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
e300: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
e310: 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
e320: 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e  g \")\" followin
e330: 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65  g LHS alias name
e340: 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c   \"%s\".",psp->l
e350: 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  hsalias);.      
e360: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
e370: 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
e380: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
e390: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
e3a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e3b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
e3c0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
e3d0: 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69  KEYWORD:.      i
e3e0: 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
e3f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
e400: 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78  >declkeyword = x
e410: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
e420: 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a  eclargslot = 0;.
e430: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
e440: 6c 6c 6e 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20  llnslot = 0;.   
e450: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
e460: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
e470: 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20  CL_ARG;.        
e480: 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61  if( strcmp(x,"na
e490: 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  me")==0 ){.     
e4a0: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
e4b0: 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
e4c0: 70 2d 3e 6e 61 6d 65 29 3b 0a 09 7d 65 6c 73 65  p->name);..}else
e4d0: 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69   if( strcmp(x,"i
e4e0: 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20  nclude")==0 ){. 
e4f0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
e500: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
e510: 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b  p->gp->include);
e520: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
e530: 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73  decllnslot = &ps
e540: 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 6c 6e  p->gp->includeln
e550: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
e560: 63 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d 30  cmp(x,"code")==0
e570: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
e580: 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
e590: 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72   &(psp->gp->extr
e5a0: 61 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  acode);.        
e5b0: 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f    psp->decllnslo
e5c0: 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 65 78  t = &psp->gp->ex
e5d0: 74 72 61 63 6f 64 65 6c 6e 3b 0a 09 7d 65 6c 73  tracodeln;..}els
e5e0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
e5f0: 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72  token_destructor
e600: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e610: 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
e620: 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
e630: 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20  tokendest;.     
e640: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
e650: 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
e660: 3e 74 6f 6b 65 6e 64 65 73 74 6c 6e 3b 0a 09 7d  >tokendestln;..}
e670: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
e680: 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72  x,"default_destr
e690: 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20  uctor")==0 ){.  
e6a0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
e6b0: 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d  largslot = &psp-
e6c0: 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20  >gp->vardest;.  
e6d0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
e6e0: 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  llnslot = &psp->
e6f0: 67 70 2d 3e 76 61 72 64 65 73 74 6c 6e 3b 0a 09  gp->vardestln;..
e700: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
e710: 28 78 2c 22 74 6f 6b 65 6e 5f 70 72 65 66 69 78  (x,"token_prefix
e720: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e730: 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
e740: 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
e750: 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 09 7d 65  tokenprefix;..}e
e760: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
e770: 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29  ,"syntax_error")
e780: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e790: 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
e7a0: 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
e7b0: 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rror);.         
e7c0: 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74   psp->decllnslot
e7d0: 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 65 72 72   = &psp->gp->err
e7e0: 6f 72 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28  orln;..}else if(
e7f0: 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65   strcmp(x,"parse
e800: 5f 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a  _accept")==0 ){.
e810: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
e820: 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
e830: 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b  sp->gp->accept);
e840: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
e850: 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73  decllnslot = &ps
e860: 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 6c 6e 3b  p->gp->acceptln;
e870: 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
e880: 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c  mp(x,"parse_fail
e890: 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ure")==0 ){.    
e8a0: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
e8b0: 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
e8c0: 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20  gp->failure);.  
e8d0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
e8e0: 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  llnslot = &psp->
e8f0: 67 70 2d 3e 66 61 69 6c 75 72 65 6c 6e 3b 0a 09  gp->failureln;..
e900: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
e910: 28 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c  (x,"stack_overfl
e920: 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ow")==0 ){.     
e930: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
e940: 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
e950: 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  p->overflow);.  
e960: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
e970: 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  llnslot = &psp->
e980: 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 3b 0a  gp->overflowln;.
e990: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
e9a0: 28 20 73 74 72 63 6d 70 28 78 2c 22 65 78 74 72  ( strcmp(x,"extr
e9b0: 61 5f 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20  a_argument")==0 
e9c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
e9d0: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
e9e0: 26 28 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b  &(psp->gp->arg);
e9f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
ea00: 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
ea10: 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a  en_type")==0 ){.
ea20: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
ea30: 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
ea40: 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70  sp->gp->tokentyp
ea50: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
ea60: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
ea70: 64 65 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d  default_type")==
ea80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
ea90: 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
eaa0: 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72  = &(psp->gp->var
eab0: 74 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  type);.        }
eac0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
ead0: 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d  x,"stack_size")=
eae0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
eaf0: 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
eb00: 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74   = &(psp->gp->st
eb10: 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  acksize);.      
eb20: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
eb30: 6d 70 28 78 2c 22 73 74 61 72 74 5f 73 79 6d 62  mp(x,"start_symb
eb40: 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ol")==0 ){.     
eb50: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
eb60: 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
eb70: 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 20  p->start);.     
eb80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
eb90: 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30  cmp(x,"left")==0
eba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
ebb0: 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b  p->preccounter++
ebc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
ebd0: 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46  >declassoc = LEF
ebe0: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  T;.          psp
ebf0: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
ec00: 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
ec10: 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
ec20: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
ec30: 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d 30 20  p(x,"right")==0 
ec40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
ec50: 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b  ->preccounter++;
ec60: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
ec70: 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49 47 48  declassoc = RIGH
ec80: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  T;.          psp
ec90: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
eca0: 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
ecb0: 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
ecc0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
ecd0: 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d  p(x,"nonassoc")=
ece0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ecf0: 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
ed00: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
ed10: 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e  p->declassoc = N
ed20: 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ONE;.          p
ed30: 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
ed40: 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
ed50: 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73  CE_SYMBOL;..}els
ed60: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
ed70: 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
ed80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
ed90: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
eda0: 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52  G_FOR_DESTRUCTOR
edb0: 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20  _SYMBOL;..}else 
edc0: 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 79  if( strcmp(x,"ty
edd0: 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
ede0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
edf0: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41  = WAITING_FOR_DA
ee00: 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20  TATYPE_SYMBOL;. 
ee10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
ee20: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
ee30: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
ee40: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
ee50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e  .            "Un
ee60: 6b 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74 69 6f  known declaratio
ee70: 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25 25  n keyword: \"%%%
ee80: 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
ee90: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
eea0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
eeb0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
eec0: 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
eed0: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65  ROR;..}.      }e
eee0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
eef0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
ef00: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
ef10: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
ef20: 22 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72 61  "Illegal declara
ef30: 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22  tion keyword: \"
ef40: 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
ef50: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
ef60: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
ef70: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
ef80: 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
ef90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
efa0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
efb0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54  WAITING_FOR_DEST
efc0: 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20  RUCTOR_SYMBOL:. 
efd0: 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68       if( !isalph
efe0: 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
eff0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f000: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f010: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f020: 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61        "Symbol na
f030: 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72  me missing after
f040: 20 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79   %destructor key
f050: 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20  word");.        
f060: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
f070: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
f080: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
f090: 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
f0a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f0b0: 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
f0c0: 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
f0d0: 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
f0e0: 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
f0f0: 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  = &sp->destructo
f100: 72 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  r;.        psp->
f110: 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 73 70  decllnslot = &sp
f120: 2d 3e 64 65 73 74 72 75 63 74 6f 72 6c 6e 3b 0a  ->destructorln;.
f130: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f140: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
f150: 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20  _DECL_ARG;.     
f160: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f170: 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
f180: 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
f190: 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20  MBOL:.      if( 
f1a0: 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29  !isalpha(x[0]) )
f1b0: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f1c0: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f1d0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f1e0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79  o,.          "Sy
f1f0: 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e  mbol name missin
f200: 67 20 61 66 74 65 72 20 25 64 65 73 74 72 75 63  g after %destruc
f210: 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20  tor keyword");. 
f220: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f230: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
f240: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
f250: 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
f260: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
f270: 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
f280: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
f290: 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
f2a0: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
f2b0: 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61  rgslot = &sp->da
f2c0: 74 61 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20  tatype;.        
f2d0: 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
f2e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
f2f0: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
f300: 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a  G_FOR_DECL_ARG;.
f310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f320: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
f330: 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
f340: 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20  ENCE_SYMBOL:.   
f350: 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
f360: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
f370: 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
f380: 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
f390: 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
f3a0: 66 28 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29  f( isupper(x[0])
f3b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
f3c0: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
f3d0: 20 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62         sp = Symb
f3e0: 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
f3f0: 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e     if( sp->prec>
f400: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f410: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f420: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f430: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
f440: 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25       "Symbol \"%
f450: 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64 79 20  s\" has already 
f460: 62 65 20 67 69 76 65 6e 20 61 20 70 72 65 63 65  be given a prece
f470: 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20  dence.",x);.    
f480: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f490: 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20  cnt++;..}else{. 
f4a0: 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65           sp->pre
f4b0: 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75  c = psp->preccou
f4c0: 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  nter;.          
f4d0: 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d  sp->assoc = psp-
f4e0: 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20  >declassoc;..}. 
f4f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f500: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f510: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f520: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
f530: 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 73         "Can't as
f540: 73 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63  sign a precedenc
f550: 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29  e to \"%s\".",x)
f560: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f570: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f580: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f590: 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
f5a0: 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20  _FOR_DECL_ARG:. 
f5b0: 20 20 20 20 20 69 66 28 20 28 78 5b 30 5d 3d 3d       if( (x[0]==
f5c0: 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22  '{' || x[0]=='\"
f5d0: 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30  ' || isalnum(x[0
f5e0: 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ])) ){.        i
f5f0: 66 28 20 2a 28 70 73 70 2d 3e 64 65 63 6c 61 72  f( *(psp->declar
f600: 67 73 6c 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20  gslot)!=0 ){.   
f610: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f620: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f630: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f640: 20 20 20 20 20 20 20 20 20 20 20 20 22 54 68 65              "The
f650: 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22   argument \"%s\"
f660: 20 74 6f 20 64 65 63 6c 61 72 61 74 69 6f 6e 20   to declaration 
f670: 5c 22 25 25 25 73 5c 22 20 69 73 20 6e 6f 74 20  \"%%%s\" is not 
f680: 74 68 65 20 66 69 72 73 74 2e 22 2c 0a 20 20 20  the first.",.   
f690: 20 20 20 20 20 20 20 20 20 78 5b 30 5d 3d 3d 27           x[0]=='
f6a0: 5c 22 27 20 3f 20 26 78 5b 31 5d 20 3a 20 78 2c  \"' ? &x[1] : x,
f6b0: 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64  psp->declkeyword
f6c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
f6d0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
f6e0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f6f0: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
f700: 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  R_DECL_ERROR;..}
f710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f720: 2a 28 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c  *(psp->declargsl
f730: 6f 74 29 20 3d 20 28 78 5b 30 5d 3d 3d 27 5c 22  ot) = (x[0]=='\"
f740: 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 7b 27 29 20  ' || x[0]=='{') 
f750: 3f 20 26 78 5b 31 5d 20 3a 20 78 3b 0a 20 20 20  ? &x[1] : x;.   
f760: 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
f770: 64 65 63 6c 6c 6e 73 6c 6f 74 20 29 20 2a 70 73  decllnslot ) *ps
f780: 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
f790: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f7a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
f7b0: 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
f7c0: 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
f7d0: 45 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73  E;..}.      }els
f7e0: 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
f7f0: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f800: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f810: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49  no,.          "I
f820: 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20  llegal argument 
f830: 74 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73 70  to %%%s: %s",psp
f840: 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29  ->declkeyword,x)
f850: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f860: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f870: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f880: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
f890: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
f8a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f8b0: 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
f8c0: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a  TER_RULE_ERROR:.
f8d0: 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  /*      if( x[0]
f8e0: 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61  =='.' ) psp->sta
f8f0: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
f900: 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a  _DECL_OR_RULE;.*
f910: 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f  *      break; */
f920: 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43  .    case RESYNC
f930: 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
f940: 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  R:.      if( x[0
f950: 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74  ]=='.' ) psp->st
f960: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
f970: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
f980: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
f990: 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '%' ) psp->state
f9a0: 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
f9b0: 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20  ECL_KEYWORD;.   
f9c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a     break;.  }.}.
f9d0: 0a 2f 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20  ./* In spite of 
f9e0: 69 74 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66  its name, this f
f9f0: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c  unction is reall
fa00: 79 20 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74  y a scanner.  It
fa10: 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
fa20: 65 6e 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c  entire input fil
fa30: 65 20 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20  e (all at once) 
fa40: 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69  then tokenizes i
fa50: 74 2e 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65  t.  Each.** toke
fa60: 6e 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  n is passed to t
fa70: 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72  he function "par
fa80: 73 65 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63  seonetoken" whic
fa90: 68 20 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20  h builds all.** 
faa0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
fab0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
fac0: 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74  in the global st
fad0: 61 74 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e  ate vector "gp".
fae0: 0a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 67  .*/.void Parse(g
faf0: 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
fb00: 2a 67 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  *gp;.{.  struct 
fb10: 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c  pstate ps;.  FIL
fb20: 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66  E *fp;.  char *f
fb30: 69 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69  ilebuf;.  int fi
fb40: 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69  lesize;.  int li
fb50: 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20  neno;.  int c;. 
fb60: 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74   char *cp, *next
fb70: 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c  cp;.  int startl
fb80: 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 70 73 2e 67  ine = 0;..  ps.g
fb90: 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c  p = gp;.  ps.fil
fba0: 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65  ename = gp->file
fbb0: 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72  name;.  ps.error
fbc0: 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74  cnt = 0;.  ps.st
fbd0: 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45  ate = INITIALIZE
fbe0: 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
fbf0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70   reading the inp
fc00: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20  ut file */.  fp 
fc10: 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e  = fopen(ps.filen
fc20: 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  ame,"rb");.  if(
fc30: 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72   fp==0 ){.    Er
fc40: 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
fc50: 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e  me,0,"Can't open
fc60: 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72   this file for r
fc70: 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67  eading.");.    g
fc80: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
fc90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
fca0: 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a   fseek(fp,0,2);.
fcb0: 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65    filesize = fte
fcc0: 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64  ll(fp);.  rewind
fcd0: 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20  (fp);.  filebuf 
fce0: 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
fcf0: 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a  ( filesize+1 );.
fd00: 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d 30    if( filebuf==0
fd10: 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
fd20: 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22  (ps.filename,0,"
fd30: 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 25  Can't allocate %
fd40: 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68  d of memory to h
fd50: 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22 2c  old this file.",
fd60: 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 2b  .      filesize+
fd70: 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f  1);.    gp->erro
fd80: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
fd90: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  rn;.  }.  if( fr
fda0: 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69  ead(filebuf,1,fi
fdb0: 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65  lesize,fp)!=file
fdc0: 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f  size ){.    Erro
fdd0: 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65  rMsg(ps.filename
fde0: 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69  ,0,"Can't read i
fdf0: 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f  n all %d bytes o
fe00: 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20  f this file.",. 
fe10: 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a       filesize);.
fe20: 20 20 20 20 66 72 65 65 28 66 69 6c 65 62 75 66      free(filebuf
fe30: 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72  );.    gp->error
fe40: 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
fe50: 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  n;.  }.  fclose(
fe60: 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66  fp);.  filebuf[f
fe70: 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20  ilesize] = 0;.. 
fe80: 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68 65   /* Now scan the
fe90: 20 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e 70   text of the inp
fea0: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e  ut file */.  lin
feb0: 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 63  eno = 1;.  for(c
fec0: 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20 2a  p=filebuf; (c= *
fed0: 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20 69  cp)!=0; ){.    i
fee0: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
fef0: 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20 20  eno++;          
ff00: 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61 63      /* Keep trac
ff10: 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75  k of the line nu
ff20: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  mber */.    if( 
ff30: 69 73 73 70 61 63 65 28 63 29 20 29 7b 20 63 70  isspace(c) ){ cp
ff40: 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 20  ++; continue; } 
ff50: 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68 69   /* Skip all whi
ff60: 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  te space */.    
ff70: 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
ff80: 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20 20  [1]=='/' ){     
ff90: 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b       /* Skip C++
ffa0: 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20   style comments 
ffb0: 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a  */.      cp+=2;.
ffc0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
ffd0: 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
ffe0: 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  \n' ) cp++;.    
fff0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
10000 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27  }.    if( c=='/'
10010 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29   && cp[1]=='*' )
10020 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  {          /* Sk
10030 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d 65  ip C style comme
10040 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  nts */.      cp+
10050 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  =2;.      while(
10060 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
10070 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d 31  (c!='/' || cp[-1
10080 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20  ]!='*') ){.     
10090 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
100a0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
100b0 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d     cp++;.      }
100c0 0a 20 20 20 20 20 20 69 66 28 20 63 20 29 20 63  .      if( c ) c
100d0 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  p++;.      conti
100e0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nue;.    }.    p
100f0 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20 63  s.tokenstart = c
10100 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
10110 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62 65    /* Mark the be
10120 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74  ginning of the t
10130 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e 74  oken */.    ps.t
10140 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e  okenlineno = lin
10150 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  eno;           /
10160 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e 20  * Linenumber on 
10170 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67 69  which token begi
10180 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d  ns */.    if( c=
10190 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20 20  ='\"' ){        
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
101b0 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 20  String literals 
101c0 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  */.      cp++;. 
101d0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
101e0 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  *cp)!=0 && c!='\
101f0 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  "' ){.        if
10200 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
10210 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70  no++;.        cp
10220 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
10230 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
10240 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10250 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72 74  s.filename,start
10260 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73 74  line,."String st
10270 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  arting on this l
10280 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69  ine is not termi
10290 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  nated before the
102a0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
102b0 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e  .");.        ps.
102c0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
102d0 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
102e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
102f0 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
10300 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p+1;.      }.   
10310 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b   }else if( c=='{
10320 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ' ){            
10330 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f 66     /* A block of
10340 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   C code */.     
10350 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20 20   int level;.    
10360 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66 6f    cp++;.      fo
10370 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20 2a  r(level=1; (c= *
10380 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65 6c  cp)!=0 && (level
10390 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20 63  >1 || c!='}'); c
103a0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
103b0 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
103c0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c  no++;.        el
103d0 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 20  se if( c=='{' ) 
103e0 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  level++;.       
103f0 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d 27   else if( c=='}'
10400 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20   ) level--;.    
10410 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
10420 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a  '/' && cp[1]=='*
10430 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63 6f  ' ){  /* Skip co
10440 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  mments */.      
10450 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a 20      int prevc;. 
10460 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63           cp = &c
10470 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[2];.          
10480 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20  prevc = 0;.     
10490 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
104a0 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27  *cp)!=0 && (c!='
104b0 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a 27  /' || prevc!='*'
104c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
104d0 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
104e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
104f0 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a       prevc = c;.
10500 20 20 20 20 20 20 20 20 20 20 20 20 63 70 2b 2b              cp++
10510 3b 0a 09 20 20 7d 0a 09 7d 65 6c 73 65 20 69 66  ;..  }..}else if
10520 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
10530 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b  ]=='/' ){  /* Sk
10540 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d  ip C++ style com
10550 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20  ments too */.   
10560 20 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b         cp = &cp[
10570 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68  2];.          wh
10580 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
10590 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70   && c!='\n' ) cp
105a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
105b0 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ( c ) lineno++;.
105c0 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c  .}else if( c=='\
105d0 27 27 20 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b  '' || c=='\"' ){
105e0 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 61 20      /* String a 
105f0 63 68 61 72 61 63 74 65 72 20 6c 69 74 65 72 61  character litera
10600 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ls */.          
10610 69 6e 74 20 73 74 61 72 74 63 68 61 72 2c 20 70  int startchar, p
10620 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20  revc;.          
10630 73 74 61 72 74 63 68 61 72 20 3d 20 63 3b 0a 20  startchar = c;. 
10640 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
10650 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
10660 72 28 63 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29  r(cp++; (c= *cp)
10670 21 3d 30 20 26 26 20 28 63 21 3d 73 74 61 72 74  !=0 && (c!=start
10680 63 68 61 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27  char || prevc=='
10690 5c 5c 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20  \\'); cp++){.   
106a0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
106b0 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
106c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
106d0 20 70 72 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70   prevc=='\\' ) p
106e0 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
106f0 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20        else      
10700 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
10710 63 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20  c;..  }..}.     
10720 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
10730 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  0 ){.        Err
10740 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
10750 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  e,ps.tokenlineno
10760 2c 0a 22 43 20 63 6f 64 65 20 73 74 61 72 74 69  ,."C code starti
10770 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  ng on this line 
10780 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  is not terminate
10790 64 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64  d before the end
107a0 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b   of the file.");
107b0 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f  .        ps.erro
107c0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
107d0 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
107e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
107f0 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b    nextcp = cp+1;
10800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
10810 73 65 20 69 66 28 20 69 73 61 6c 6e 75 6d 28 63  se if( isalnum(c
10820 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ) ){          /*
10830 20 49 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a   Identifiers */.
10840 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
10850 20 2a 63 70 29 21 3d 30 20 26 26 20 28 69 73 61   *cp)!=0 && (isa
10860 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f  lnum(c) || c=='_
10870 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20  ') ) cp++;.     
10880 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
10890 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
108a0 3a 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 3a 27  :' && cp[1]==':'
108b0 20 26 26 20 63 70 5b 32 5d 3d 3d 27 3d 27 20 29   && cp[2]=='=' )
108c0 7b 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  { /* The operato
108d0 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20 20 20  r "::=" */.     
108e0 20 63 70 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20   cp += 3;.      
108f0 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
10900 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f   /* All other (o
10930 6e 65 20 63 68 61 72 61 63 74 65 72 29 20 6f 70  ne character) op
10940 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20  erators */.     
10950 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78   cp++;.      nex
10960 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a  tcp = cp;.    }.
10970 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20      c = *cp;.   
10980 20 2a 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20   *cp = 0;       
10990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109a0 20 2f 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61   /* Null termina
109b0 74 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  te the token */.
109c0 20 20 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65      parseonetoke
109d0 6e 28 26 70 73 29 3b 20 20 20 20 20 20 20 20 20  n(&ps);         
109e0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65      /* Parse the
109f0 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63   token */.    *c
10a00 70 20 3d 20 63 3b 20 20 20 20 20 20 20 20 20 20  p = c;          
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a20 20 52 65 73 74 6f 72 65 20 74 68 65 20 62 75 66   Restore the buf
10a30 66 65 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20  fer */.    cp = 
10a40 6e 65 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72  nextcp;.  }.  fr
10a50 65 65 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20  ee(filebuf);    
10a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a70 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 62  /* Release the b
10a80 75 66 66 65 72 20 61 66 74 65 72 20 70 61 72 73  uffer after pars
10a90 69 6e 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c  ing */.  gp->rul
10aa0 65 20 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65  e = ps.firstrule
10ab0 3b 0a 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74  ;.  gp->errorcnt
10ac0 20 3d 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a   = ps.errorcnt;.
10ad0 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
10ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
10af0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c  rom the file "pl
10b00 69 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ink.c" *********
10b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
10b20 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f  .** Routines pro
10b30 63 65 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72  cessing configur
10b40 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74  ation follow-set
10b50 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
10b60 6b 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d  ks.** in the LEM
10b70 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
10b80 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  tor..*/.static s
10b90 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69  truct plink *pli
10ba0 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b  nk_freelist = 0;
10bb0 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
10bc0 6e 65 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72  new plink */.str
10bd0 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b  uct plink *Plink
10be0 5f 6e 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74  _new(){.  struct
10bf0 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20   plink *new;..  
10c00 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  if( plink_freeli
10c10 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
10c20 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
10c30 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b  = 100;.    plink
10c40 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72  _freelist = (str
10c50 75 63 74 20 70 6c 69 6e 6b 20 2a 29 6d 61 6c 6c  uct plink *)mall
10c60 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
10c70 74 20 70 6c 69 6e 6b 29 2a 61 6d 74 20 29 3b 0a  t plink)*amt );.
10c80 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72      if( plink_fr
10c90 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
10ca0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
10cb0 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65  r,.      "Unable
10cc0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
10cd0 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f  ory for a new fo
10ce0 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
10cf0 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a  tion link.\n");.
10d00 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
10d10 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
10d20 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
10d30 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69  plink_freelist[i
10d40 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f  ].next = &plink_
10d50 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
10d60 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
10d70 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
10d80 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70  0;.  }.  new = p
10d90 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20  link_freelist;. 
10da0 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20   plink_freelist 
10db0 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  = plink_freelist
10dc0 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  ->next;.  return
10dd0 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20   new;.}../* Add 
10de0 61 20 70 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69  a plink to a pli
10df0 6e 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  nk list */.void 
10e00 50 6c 69 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63  Plink_add(plpp,c
10e10 66 70 29 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b  fp).struct plink
10e20 20 2a 2a 70 6c 70 70 3b 0a 73 74 72 75 63 74 20   **plpp;.struct 
10e30 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20  config *cfp;.{. 
10e40 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
10e50 65 77 3b 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e  ew;.  new = Plin
10e60 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e  k_new();.  new->
10e70 6e 65 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20  next = *plpp;.  
10e80 2a 70 6c 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e  *plpp = new;.  n
10e90 65 77 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d  ew->cfp = cfp;.}
10ea0 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65 76  ../* Transfer ev
10eb0 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65  ery plink on the
10ec0 20 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f 20   list "from" to 
10ed0 74 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f  the list "to" */
10ee0 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79  .void Plink_copy
10ef0 28 74 6f 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74  (to,from).struct
10f00 20 70 6c 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72   plink **to;.str
10f10 75 63 74 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b  uct plink *from;
10f20 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  .{.  struct plin
10f30 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69  k *nextpl;.  whi
10f40 6c 65 28 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20  le( from ){.    
10f50 6e 65 78 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e  nextpl = from->n
10f60 65 78 74 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e  ext;.    from->n
10f70 65 78 74 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a  ext = *to;.    *
10f80 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66  to = from;.    f
10f90 72 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20  rom = nextpl;.  
10fa0 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65  }.}../* Delete e
10fb0 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68  very plink on th
10fc0 65 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50  e list */.void P
10fd0 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29  link_delete(plp)
10fe0 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70  .struct plink *p
10ff0 6c 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70  lp;.{.  struct p
11000 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20  link *nextpl;.. 
11010 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20   while( plp ){. 
11020 20 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d     nextpl = plp-
11030 3e 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e  >next;.    plp->
11040 6e 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  next = plink_fre
11050 65 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b  elist;.    plink
11060 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b  _freelist = plp;
11070 0a 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74 70  .    plp = nextp
11080 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  l;.  }.}./******
11090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110a0 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
110b0 22 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a  "report.c" *****
110c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110d0 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f  *****/./*.** Pro
110e0 63 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e 65  cedures for gene
110f0 72 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20 61  rating reports a
11100 6e 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  nd tables in the
11110 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
11120 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
11130 47 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65 6e  Generate a filen
11140 61 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ame with the giv
11150 65 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61 63  en suffix.  Spac
11160 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  e to hold the.**
11170 20 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d   name comes from
11180 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75   malloc() and mu
11190 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
111a0 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
111b0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41  nction..*/.PRIVA
111c0 54 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61  TE char *file_ma
111d0 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66  kename(lemp,suff
111e0 69 78 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ix).struct lemon
111f0 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75   *lemp;.char *su
11200 66 66 69 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a  ffix;.{.  char *
11210 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70  name;.  char *cp
11220 3b 0a 0a 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c  ;..  name = mall
11230 6f 63 28 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d  oc( strlen(lemp-
11240 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20 73 74 72  >filename) + str
11250 6c 65 6e 28 73 75 66 66 69 78 29 20 2b 20 35 20  len(suffix) + 5 
11260 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30  );.  if( name==0
11270 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
11280 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c  stderr,"Can't al
11290 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
112a0 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29   a filename.\n")
112b0 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
112c0 20 7d 0a 20 20 73 74 72 63 70 79 28 6e 61 6d 65   }.  strcpy(name
112d0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
112e0 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72  ;.  cp = strrchr
112f0 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66  (name,'.');.  if
11300 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30 3b 0a  ( cp ) *cp = 0;.
11310 20 20 73 74 72 63 61 74 28 6e 61 6d 65 2c 73 75    strcat(name,su
11320 66 66 69 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  ffix);.  return 
11330 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e  name;.}../* Open
11340 20 61 20 66 69 6c 65 20 77 69 74 68 20 61 20 6e   a file with a n
11350 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ame based on the
11360 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70   name of the inp
11370 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20  ut file,.** but 
11380 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
11390 20 28 73 70 65 63 69 66 69 65 64 29 20 73 75 66   (specified) suf
113a0 66 69 78 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  fix, and return 
113b0 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
113c0 74 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52  the stream */.PR
113d0 49 56 41 54 45 20 46 49 4c 45 20 2a 66 69 6c 65  IVATE FILE *file
113e0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 73 75 66 66 69  _open(lemp,suffi
113f0 78 2c 6d 6f 64 65 29 0a 73 74 72 75 63 74 20 6c  x,mode).struct l
11400 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72  emon *lemp;.char
11410 20 2a 73 75 66 66 69 78 3b 0a 63 68 61 72 20 2a   *suffix;.char *
11420 6d 6f 64 65 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a  mode;.{.  FILE *
11430 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d  fp;..  if( lemp-
11440 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72 65 65 28  >outname ) free(
11450 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a  lemp->outname);.
11460 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20    lemp->outname 
11470 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28  = file_makename(
11480 6c 65 6d 70 2c 20 73 75 66 66 69 78 29 3b 0a 20  lemp, suffix);. 
11490 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c 65 6d 70   fp = fopen(lemp
114a0 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b  ->outname,mode);
114b0 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 26 26 20  .  if( fp==0 && 
114c0 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b 0a 20 20  *mode=='w' ){.  
114d0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
114e0 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 66 69 6c  ,"Can't open fil
114f0 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d  e \"%s\".\n",lem
11500 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20  p->outname);.   
11510 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
11520 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  +;.    return 0;
11530 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 70  .  }.  return fp
11540 3b 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74  ;.}../* Duplicat
11550 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  e the input file
11560 20 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74   without comment
11570 73 20 61 6e 64 20 77 69 74 68 6f 75 74 20 61 63  s and without ac
11580 74 69 6f 6e 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c  tions .** on rul
11590 65 73 20 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69  es */.void Repri
115a0 6e 74 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  nt(lemp).struct 
115b0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
115c0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
115d0 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
115e0 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20  l *sp;.  int i, 
115f0 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20  j, maxlen, len, 
11600 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a  ncolumns, skip;.
11610 20 20 70 72 69 6e 74 66 28 22 2f 2f 20 52 65 70    printf("// Rep
11620 72 69 6e 74 20 6f 66 20 69 6e 70 75 74 20 66 69  rint of input fi
11630 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53  le \"%s\".\n// S
11640 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d  ymbols:\n",lemp-
11650 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61  >filename);.  ma
11660 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72  xlen = 10;.  for
11670 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
11680 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
11690 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
116a0 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20  ols[i];.    len 
116b0 3d 20 73 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d  = strlen(sp->nam
116c0 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  e);.    if( len>
116d0 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20  maxlen ) maxlen 
116e0 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f  = len;.  }.  nco
116f0 6c 75 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c  lumns = 76/(maxl
11700 65 6e 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f  en+5);.  if( nco
11710 6c 75 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d  lumns<1 ) ncolum
11720 6e 73 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d  ns = 1;.  skip =
11730 20 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20   (lemp->nsymbol 
11740 2b 20 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f  + ncolumns - 1)/
11750 6e 63 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28  ncolumns;.  for(
11760 69 3d 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b  i=0; i<skip; i++
11770 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2f  ){.    printf("/
11780 2f 22 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  /");.    for(j=i
11790 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; j<lemp->nsymbo
117a0 6c 3b 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20  l; j+=skip){.   
117b0 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79     sp = lemp->sy
117c0 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20  mbols[j];.      
117d0 61 73 73 65 72 74 28 20 73 70 2d 3e 69 6e 64 65  assert( sp->inde
117e0 78 3d 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70 72  x==j );.      pr
117f0 69 6e 74 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a  intf(" %3d %-*.*
11800 73 22 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c  s",j,maxlen,maxl
11810 65 6e 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  en,sp->name);.  
11820 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22    }.    printf("
11830 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  \n");.  }.  for(
11840 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
11850 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
11860 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 22  .    printf("%s"
11870 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  ,rp->lhs->name);
11880 0a 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  ./*    if( rp->l
11890 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e 74 66  hsalias ) printf
118a0 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61  ("(%s)",rp->lhsa
118b0 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72  lias); */.    pr
118c0 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20  intf(" ::=");.  
118d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
118e0 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
118f0 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
11900 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65  rp->rhs[i]->name
11910 29 3b 0a 2f 2a 20 20 20 20 20 20 69 66 28 20 72  );./*      if( r
11920 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29  p->rhsalias[i] )
11930 20 70 72 69 6e 74 66 28 22 28 25 73 29 22 2c 72   printf("(%s)",r
11940 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b  p->rhsalias[i]);
11950 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 72   */.    }.    pr
11960 69 6e 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69  intf(".");.    i
11970 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29  f( rp->precsym )
11980 20 70 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c   printf(" [%s]",
11990 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d  rp->precsym->nam
119a0 65 29 3b 0a 2f 2a 20 20 20 20 69 66 28 20 72 70  e);./*    if( rp
119b0 2d 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28  ->code ) printf(
119c0 22 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63  "\n    %s",rp->c
119d0 6f 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69  ode); */.    pri
119e0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d  ntf("\n");.  }.}
119f0 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69  ..void ConfigPri
11a00 6e 74 28 66 70 2c 63 66 70 29 0a 46 49 4c 45 20  nt(fp,cfp).FILE 
11a10 2a 66 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  *fp;.struct conf
11a20 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72  ig *cfp;.{.  str
11a30 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
11a40 69 6e 74 20 69 3b 0a 20 20 72 70 20 3d 20 63 66  int i;.  rp = cf
11a50 70 2d 3e 72 70 3b 0a 20 20 66 70 72 69 6e 74 66  p->rp;.  fprintf
11a60 28 66 70 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d  (fp,"%s ::=",rp-
11a70 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66  >lhs->name);.  f
11a80 6f 72 28 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e  or(i=0; i<=rp->n
11a90 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rhs; i++){.    i
11aa0 66 28 20 69 3d 3d 63 66 70 2d 3e 64 6f 74 20 29  f( i==cfp->dot )
11ab0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 2a 22   fprintf(fp," *"
11ac0 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 72 70  );.    if( i==rp
11ad0 2d 3e 6e 72 68 73 20 29 20 62 72 65 61 6b 3b 0a  ->nrhs ) break;.
11ae0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
11af0 20 25 73 22 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d   %s",rp->rhs[i]-
11b00 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >name);.  }.}../
11b10 2a 20 23 64 65 66 69 6e 65 20 54 45 53 54 20 2a  * #define TEST *
11b20 2f 0a 23 69 66 64 65 66 20 54 45 53 54 0a 2f 2a  /.#ifdef TEST./*
11b30 20 50 72 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a   Print a set */.
11b40 50 52 49 56 41 54 45 20 76 6f 69 64 20 53 65 74  PRIVATE void Set
11b50 50 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65  Print(out,set,le
11b60 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63  mp).FILE *out;.c
11b70 68 61 72 20 2a 73 65 74 3b 0a 73 74 72 75 63 74  har *set;.struct
11b80 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
11b90 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
11ba0 2a 73 70 61 63 65 72 3b 0a 20 20 73 70 61 63 65  *spacer;.  space
11bb0 72 20 3d 20 22 22 3b 0a 20 20 66 70 72 69 6e 74  r = "";.  fprint
11bc0 66 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c 22 22  f(out,"%12s[",""
11bd0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
11be0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
11bf0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
11c00 65 74 46 69 6e 64 28 73 65 74 2c 69 29 20 29 7b  etFind(set,i) ){
11c10 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
11c20 75 74 2c 22 25 73 25 73 22 2c 73 70 61 63 65 72  ut,"%s%s",spacer
11c30 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
11c40 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
11c50 73 70 61 63 65 72 20 3d 20 22 20 22 3b 0a 20 20  spacer = " ";.  
11c60 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
11c70 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a  f(out,"]\n");.}.
11c80 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c 69 6e  ./* Print a plin
11c90 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41  k chain */.PRIVA
11ca0 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69  TE void PlinkPri
11cb0 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a  nt(out,plp,tag).
11cc0 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63  FILE *out;.struc
11cd0 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68  t plink *plp;.ch
11ce0 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69  ar *tag;.{.  whi
11cf0 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 66  le( plp ){.    f
11d00 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73  printf(out,"%12s
11d10 25 73 20 28 73 74 61 74 65 20 25 32 64 29 20 22  %s (state %2d) "
11d20 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70  ,"",tag,plp->cfp
11d30 2d 3e 73 74 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  ->stp->index);. 
11d40 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f     ConfigPrint(o
11d50 75 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20  ut,plp->cfp);.  
11d60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
11d70 6e 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70  n");.    plp = p
11d80 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a  lp->next;.  }.}.
11d90 23 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74  #endif../* Print
11da0 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 74 68   an action to th
11db0 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
11dc0 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
11dd0 20 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74   FALSE if.** not
11de0 68 69 6e 67 20 77 61 73 20 61 63 74 75 61 6c 6c  hing was actuall
11df0 79 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e  y printed..*/.in
11e00 74 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 73 74  t PrintAction(st
11e10 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c  ruct action *ap,
11e20 20 46 49 4c 45 20 2a 66 70 2c 20 69 6e 74 20 69   FILE *fp, int i
11e30 6e 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 65  ndent){.  int re
11e40 73 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77 69 74  sult = 1;.  swit
11e50 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a  ch( ap->type ){.
11e60 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 0a      case SHIFT:.
11e70 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
11e80 2c 22 25 2a 73 20 73 68 69 66 74 20 20 25 64 22  ,"%*s shift  %d"
11e90 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
11ea0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
11eb0 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72  index);.      br
11ec0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45  eak;.    case RE
11ed0 44 55 43 45 3a 0a 20 20 20 20 20 20 66 70 72 69  DUCE:.      fpri
11ee0 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75  ntf(fp,"%*s redu
11ef0 63 65 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70  ce %d",indent,ap
11f00 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78  ->sp->name,ap->x
11f10 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  .rp->index);.   
11f20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11f30 73 65 20 41 43 43 45 50 54 3a 0a 20 20 20 20 20  se ACCEPT:.     
11f40 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
11f50 20 61 63 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c   accept",indent,
11f60 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  ap->sp->name);. 
11f70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11f80 63 61 73 65 20 45 52 52 4f 52 3a 0a 20 20 20 20  case ERROR:.    
11f90 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
11fa0 73 20 65 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c  s error",indent,
11fb0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  ap->sp->name);. 
11fc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11fd0 63 61 73 65 20 43 4f 4e 46 4c 49 43 54 3a 0a 20  case CONFLICT:. 
11fe0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
11ff0 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64  "%*s reduce %-3d
12000 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
12010 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20  lict **",.      
12020 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
12030 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
12040 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72  index);.      br
12050 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48  eak;.    case SH
12060 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63  _RESOLVED:.    c
12070 61 73 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a  ase RD_RESOLVED:
12080 0a 20 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53  .    case NOT_US
12090 45 44 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74  ED:.      result
120a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
120b0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
120c0 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65  result;.}../* Ge
120d0 6e 65 72 61 74 65 20 74 68 65 20 22 79 2e 6f 75  nerate the "y.ou
120e0 74 70 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a  tput" log file *
120f0 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74  /.void ReportOut
12100 70 75 74 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  put(lemp).struct
12110 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
12120 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
12130 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
12140 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
12150 66 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  fp;.  struct act
12160 69 6f 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20  ion *ap;.  FILE 
12170 2a 66 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c  *fp;..  fp = fil
12180 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75  e_open(lemp,".ou
12190 74 22 2c 22 77 22 29 3b 0a 20 20 69 66 28 20 66  t","w");.  if( f
121a0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
121b0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 5c 62   fprintf(fp," \b
121c0 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
121d0 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
121e0 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
121f0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
12200 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
12210 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c 73 74 70  State %d:\n",stp
12220 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 69 66  ->index);.    if
12230 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61  ( lemp->basisfla
12240 67 20 29 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b  g ) cfp=stp->bp;
12250 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20  .    else       
12260 20 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 73             cfp=s
12270 74 70 2d 3e 63 66 70 3b 0a 20 20 20 20 77 68 69  tp->cfp;.    whi
12280 6c 65 28 20 63 66 70 20 29 7b 0a 20 20 20 20 20  le( cfp ){.     
12290 20 63 68 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20   char buf[20];. 
122a0 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f       if( cfp->do
122b0 74 3d 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73  t==cfp->rp->nrhs
122c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69   ){.        spri
122d0 6e 74 66 28 62 75 66 2c 22 28 25 64 29 22 2c 63  ntf(buf,"(%d)",c
122e0 66 70 2d 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a  fp->rp->index);.
122f0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
12300 66 70 2c 22 20 20 20 20 25 35 73 20 22 2c 62 75  fp,"    %5s ",bu
12310 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  f);.      }else{
12320 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
12330 28 66 70 2c 22 20 20 20 20 20 20 20 20 20 20 22  (fp,"          "
12340 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12350 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c   ConfigPrint(fp,
12360 63 66 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69  cfp);.      fpri
12370 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69  ntf(fp,"\n");.#i
12380 66 64 65 66 20 54 45 53 54 0a 20 20 20 20 20 20  fdef TEST.      
12390 53 65 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  SetPrint(fp,cfp-
123a0 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20  >fws,lemp);.    
123b0 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c    PlinkPrint(fp,
123c0 63 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22  cfp->fplp,"To  "
123d0 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
123e0 69 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70  int(fp,cfp->bplp
123f0 2c 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66  ,"From");.#endif
12400 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  .      if( lemp-
12410 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70  >basisflag ) cfp
12420 3d 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20  =cfp->bp;.      
12430 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
12440 20 20 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e        cfp=cfp->n
12450 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ext;.    }.    f
12460 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
12470 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
12480 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
12490 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
124a0 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c   PrintAction(ap,
124b0 66 70 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66  fp,30) ) fprintf
124c0 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  (fp,"\n");.    }
124d0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
124e0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c  "\n");.  }.  fcl
124f0 6f 73 65 28 66 70 29 3b 0a 20 20 72 65 74 75 72  ose(fp);.  retur
12500 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20  n;.}../* Search 
12510 66 6f 72 20 74 68 65 20 66 69 6c 65 20 22 6e 61  for the file "na
12520 6d 65 22 20 77 68 69 63 68 20 69 73 20 69 6e 20  me" which is in 
12530 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
12540 72 79 20 61 73 0a 2a 2a 20 74 68 65 20 65 78 61  ry as.** the exa
12550 63 75 74 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41  cutable */.PRIVA
12560 54 45 20 63 68 61 72 20 2a 70 61 74 68 73 65 61  TE char *pathsea
12570 72 63 68 28 61 72 67 76 30 2c 6e 61 6d 65 2c 6d  rch(argv0,name,m
12580 6f 64 65 6d 61 73 6b 29 0a 63 68 61 72 20 2a 61  odemask).char *a
12590 72 67 76 30 3b 0a 63 68 61 72 20 2a 6e 61 6d 65  rgv0;.char *name
125a0 3b 0a 69 6e 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a  ;.int modemask;.
125b0 7b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 6c 69  {.  char *pathli
125c0 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  st;.  char *path
125d0 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a  ,*cp;.  char c;.
125e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63    extern int acc
125f0 65 73 73 28 29 3b 0a 0a 23 69 66 64 65 66 20 5f  ess();..#ifdef _
12600 5f 57 49 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20  _WIN32__.  cp = 
12610 73 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 5c  strrchr(argv0,'\
12620 5c 27 29 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20  \');.#else.  cp 
12630 3d 20 73 74 72 72 63 68 72 28 61 72 67 76 30 2c  = strrchr(argv0,
12640 27 2f 27 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  '/');.#endif.  i
12650 66 28 20 63 70 20 29 7b 0a 20 20 20 20 63 20 3d  f( cp ){.    c =
12660 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20   *cp;.    *cp = 
12670 30 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63  0;.    path = (c
12680 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 74  har *)malloc( st
12690 72 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 73 74  rlen(argv0) + st
126a0 72 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29  rlen(name) + 2 )
126b0 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 20 29  ;.    if( path )
126c0 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25   sprintf(path,"%
126d0 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65  s/%s",argv0,name
126e0 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a  );.    *cp = c;.
126f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 74    }else{.    ext
12700 65 72 6e 20 63 68 61 72 20 2a 67 65 74 65 6e 76  ern char *getenv
12710 28 29 3b 0a 20 20 20 20 70 61 74 68 6c 69 73 74  ();.    pathlist
12720 20 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48 22   = getenv("PATH"
12730 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c  );.    if( pathl
12740 69 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73  ist==0 ) pathlis
12750 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72  t = ".:/bin:/usr
12760 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 20  /bin";.    path 
12770 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
12780 28 20 73 74 72 6c 65 6e 28 70 61 74 68 6c 69 73  ( strlen(pathlis
12790 74 29 2b 73 74 72 6c 65 6e 28 6e 61 6d 65 29 2b  t)+strlen(name)+
127a0 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74  2 );.    if( pat
127b0 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 68  h!=0 ){.      wh
127c0 69 6c 65 28 20 2a 70 61 74 68 6c 69 73 74 20 29  ile( *pathlist )
127d0 7b 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 73  {.        cp = s
127e0 74 72 63 68 72 28 70 61 74 68 6c 69 73 74 2c 27  trchr(pathlist,'
127f0 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :');.        if(
12800 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 26 70   cp==0 ) cp = &p
12810 61 74 68 6c 69 73 74 5b 73 74 72 6c 65 6e 28 70  athlist[strlen(p
12820 61 74 68 6c 69 73 74 29 5d 3b 0a 20 20 20 20 20  athlist)];.     
12830 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20     c = *cp;.    
12840 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20      *cp = 0;.   
12850 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 61 74       sprintf(pat
12860 68 2c 22 25 73 2f 25 73 22 2c 70 61 74 68 6c 69  h,"%s/%s",pathli
12870 73 74 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  st,name);.      
12880 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20 20    *cp = c;.     
12890 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 70 61     if( c==0 ) pa
128a0 74 68 6c 69 73 74 20 3d 20 22 22 3b 0a 20 20 20  thlist = "";.   
128b0 20 20 20 20 20 65 6c 73 65 20 70 61 74 68 6c 69       else pathli
128c0 73 74 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20  st = &cp[1];.   
128d0 20 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28       if( access(
128e0 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d  path,modemask)==
128f0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
12900 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
12910 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f  eturn path;.}../
12920 2a 20 47 69 76 65 6e 20 61 6e 20 61 63 74 69 6f  * Given an actio
12930 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 69  n, compute the i
12940 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72  nteger value for
12950 20 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20   that action.** 
12960 77 68 69 63 68 20 69 73 20 74 6f 20 62 65 20 70  which is to be p
12970 75 74 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e  ut in the action
12980 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 67 65   table of the ge
12990 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e 65 2e  nerated machine.
129a0 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74  .** Return negat
129b0 69 76 65 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e  ive if no action
129c0 20 73 68 6f 75 6c 64 20 62 65 20 67 65 6e 65 72   should be gener
129d0 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  ated..*/.PRIVATE
129e0 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63 74   int compute_act
129f0 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 0a 73 74 72  ion(lemp,ap).str
12a00 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
12a10 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  .struct action *
12a20 61 70 3b 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b  ap;.{.  int act;
12a30 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74  .  switch( ap->t
12a40 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
12a50 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61 70  SHIFT:  act = ap
12a60 2d 3e 78 2e 73 74 70 2d 3e 69 6e 64 65 78 3b 20  ->x.stp->index; 
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
12a80 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45  eak;.    case RE
12a90 44 55 43 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e  DUCE: act = ap->
12aa0 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65  x.rp->index + le
12ab0 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 62 72 65 61  mp->nstate; brea
12ac0 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f  k;.    case ERRO
12ad0 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e  R:  act = lemp->
12ae0 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e  nstate + lemp->n
12af0 72 75 6c 65 3b 20 20 20 20 20 62 72 65 61 6b 3b  rule;     break;
12b00 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50 54  .    case ACCEPT
12b10 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73  : act = lemp->ns
12b20 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75  tate + lemp->nru
12b30 6c 65 20 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20  le + 1; break;. 
12b40 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
12b50 61 63 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b  act = -1; break;
12b60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 63  .  }.  return ac
12b70 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49  t;.}..#define LI
12b80 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54  NESIZE 1000./* T
12b90 68 65 20 6e 65 78 74 20 63 6c 75 73 74 65 72 20  he next cluster 
12ba0 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
12bb0 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  for reading the 
12bc0 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a  template file.**
12bd0 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74 68 65   and writing the
12be0 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20   results to the 
12bf0 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72  generated parser
12c00 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73 74   */./* The first
12c10 20 66 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66   function transf
12c20 65 72 73 20 64 61 74 61 20 66 72 6f 6d 20 22 69  ers data from "i
12c30 6e 22 20 74 6f 20 22 6f 75 74 22 20 75 6e 74 69  n" to "out" unti
12c40 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20 73  l.** a line is s
12c50 65 65 6e 20 77 68 69 63 68 20 62 65 67 69 6e 73  een which begins
12c60 20 77 69 74 68 20 22 25 25 22 2e 20 20 54 68 65   with "%%".  The
12c70 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a   line number is.
12c80 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a  ** tracked..**.*
12c90 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68  * if name!=0, th
12ca0 65 6e 20 61 6e 79 20 77 6f 72 64 20 74 68 61 74  en any word that
12cb0 20 62 65 67 69 6e 20 77 69 74 68 20 22 50 61 72   begin with "Par
12cc0 73 65 22 20 69 73 20 63 68 61 6e 67 65 64 20 74  se" is changed t
12cd0 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69 74 68 20  o.** begin with 
12ce0 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a  *name instead..*
12cf0 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
12d00 70 6c 74 5f 78 66 65 72 28 6e 61 6d 65 2c 69 6e  plt_xfer(name,in
12d10 2c 6f 75 74 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61  ,out,lineno).cha
12d20 72 20 2a 6e 61 6d 65 3b 0a 46 49 4c 45 20 2a 69  r *name;.FILE *i
12d30 6e 3b 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e  n;.FILE *out;.in
12d40 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69  t *lineno;.{.  i
12d50 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20  nt i, iStart;.  
12d60 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49  char line[LINESI
12d70 5a 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67  ZE];.  while( fg
12d80 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a  ets(line,LINESIZ
12d90 45 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30  E,in) && (line[0
12da0 5d 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31  ]!='%' || line[1
12db0 5d 21 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28  ]!='%') ){.    (
12dc0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
12dd0 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20  iStart = 0;.    
12de0 69 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20  if( name ){.    
12df0 20 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b    for(i=0; line[
12e00 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
12e10 20 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27    if( line[i]=='
12e20 50 27 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c  P' && strncmp(&l
12e30 69 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35  ine[i],"Parse",5
12e40 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )==0.          &
12e50 26 20 28 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c  & (i==0 || !isal
12e60 70 68 61 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a  pha(line[i-1])).
12e70 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
12e80 20 20 20 20 20 69 66 28 20 69 3e 69 53 74 61 72       if( i>iStar
12e90 74 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  t ) fprintf(out,
12ea0 22 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c  "%.*s",i-iStart,
12eb0 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a  &line[iStart]);.
12ec0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
12ed0 66 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29  f(out,"%s",name)
12ee0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
12ef0 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53   4;.          iS
12f00 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20  tart = i+1;.    
12f10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12f20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
12f30 6f 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69  out,"%s",&line[i
12f40 53 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start]);.  }.}..
12f50 2f 2a 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63  /* The next func
12f60 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74  tion finds the t
12f70 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64  emplate file and
12f80 20 6f 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72   opens it, retur
12f90 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  ning.** a pointe
12fa0 72 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  r to the opened 
12fb0 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45  file. */.PRIVATE
12fc0 20 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e   FILE *tplt_open
12fd0 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
12fe0 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73  mon *lemp;.{.  s
12ff0 74 61 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c  tatic char templ
13000 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d  atename[] = "lem
13010 70 61 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62  par.c";.  char b
13020 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45  uf[1000];.  FILE
13030 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70   *in;.  char *tp
13040 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a  ltname;.  char *
13050 63 70 3b 0a 0a 20 20 63 70 20 3d 20 73 74 72 72  cp;..  cp = strr
13060 63 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  chr(lemp->filena
13070 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63  me,'.');.  if( c
13080 70 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  p ){.    sprintf
13090 28 62 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28  (buf,"%.*s.lt",(
130a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 63 70  unsigned long)cp
130b0 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  -(unsigned long)
130c0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 6c  lemp->filename,l
130d0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
130e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72    }else{.    spr
130f0 69 6e 74 66 28 62 75 66 2c 22 25 73 2e 6c 74 22  intf(buf,"%s.lt"
13100 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
13110 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63 65  ;.  }.  if( acce
13120 73 73 28 62 75 66 2c 30 30 34 29 3d 3d 30 20 29  ss(buf,004)==0 )
13130 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d  {.    tpltname =
13140 20 62 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66   buf;.  }else if
13150 28 20 61 63 63 65 73 73 28 74 65 6d 70 6c 61 74  ( access(templat
13160 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b  ename,004)==0 ){
13170 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20  .    tpltname = 
13180 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20  templatename;.  
13190 7d 65 6c 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e  }else{.    tpltn
131a0 61 6d 65 20 3d 20 70 61 74 68 73 65 61 72 63 68  ame = pathsearch
131b0 28 6c 65 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d  (lemp->argv0,tem
131c0 70 6c 61 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20  platename,0);.  
131d0 7d 0a 20 20 69 66 28 20 74 70 6c 74 6e 61 6d 65  }.  if( tpltname
131e0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
131f0 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
13200 20 66 69 6e 64 20 74 68 65 20 70 61 72 73 65 72   find the parser
13210 20 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65   driver template
13220 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
13230 2c 0a 20 20 20 20 74 65 6d 70 6c 61 74 65 6e 61  ,.    templatena
13240 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  me);.    lemp->e
13250 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
13260 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
13270 6e 20 3d 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61  n = fopen(tpltna
13280 6d 65 2c 22 72 22 29 3b 0a 20 20 69 66 28 20 69  me,"r");.  if( i
13290 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  n==0 ){.    fpri
132a0 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
132b0 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c  t open the templ
132c0 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  ate file \"%s\".
132d0 5c 6e 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  \n",templatename
132e0 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
132f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
13300 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
13310 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72  urn in;.}../* Pr
13320 69 6e 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20  int a string to 
13330 74 68 65 20 66 69 6c 65 20 61 6e 64 20 6b 65 65  the file and kee
13340 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72  p the linenumber
13350 20 75 70 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50   up to date */.P
13360 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
13370 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
13380 73 74 72 2c 73 74 72 6c 6e 2c 6c 69 6e 65 6e 6f  str,strln,lineno
13390 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
133a0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
133b0 0a 63 68 61 72 20 2a 73 74 72 3b 0a 69 6e 74 20  .char *str;.int 
133c0 73 74 72 6c 6e 3b 0a 69 6e 74 20 2a 6c 69 6e 65  strln;.int *line
133d0 6e 6f 3b 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d  no;.{.  if( str=
133e0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
133f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e  printf(out,"#lin
13400 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 73  e %d \"%s\"\n",s
13410 74 72 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  trln,lemp->filen
13420 61 6d 65 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ame); (*lineno)+
13430 2b 3b 0a 20 20 77 68 69 6c 65 28 20 2a 73 74 72  +;.  while( *str
13440 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 73 74 72   ){.    if( *str
13450 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
13460 6f 29 2b 2b 3b 0a 20 20 20 20 70 75 74 63 28 2a  o)++;.    putc(*
13470 73 74 72 2c 6f 75 74 29 3b 0a 20 20 20 20 73 74  str,out);.    st
13480 72 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  r++;.  }.  fprin
13490 74 66 28 6f 75 74 2c 22 5c 6e 23 6c 69 6e 65 20  tf(out,"\n#line 
134a0 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c 69  %d \"%s\"\n",*li
134b0 6e 65 6e 6f 2b 32 2c 6c 65 6d 70 2d 3e 6f 75 74  neno+2,lemp->out
134c0 6e 61 6d 65 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  name); (*lineno)
134d0 2b 3d 32 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  +=2;.  return;.}
134e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
134f0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d  owing routine em
13500 69 74 73 20 63 6f 64 65 20 66 6f 72 20 74 68 65  its code for the
13510 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
13520 74 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70  the.** symbol sp
13530 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65  .*/.void emit_de
13540 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
13550 74 2c 73 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f  t,sp,lemp,lineno
13560 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
13570 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
13580 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
13590 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b  mp;.int *lineno;
135a0 0a 7b 0a 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20  .{. char *cp;.. 
135b0 69 6e 74 20 6c 69 6e 65 63 6e 74 20 3d 20 30 3b  int linecnt = 0;
135c0 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d  . if( sp->type==
135d0 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 63  TERMINAL ){.   c
135e0 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64  p = lemp->tokend
135f0 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d  est;.   if( cp==
13600 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 66  0 ) return;.   f
13610 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e  printf(out,"#lin
13620 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 7b 22 2c  e %d \"%s\"\n{",
13630 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 6c  lemp->tokendestl
13640 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  n,lemp->filename
13650 29 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70  );. }else if( sp
13660 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a  ->destructor ){.
13670 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74     cp = sp->dest
13680 72 75 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e  ructor;.   fprin
13690 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64  tf(out,"#line %d
136a0 20 5c 22 25 73 5c 22 5c 6e 7b 22 2c 73 70 2d 3e   \"%s\"\n{",sp->
136b0 64 65 73 74 72 75 63 74 6f 72 6c 6e 2c 6c 65 6d  destructorln,lem
136c0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d  p->filename);. }
136d0 65 6c 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76  else if( lemp->v
136e0 61 72 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20  ardest ){.   cp 
136f0 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b  = lemp->vardest;
13700 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20  .   if( cp==0 ) 
13710 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e  return;.   fprin
13720 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64  tf(out,"#line %d
13730 20 5c 22 25 73 5c 22 5c 6e 7b 22 2c 6c 65 6d 70   \"%s\"\n{",lemp
13740 2d 3e 76 61 72 64 65 73 74 6c 6e 2c 6c 65 6d 70  ->vardestln,lemp
13750 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d 0a  ->filename);. }.
13760 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70 2b 2b   for(; *cp; cp++
13770 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27  ){.   if( *cp=='
13780 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 24 27  $' && cp[1]=='$'
13790 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e 74 66   ){.     fprintf
137a0 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f 72 2d  (out,"(yypminor-
137b0 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74 6e 75  >yy%d)",sp->dtnu
137c0 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b 0a 20  m);.     cp++;. 
137d0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
137e0 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27   }.   if( *cp=='
137f0 5c 6e 27 20 29 20 6c 69 6e 65 63 6e 74 2b 2b 3b  \n' ) linecnt++;
13800 0a 20 20 20 66 70 75 74 63 28 2a 63 70 2c 6f 75  .   fputc(*cp,ou
13810 74 29 3b 0a 20 7d 0a 20 28 2a 6c 69 6e 65 6e 6f  t);. }. (*lineno
13820 29 20 2b 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74  ) += 3 + linecnt
13830 3b 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ;. fprintf(out,"
13840 7d 5c 6e 23 6c 69 6e 65 20 25 64 20 5c 22 25 73  }\n#line %d \"%s
13850 5c 22 5c 6e 22 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65  \"\n",*lineno,le
13860 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 72  mp->outname);. r
13870 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
13880 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
13890 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20 67 69  -zero) if the gi
138a0 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20 61  ven symbol has a
138b0 20 64 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a   destructor..*/.
138c0 69 6e 74 20 68 61 73 5f 64 65 73 74 72 75 63 74  int has_destruct
138d0 6f 72 28 73 70 2c 20 6c 65 6d 70 29 0a 73 74 72  or(sp, lemp).str
138e0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
138f0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
13900 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b  mp;.{.  int ret;
13910 0a 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .  if( sp->type=
13920 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
13930 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b   ret = lemp->tok
13940 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65 6c  endest!=0;.  }el
13950 73 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65  se{.    ret = le
13960 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20 7c  mp->vardest!=0 |
13970 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  | sp->destructor
13980 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  !=0;.  }.  retur
13990 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  n ret;.}../* .**
139a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
139b0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
139c0 65 6e 20 74 68 65 20 72 75 6c 65 20 22 72 70 22  en the rule "rp"
139d0 20 69 73 20 72 65 64 75 63 65 64 2e 20 20 57 72   is reduced.  Wr
139e0 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f 64 65 20  ite.** the code 
139f0 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61 6b 65 20  to "out".  Make 
13a00 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73 74 61 79  sure lineno stay
13a10 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f  s up-to-date..*/
13a20 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 65 6d  .PRIVATE void em
13a30 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c  it_code(out,rp,l
13a40 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45  emp,lineno).FILE
13a50 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 72 75   *out;.struct ru
13a60 6c 65 20 2a 72 70 3b 0a 73 74 72 75 63 74 20 6c  le *rp;.struct l
13a70 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20  emon *lemp;.int 
13a80 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72  *lineno;.{. char
13a90 20 2a 63 70 2c 20 2a 78 70 3b 0a 20 69 6e 74 20   *cp, *xp;. int 
13aa0 6c 69 6e 65 63 6e 74 20 3d 20 30 3b 0a 20 69 6e  linecnt = 0;. in
13ab0 74 20 69 3b 0a 20 63 68 61 72 20 6c 68 73 75 73  t i;. char lhsus
13ac0 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72  ed = 0;    /* Tr
13ad0 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 65 6c  ue if the LHS el
13ae0 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 20 75  ement has been u
13af0 73 65 64 20 2a 2f 0a 20 63 68 61 72 20 75 73 65  sed */. char use
13b00 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20 2f 2a 20  d[MAXRHS];   /* 
13b10 54 72 75 65 20 66 6f 72 20 65 61 63 68 20 52 48  True for each RH
13b20 53 20 65 6c 65 6d 65 6e 74 20 77 68 69 63 68 20  S element which 
13b30 69 73 20 75 73 65 64 20 2a 2f 0a 0a 20 66 6f 72  is used */.. for
13b40 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
13b50 3b 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d  ; i++) used[i] =
13b60 20 30 3b 0a 20 6c 68 73 75 73 65 64 20 3d 20 30   0;. lhsused = 0
13b70 3b 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ;.. /* Generate 
13b80 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 72  code to do the r
13b90 65 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a  educe action */.
13ba0 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b   if( rp->code ){
13bb0 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
13bc0 22 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22  "#line %d \"%s\"
13bd0 5c 6e 7b 22 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65  \n{",rp->line,le
13be0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
13bf0 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64    for(cp=rp->cod
13c00 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20  e; *cp; cp++){. 
13c10 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28      if( isalpha(
13c20 2a 63 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d  *cp) && (cp==rp-
13c30 3e 63 6f 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e  >code || (!isaln
13c40 75 6d 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70  um(cp[-1]) && cp
13c50 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20  [-1]!='_')) ){. 
13c60 20 20 20 20 20 20 63 68 61 72 20 73 61 76 65 64        char saved
13c70 3b 0a 20 20 20 20 20 20 20 66 6f 72 28 78 70 3d  ;.       for(xp=
13c80 20 26 63 70 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d   &cp[1]; isalnum
13c90 28 2a 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f  (*xp) || *xp=='_
13ca0 27 3b 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20  '; xp++);.      
13cb0 20 73 61 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20   saved = *xp;.  
13cc0 20 20 20 20 20 2a 78 70 20 3d 20 30 3b 0a 20 20       *xp = 0;.  
13cd0 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
13ce0 61 6c 69 61 73 20 26 26 20 73 74 72 63 6d 70 28  alias && strcmp(
13cf0 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  cp,rp->lhsalias)
13d00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
13d10 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 79 79 67  fprintf(out,"yyg
13d20 6f 74 6f 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 72  otominor.yy%d",r
13d30 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a  p->lhs->dtnum);.
13d40 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70           cp = xp
13d50 3b 0a 20 20 20 20 20 20 20 20 20 6c 68 73 75 73  ;.         lhsus
13d60 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 7d  ed = 1;.       }
13d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 66  else{.         f
13d80 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
13d90 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
13da0 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73       if( rp->rhs
13db0 61 6c 69 61 73 5b 69 5d 20 26 26 20 73 74 72 63  alias[i] && strc
13dc0 6d 70 28 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69  mp(cp,rp->rhsali
13dd0 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20  as[i])==0 ){.   
13de0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
13df0 66 28 6f 75 74 2c 22 79 79 6d 73 70 5b 25 64 5d  f(out,"yymsp[%d]
13e00 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 69 2d 72  .minor.yy%d",i-r
13e10 70 2d 3e 6e 72 68 73 2b 31 2c 72 70 2d 3e 72 68  p->nrhs+1,rp->rh
13e20 73 5b 69 5d 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20  s[i]->dtnum);.  
13e30 20 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20             cp = 
13e40 78 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  xp;.            
13e50 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20   used[i] = 1;.  
13e60 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
13e70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ;.           }. 
13e80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13e90 20 7d 0a 20 20 20 20 20 20 20 2a 78 70 20 3d 20   }.       *xp = 
13ea0 73 61 76 65 64 3b 0a 20 20 20 20 20 7d 0a 20 20  saved;.     }.  
13eb0 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27     if( *cp=='\n'
13ec0 20 29 20 6c 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20   ) linecnt++;.  
13ed0 20 20 20 66 70 75 74 63 28 2a 63 70 2c 6f 75 74     fputc(*cp,out
13ee0 29 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  );.   } /* End l
13ef0 6f 6f 70 20 2a 2f 0a 20 20 20 28 2a 6c 69 6e 65  oop */.   (*line
13f00 6e 6f 29 20 2b 3d 20 33 20 2b 20 6c 69 6e 65 63  no) += 3 + linec
13f10 6e 74 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  nt;.   fprintf(o
13f20 75 74 2c 22 7d 5c 6e 23 6c 69 6e 65 20 25 64 20  ut,"}\n#line %d 
13f30 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c 69 6e 65 6e  \"%s\"\n",*linen
13f40 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  o,lemp->outname)
13f50 3b 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20  ;. } /* End if( 
13f60 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20  rp->code ) */.. 
13f70 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
13f80 20 73 75 72 65 20 74 68 65 20 4c 48 53 20 68 61   sure the LHS ha
13f90 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
13fa0 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
13fb0 20 26 26 20 21 6c 68 73 75 73 65 64 20 29 7b 0a   && !lhsused ){.
13fc0 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
13fd0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
13fe0 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 22 4c  uleline,.     "L
13ff0 61 62 65 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20  abel \"%s\" for 
14000 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65  \"%s(%s)\" is ne
14010 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20  ver used.",.    
14020 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c     rp->lhsalias,
14030 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70  rp->lhs->name,rp
14040 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
14050 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
14060 3b 0a 20 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72 61  ;. }.. /* Genera
14070 74 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f  te destructor co
14080 64 65 20 66 6f 72 20 52 48 53 20 73 79 6d 62 6f  de for RHS symbo
14090 6c 73 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ls which are not
140a0 20 75 73 65 64 20 69 6e 20 74 68 65 0a 20 2a 2a   used in the. **
140b0 20 72 65 64 75 63 65 20 63 6f 64 65 20 2a 2f 0a   reduce code */.
140c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
140d0 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 69  nrhs; i++){.   i
140e0 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
140f0 69 5d 20 26 26 20 21 75 73 65 64 5b 69 5d 20 29  i] && !used[i] )
14100 7b 0a 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28  {.     ErrorMsg(
14110 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72  lemp->filename,r
14120 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20  p->ruleline,.   
14130 20 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f      "Label %s fo
14140 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20  r \"%s(%s)\" is 
14150 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20  never used.",.  
14160 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
14170 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  s[i],rp->rhs[i]-
14180 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69  >name,rp->rhsali
14190 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 6c 65 6d  as[i]);.     lem
141a0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
141b0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e    }else if( rp->
141c0 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29  rhsalias[i]==0 )
141d0 7b 0a 20 20 20 20 20 69 66 28 20 68 61 73 5f 64  {.     if( has_d
141e0 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68  estructor(rp->rh
141f0 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20  s[i],lemp) ){.  
14200 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
14210 2c 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f  ,"  yy_destructo
14220 72 28 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e  r(%d,&yymsp[%d].
14230 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 0a 20 20 20 20  minor);\n",.    
14240 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
14250 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72  ->index,i-rp->nr
14260 68 73 2b 31 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  hs+1); (*lineno)
14270 2b 2b 3b 0a 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ++;.     }else{.
14280 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
14290 75 74 2c 22 20 20 20 20 20 20 20 20 2f 2a 20 4e  ut,"        /* N
142a0 6f 20 64 65 73 74 72 75 63 74 6f 72 20 64 65 66  o destructor def
142b0 69 6e 65 64 20 66 6f 72 20 25 73 20 2a 2f 5c 6e  ined for %s */\n
142c0 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 72  ",.        rp->r
142d0 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  hs[i]->name);.  
142e0 20 20 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b        (*lineno)+
142f0 2b 3b 0a 20 20 20 20 20 7d 0a 20 20 20 7d 0a 20  +;.     }.   }. 
14300 7d 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  }. return;.}../*
14310 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 64 65  .** Print the de
14320 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
14330 75 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 74  union used for t
14340 68 65 20 70 61 72 73 65 72 27 73 20 64 61 74 61  he parser's data
14350 20 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20   stack..** This 
14360 75 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66  union contains f
14370 69 65 6c 64 73 20 66 6f 72 20 65 76 65 72 79 20  ields for every 
14380 70 6f 73 73 69 62 6c 65 20 64 61 74 61 20 74 79  possible data ty
14390 70 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a  pe for tokens.**
143a0 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
143b0 73 2e 20 20 49 6e 20 74 68 65 20 70 72 6f 63 65  s.  In the proce
143c0 73 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20  ss of computing 
143d0 61 6e 64 20 70 72 69 6e 74 69 6e 67 20 74 68 69  and printing thi
143e0 73 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f  s.** union, also
143f0 20 73 65 74 20 74 68 65 20 22 2e 64 74 6e 75 6d   set the ".dtnum
14400 22 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  " field of every
14410 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f   terminal and no
14420 6e 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d  nterminal.** sym
14430 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69  bol..*/.void pri
14440 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f  nt_stack_union(o
14450 75 74 2c 6c 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c  ut,lemp,plineno,
14460 6d 68 66 6c 61 67 29 0a 46 49 4c 45 20 2a 6f 75  mhflag).FILE *ou
14470 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
14480 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
14490 74 20 73 74 72 65 61 6d 20 2a 2f 0a 73 74 72 75  t stream */.stru
144a0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20  ct lemon *lemp; 
144b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
144c0 61 69 6e 20 69 6e 66 6f 20 73 74 72 75 63 74 75  ain info structu
144d0 72 65 20 66 6f 72 20 74 68 69 73 20 70 61 72 73  re for this pars
144e0 65 72 20 2a 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65  er */.int *pline
144f0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
14500 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
14510 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
14520 2a 2f 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20  */.int mhflag;  
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14540 2a 20 54 72 75 65 20 69 66 20 67 65 6e 65 72 61  * True if genera
14550 74 69 6e 67 20 6d 61 6b 65 68 65 61 64 65 72 73  ting makeheaders
14560 20 6f 75 74 70 75 74 20 2a 2f 0a 7b 0a 20 20 69   output */.{.  i
14570 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69  nt lineno = *pli
14580 6e 65 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20  neno;    /* The 
14590 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  line number of t
145a0 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63  he output */.  c
145b0 68 61 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20  har **types;    
145c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61           /* A ha
145d0 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61  sh table of data
145e0 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61  types */.  int a
145f0 72 72 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20  rraysize;       
14600 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
14610 74 68 65 20 22 74 79 70 65 73 22 20 61 72 72 61  the "types" arra
14620 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74  y */.  int maxdt
14630 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20  length;         
14640 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67   /* Maximum leng
14650 74 68 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61  th of any ".data
14660 74 79 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a  type" field. */.
14670 20 20 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20    char *stddt;  
14680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
14690 74 61 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65  tandardized name
146a0 20 66 6f 72 20 61 20 64 61 74 61 74 79 70 65 20   for a datatype 
146b0 2a 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20  */.  int i,j;   
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
146d0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
146e0 2a 2f 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20  */.  int hash;  
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14700 2a 20 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68  * For hashing th
14710 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65  e name of a type
14720 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65   */.  char *name
14730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14740 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
14750 61 72 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41  arser */..  /* A
14760 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
14770 69 61 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61  ialize types[] a
14780 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64  nd allocate stdd
14790 74 5b 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69  t[] */.  arraysi
147a0 7a 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  ze = lemp->nsymb
147b0 6f 6c 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20  ol * 2;.  types 
147c0 3d 20 28 63 68 61 72 2a 2a 29 6d 61 6c 6c 6f 63  = (char**)malloc
147d0 28 20 61 72 72 61 79 73 69 7a 65 20 2a 20 73 69  ( arraysize * si
147e0 7a 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 20  zeof(char*) );. 
147f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61   for(i=0; i<arra
14800 79 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65  ysize; i++) type
14810 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64  s[i] = 0;.  maxd
14820 74 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69  tlength = 0;.  i
14830 66 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  f( lemp->vartype
14840 20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e   ){.    maxdtlen
14850 67 74 68 20 3d 20 73 74 72 6c 65 6e 28 6c 65 6d  gth = strlen(lem
14860 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 7d  p->vartype);.  }
14870 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
14880 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
14890 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  ){.    int len;.
148a0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
148b0 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
148c0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66  mbols[i];.    if
148d0 28 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d  ( sp->datatype==
148e0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
148f0 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 73    len = strlen(s
14900 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a 20 20  p->datatype);.  
14910 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74 6c    if( len>maxdtl
14920 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c 65 6e  ength ) maxdtlen
14930 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  gth = len;.  }. 
14940 20 73 74 64 64 74 20 3d 20 28 63 68 61 72 2a 29   stddt = (char*)
14950 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65 6e  malloc( maxdtlen
14960 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20 69  gth*2 + 1 );.  i
14970 66 28 20 74 79 70 65 73 3d 3d 30 20 7c 7c 20 73  f( types==0 || s
14980 74 64 64 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66  tddt==0 ){.    f
14990 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
149a0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
149b0 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
149c0 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20    }..  /* Build 
149d0 61 20 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20  a hash table of 
149e0 64 61 74 61 74 79 70 65 73 2e 20 54 68 65 20 22  datatypes. The "
149f0 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66  .dtnum" field of
14a00 20 65 61 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a   each symbol.  *
14a10 2a 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77  * is filled in w
14a20 69 74 68 20 74 68 65 20 68 61 73 68 20 69 6e 64  ith the hash ind
14a30 65 78 20 70 6c 75 73 20 31 2e 20 20 41 20 22 2e  ex plus 1.  A ".
14a40 64 74 6e 75 6d 22 20 76 61 6c 75 65 20 6f 66 20  dtnum" value of 
14a50 30 20 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 66  0 is.  ** used f
14a60 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  or terminal symb
14a70 6f 6c 73 2e 20 20 49 66 20 74 68 65 72 65 20 69  ols.  If there i
14a80 73 20 6e 6f 20 25 64 65 66 61 75 6c 74 5f 74 79  s no %default_ty
14a90 70 65 20 64 65 66 69 6e 65 64 20 74 68 65 6e 0a  pe defined then.
14aa0 20 20 2a 2a 20 30 20 69 73 20 61 6c 73 6f 20 75    ** 0 is also u
14ab0 73 65 64 20 61 73 20 74 68 65 20 2e 64 74 6e 75  sed as the .dtnu
14ac0 6d 20 76 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74  m value for nont
14ad0 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 64  erminals which d
14ae0 6f 20 6e 6f 74 20 73 70 65 63 69 66 79 0a 20 20  o not specify.  
14af0 2a 2a 20 61 20 64 61 74 61 74 79 70 65 20 75 73  ** a datatype us
14b00 69 6e 67 20 74 68 65 20 25 74 79 70 65 20 64 69  ing the %type di
14b10 72 65 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20  rective..  */.  
14b20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
14b30 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
14b40 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
14b50 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
14b60 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68  mbols[i];.    ch
14b70 61 72 20 2a 63 70 3b 0a 20 20 20 20 69 66 28 20  ar *cp;.    if( 
14b80 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  sp==lemp->errsym
14b90 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74   ){.      sp->dt
14ba0 6e 75 6d 20 3d 20 61 72 72 61 79 73 69 7a 65 2b  num = arraysize+
14bb0 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  1;.      continu
14bc0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
14bd0 20 73 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45   sp->type!=NONTE
14be0 52 4d 49 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64  RMINAL || (sp->d
14bf0 61 74 61 74 79 70 65 3d 3d 30 20 26 26 20 6c 65  atatype==0 && le
14c00 6d 70 2d 3e 76 61 72 74 79 70 65 3d 3d 30 29 20  mp->vartype==0) 
14c10 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  ){.      sp->dtn
14c20 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  um = 0;.      co
14c30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
14c40 20 20 63 70 20 3d 20 73 70 2d 3e 64 61 74 61 74    cp = sp->datat
14c50 79 70 65 3b 0a 20 20 20 20 69 66 28 20 63 70 3d  ype;.    if( cp=
14c60 3d 30 20 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  =0 ) cp = lemp->
14c70 76 61 72 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d  vartype;.    j =
14c80 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69   0;.    while( i
14c90 73 73 70 61 63 65 28 2a 63 70 29 20 29 20 63 70  sspace(*cp) ) cp
14ca0 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a  ++;.    while( *
14cb0 63 70 20 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20  cp ) stddt[j++] 
14cc0 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69  = *cp++;.    whi
14cd0 6c 65 28 20 6a 3e 30 20 26 26 20 69 73 73 70 61  le( j>0 && isspa
14ce0 63 65 28 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29  ce(stddt[j-1]) )
14cf0 20 6a 2d 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b   j--;.    stddt[
14d00 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 68 61 73 68  j] = 0;.    hash
14d10 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
14d20 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b  0; stddt[j]; j++
14d30 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d 20  ){.      hash = 
14d40 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74 5b  hash*53 + stddt[
14d50 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j];.    }.    if
14d60 28 20 68 61 73 68 3c 30 20 29 20 68 61 73 68 20  ( hash<0 ) hash 
14d70 3d 20 2d 68 61 73 68 3b 0a 20 20 20 20 68 61 73  = -hash;.    has
14d80 68 20 3d 20 68 61 73 68 25 61 72 72 61 79 73 69  h = hash%arraysi
14d90 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74  ze;.    while( t
14da0 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20  ypes[hash] ){.  
14db0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 74      if( strcmp(t
14dc0 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74  ypes[hash],stddt
14dd0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
14de0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68  sp->dtnum = hash
14df0 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   + 1;.        br
14e00 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
14e10 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20     hash++;.     
14e20 20 69 66 28 20 68 61 73 68 3e 3d 61 72 72 61 79   if( hash>=array
14e30 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20 30 3b  size ) hash = 0;
14e40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74  .    }.    if( t
14e50 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b  ypes[hash]==0 ){
14e60 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
14e70 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20   = hash + 1;.   
14e80 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d 20 3d     types[hash] =
14e90 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20   (char*)malloc( 
14ea0 73 74 72 6c 65 6e 28 73 74 64 64 74 29 2b 31 20  strlen(stddt)+1 
14eb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 79 70  );.      if( typ
14ec0 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20  es[hash]==0 ){. 
14ed0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
14ee0 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
14ef0 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  mory.\n");.     
14f00 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
14f10 20 20 7d 0a 20 20 20 20 20 20 73 74 72 63 70 79    }.      strcpy
14f20 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64  (types[hash],std
14f30 64 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dt);.    }.  }..
14f40 20 20 2f 2a 20 50 72 69 6e 74 20 6f 75 74 20 74    /* Print out t
14f50 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
14f60 20 59 59 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64   YYTOKENTYPE and
14f70 20 59 59 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a   YYMINORTYPE */.
14f80 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e    name = lemp->n
14f90 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65  ame ? lemp->name
14fa0 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 6c 69   : "Parse";.  li
14fb0 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b  neno = *plineno;
14fc0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
14fd0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
14fe0 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
14ff0 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66   lineno++; }.  f
15000 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
15010 69 6e 65 20 25 73 54 4f 4b 45 4e 54 59 50 45 20  ine %sTOKENTYPE 
15020 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20  %s\n",name,.    
15030 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f  lemp->tokentype?
15040 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a  lemp->tokentype:
15050 22 76 6f 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e  "void*");  linen
15060 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  o++;.  if( mhfla
15070 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74  g ){ fprintf(out
15080 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
15090 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69  neno++; }.  fpri
150a0 6e 74 66 28 6f 75 74 2c 22 74 79 70 65 64 65 66  ntf(out,"typedef
150b0 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69   union {\n"); li
150c0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
150d0 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45 4e  f(out,"  %sTOKEN
150e0 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d  TYPE yy0;\n",nam
150f0 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
15100 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79  for(i=0; i<array
15110 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  size; i++){.    
15120 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30 20  if( types[i]==0 
15130 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15140 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
15150 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65 73  s yy%d;\n",types
15160 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f  [i],i+1); lineno
15170 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74 79 70  ++;.    free(typ
15180 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 70  es[i]);.  }.  fp
15190 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74  rintf(out,"  int
151a0 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e   yy%d;\n",lemp->
151b0 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20  errsym->dtnum); 
151c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 72 65 65  lineno++;.  free
151d0 28 73 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28  (stddt);.  free(
151e0 74 79 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74  types);.  fprint
151f0 66 28 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52  f(out,"} YYMINOR
15200 54 59 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  TYPE;\n"); linen
15210 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20  o++;.  *plineno 
15220 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  = lineno;.}../*.
15230 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
15240 6d 65 20 6f 66 20 61 20 43 20 64 61 74 61 74 79  me of a C dataty
15250 70 65 20 61 62 6c 65 20 74 6f 20 72 65 70 72 65  pe able to repre
15260 73 65 6e 74 20 76 61 6c 75 65 73 20 62 65 74 77  sent values betw
15270 65 65 6e 0a 2a 2a 20 30 20 61 6e 64 20 4e 2c 20  een.** 0 and N, 
15280 69 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73 74  inclusive..*/.st
15290 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
152a0 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79  *minimum_size_ty
152b0 70 65 28 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28  pe(int N){.  if(
152c0 20 4e 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20 72   N<=255 ){.    r
152d0 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20  eturn "unsigned 
152e0 63 68 61 72 22 3b 0a 20 20 7d 65 6c 73 65 20 69  char";.  }else i
152f0 66 28 20 4e 3c 36 35 35 33 35 20 29 7b 0a 20 20  f( N<65535 ){.  
15300 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e    return "unsign
15310 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a 20  ed short int";. 
15320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
15330 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 69 6e 74  rn "unsigned int
15340 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 47 65 6e  ";.  }.}../* Gen
15350 65 72 61 74 65 20 43 20 73 6f 75 72 63 65 20 63  erate C source c
15360 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ode for the pars
15370 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72  er */.void Repor
15380 74 54 61 62 6c 65 28 6c 65 6d 70 2c 20 6d 68 66  tTable(lemp, mhf
15390 6c 61 67 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  lag).struct lemo
153a0 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 6d 68 66  n *lemp;.int mhf
153b0 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70  lag;     /* Outp
153c0 75 74 20 69 6e 20 6d 61 6b 65 68 65 61 64 65 72  ut in makeheader
153d0 73 20 66 6f 72 6d 61 74 20 69 66 20 74 72 75 65  s format if true
153e0 20 2a 2f 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75   */.{.  FILE *ou
153f0 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 6c  t, *in;.  char l
15400 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20  ine[LINESIZE];. 
15410 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20   int  lineno;.  
15420 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
15430 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
15440 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75 63 74  on *ap;.  struct
15450 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74   rule *rp;.  int
15460 20 69 3b 0a 20 20 69 6e 74 20 74 61 62 6c 65 63   i;.  int tablec
15470 6e 74 3b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65  nt;.  char *name
15480 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f  ;..  in = tplt_o
15490 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28  pen(lemp);.  if(
154a0 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   in==0 ) return;
154b0 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70  .  out = file_op
154c0 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 22  en(lemp,".c","w"
154d0 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20  );.  if( out==0 
154e0 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  ){.    fclose(in
154f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
15500 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b   }.  lineno = 1;
15510 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
15520 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
15530 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
15540 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c  enerate the incl
15550 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79  ude code, if any
15560 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
15570 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
15580 69 6e 63 6c 75 64 65 2c 6c 65 6d 70 2d 3e 69 6e  include,lemp->in
15590 63 6c 75 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29  cludeln,&lineno)
155a0 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  ;.  if( mhflag )
155b0 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65  {.    char *name
155c0 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65   = file_makename
155d0 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20  (lemp, ".h");.  
155e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
155f0 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e  include \"%s\"\n
15600 22 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  ", name); lineno
15610 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e 61 6d  ++;.    free(nam
15620 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  e);.  }.  tplt_x
15630 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
15640 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
15650 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23  .  /* Generate #
15660 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20  defines for all 
15670 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20  tokens */.  if( 
15680 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68  mhflag ){.    ch
15690 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20  ar *prefix;.    
156a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66  fprintf(out,"#if
156b0 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20   INTERFACE\n"); 
156c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66  lineno++;.    if
156d0 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  ( lemp->tokenpre
156e0 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c  fix ) prefix = l
156f0 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
15700 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20  ;.    else      
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
15720 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66  efix = "";.    f
15730 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=1; i<lemp->
15740 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b  nterminal; i++){
15750 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
15760 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  ut,"#define %s%-
15770 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69  30s %2d\n",prefi
15780 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
15790 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
157a0 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
157b0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
157c0 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
157d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
157e0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
157f0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
15800 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
15810 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73  rate the defines
15820 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
15830 74 2c 22 2f 2a 20 5c 30 30 31 20 2a 2f 5c 6e 22  t,"/* \001 */\n"
15840 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
15850 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45  ,"#define YYCODE
15860 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
15870 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
15880 65 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b  e(lemp->nsymbol+
15890 35 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  5)); lineno++;. 
158a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
158b0 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25  efine YYNOCODE %
158c0 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  d\n",lemp->nsymb
158d0 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  ol+1);  lineno++
158e0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
158f0 22 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f  "#define YYACTIO
15900 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20  NTYPE %s\n",.   
15910 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
15920 70 65 28 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b  pe(lemp->nstate+
15930 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35 29 29 3b  lemp->nrule+5));
15940 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 70 72    lineno++;.  pr
15950 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28  int_stack_union(
15960 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  out,lemp,&lineno
15970 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 69 66 28 20  ,mhflag);.  if( 
15980 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20  lemp->stacksize 
15990 29 7b 0a 20 20 20 20 69 66 28 20 61 74 6f 69 28  ){.    if( atoi(
159a0 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29  lemp->stacksize)
159b0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72  <=0 ){.      Err
159c0 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
159d0 6e 61 6d 65 2c 30 2c 0a 22 49 6c 6c 65 67 61 6c  name,0,."Illegal
159e0 20 73 74 61 63 6b 20 73 69 7a 65 3a 20 5b 25 73   stack size: [%s
159f0 5d 2e 20 20 54 68 65 20 73 74 61 63 6b 20 73 69  ].  The stack si
15a00 7a 65 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ze should be an 
15a10 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  integer constant
15a20 2e 22 2c 0a 20 20 20 20 20 20 20 20 6c 65 6d 70  .",.        lemp
15a30 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20  ->stacksize);.  
15a40 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
15a50 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 6c 65 6d 70  nt++;.      lemp
15a60 2d 3e 73 74 61 63 6b 73 69 7a 65 20 3d 20 22 31  ->stacksize = "1
15a70 30 30 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  00";.    }.    f
15a80 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
15a90 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48  ine YYSTACKDEPTH
15aa0 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61   %s\n",lemp->sta
15ab0 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f  cksize);  lineno
15ac0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
15ad0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
15ae0 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50  efine YYSTACKDEP
15af0 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e  TH 100\n");  lin
15b00 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  eno++;.  }.  if(
15b10 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66   mhflag ){.    f
15b20 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
15b30 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
15b40 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e  ineno++;.  }.  n
15b50 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65  ame = lemp->name
15b60 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20   ? lemp->name : 
15b70 22 50 61 72 73 65 22 3b 0a 20 20 69 66 28 20 6c  "Parse";.  if( l
15b80 65 6d 70 2d 3e 61 72 67 20 26 26 20 6c 65 6d 70  emp->arg && lemp
15b90 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20  ->arg[0] ){.    
15ba0 69 6e 74 20 69 3b 0a 20 20 20 20 69 20 3d 20 73  int i;.    i = s
15bb0 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29  trlen(lemp->arg)
15bc0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d  ;.    while( i>=
15bd0 31 20 26 26 20 69 73 73 70 61 63 65 28 6c 65 6d  1 && isspace(lem
15be0 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69  p->arg[i-1]) ) i
15bf0 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  --;.    while( i
15c00 3e 3d 31 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  >=1 && (isalnum(
15c10 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20  lemp->arg[i-1]) 
15c20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31  || lemp->arg[i-1
15c30 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20  ]=='_') ) i--;. 
15c40 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
15c50 23 64 65 66 69 6e 65 20 25 73 41 52 47 44 45 43  #define %sARGDEC
15c60 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 26 6c  L ,%s\n",name,&l
15c70 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c  emp->arg[i]);  l
15c80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
15c90 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
15ca0 65 20 25 73 58 41 52 47 44 45 43 4c 20 25 73 3b  e %sXARGDECL %s;
15cb0 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61  \n",name,lemp->a
15cc0 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  rg);  lineno++;.
15cd0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15ce0 22 23 64 65 66 69 6e 65 20 25 73 41 4e 53 49 41  "#define %sANSIA
15cf0 52 47 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61  RGDECL ,%s\n",na
15d00 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20  me,lemp->arg);  
15d10 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73  lineno++;.  }els
15d20 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
15d30 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
15d40 47 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20  GDECL\n",name); 
15d50 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
15d60 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
15d70 69 6e 65 20 25 73 58 41 52 47 44 45 43 4c 5c 6e  ine %sXARGDECL\n
15d80 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f  ",name);  lineno
15d90 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
15da0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
15db0 4e 53 49 41 52 47 44 45 43 4c 5c 6e 22 2c 6e 61  NSIARGDECL\n",na
15dc0 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  me);  lineno++;.
15dd0 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67    }.  if( mhflag
15de0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
15df0 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b  out,"#endif\n");
15e00 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
15e10 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
15e20 65 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20 25  efine YYNSTATE %
15e30 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74  d\n",lemp->nstat
15e40 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
15e50 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
15e60 65 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 25 64  efine YYNRULE %d
15e70 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29  \n",lemp->nrule)
15e80 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ;  lineno++;.  f
15e90 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
15ea0 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f  ine YYERRORSYMBO
15eb0 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72  L %d\n",lemp->er
15ec0 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c  rsym->index);  l
15ed0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
15ee0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
15ef0 59 59 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c  YYERRSYMDT yy%d\
15f00 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  n",lemp->errsym-
15f10 3e 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f  >dtnum);  lineno
15f20 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  ++;.  tplt_xfer(
15f30 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
15f40 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
15f50 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 61  * Generate the a
15f60 63 74 69 6f 6e 20 74 61 62 6c 65 2e 0a 20 20 2a  ction table..  *
15f70 2a 0a 20 20 2a 2a 20 45 61 63 68 20 65 6e 74 72  *.  ** Each entr
15f80 79 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20  y in the action 
15f90 74 61 62 6c 65 20 69 73 20 61 6e 20 65 6c 65 6d  table is an elem
15fa0 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ent of the follo
15fb0 77 69 6e 67 20 0a 20 20 2a 2a 20 73 74 72 75 63  wing .  ** struc
15fc0 74 75 72 65 3a 0a 20 20 2a 2a 20 20 20 73 74 72  ture:.  **   str
15fd0 75 63 74 20 79 79 41 63 74 69 6f 6e 45 6e 74 72  uct yyActionEntr
15fe0 79 20 7b 0a 20 20 2a 2a 20 20 20 20 20 20 20 59  y {.  **       Y
15ff0 59 43 4f 44 45 54 59 50 45 20 20 20 20 20 20 20  YCODETYPE       
16000 20 20 20 20 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a       lookahead;.
16010 20 20 2a 2a 20 20 20 20 20 20 20 59 59 43 4f 44    **       YYCOD
16020 45 54 59 50 45 20 20 20 20 20 20 20 20 20 20 20  ETYPE           
16030 20 6e 65 78 74 3b 0a 20 20 2a 2a 20 20 20 20 20   next;.  **     
16040 20 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 20    YYACTIONTYPE  
16050 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 3b 0a          action;.
16060 20 20 2a 2a 20 20 20 7d 0a 20 20 2a 2a 0a 20 20    **   }.  **.  
16070 2a 2a 20 54 68 65 20 65 6e 74 72 69 65 73 20 61  ** The entries a
16080 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
16090 68 61 73 68 20 74 61 62 6c 65 73 2c 20 6f 6e 65  hash tables, one
160a0 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
160b0 65 61 63 68 0a 20 20 2a 2a 20 70 61 72 73 65 72  each.  ** parser
160c0 20 73 74 61 74 65 2e 20 20 54 68 65 20 68 61 73   state.  The has
160d0 68 20 74 61 62 6c 65 20 68 61 73 20 61 20 73 69  h table has a si
160e0 7a 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ze which is the 
160f0 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 65  number of.  ** e
16100 6e 74 72 69 65 73 20 69 6e 20 74 68 61 74 20 74  ntries in that t
16110 61 62 6c 65 2e 20 20 49 6e 20 63 61 73 65 20 6f  able.  In case o
16120 66 20 61 20 63 6f 6c 6c 69 73 69 6f 6e 2c 20 74  f a collision, t
16130 68 65 20 22 6e 65 78 74 22 20 76 61 6c 75 65 0a  he "next" value.
16140 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f 6e    ** contains on
16150 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
16160 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 68  index into the h
16170 61 73 68 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ash table of the
16180 20 6e 65 78 74 0a 20 20 2a 2a 20 65 6e 74 72 79   next.  ** entry
16190 20 69 6e 20 74 68 65 20 63 6f 6c 6c 69 73 69 6f   in the collisio
161a0 6e 20 63 68 61 69 6e 2e 20 20 41 20 22 6e 65 78  n chain.  A "nex
161b0 74 22 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65  t" value of 0 me
161c0 61 6e 73 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a  ans the end.  **
161d0 20 6f 66 20 74 68 65 20 63 68 61 69 6e 20 68 61   of the chain ha
161e0 73 20 62 65 65 6e 20 72 65 61 63 68 65 64 2e 0a  s been reached..
161f0 20 20 2a 2f 0a 20 20 74 61 62 6c 65 63 6e 74 20    */.  tablecnt 
16200 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  = 0;..  /* Loop 
16210 6f 76 65 72 20 70 61 72 73 65 72 20 73 74 61 74  over parser stat
16220 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  es */.  for(i=0;
16230 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
16240 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 74   i++){.    int t
16250 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20 20  ablesize;       
16260 20 20 20 20 20 20 20 2f 2a 20 73 69 7a 65 20 6f         /* size o
16270 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  f the hash table
16280 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 2c 6b 3b   */.    int j,k;
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
162b0 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63  ter */.    int c
162c0 6f 6c 6c 69 64 65 5b 32 30 34 38 5d 3b 20 20 20  ollide[2048];   
162d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
162e0 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f  llision chain fo
162f0 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
16300 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e     struct action
16310 20 2a 74 61 62 6c 65 5b 32 30 34 38 5d 3b 20 2f   *table[2048]; /
16320 2a 20 42 75 69 6c 64 20 74 68 65 20 68 61 73 68  * Build the hash
16330 20 74 61 62 6c 65 20 68 65 72 65 20 2a 2f 0a 0a   table here */..
16340 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
16350 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e  number of action
16360 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  s and initialize
16370 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
16380 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  */.    stp = lem
16390 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
163a0 20 20 73 74 70 2d 3e 74 61 62 73 74 61 72 74 20    stp->tabstart 
163b0 3d 20 74 61 62 6c 65 63 6e 74 3b 0a 20 20 20 20  = tablecnt;.    
163c0 73 74 70 2d 3e 6e 61 63 74 69 6f 6e 20 3d 20 30  stp->naction = 0
163d0 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
163e0 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
163f0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
16400 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 21  ( ap->sp->index!
16410 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26  =lemp->nsymbol &
16420 26 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  & compute_action
16430 28 6c 65 6d 70 2c 61 70 29 3e 3d 30 20 29 7b 0a  (lemp,ap)>=0 ){.
16440 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 61 63          stp->nac
16450 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  tion++;.      }.
16460 20 20 20 20 7d 0a 20 20 20 20 74 61 62 6c 65 73      }.    tables
16470 69 7a 65 20 3d 20 73 74 70 2d 3e 6e 61 63 74 69  ize = stp->nacti
16480 6f 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  on;.    assert( 
16490 74 61 62 6c 65 73 69 7a 65 3c 3d 20 73 69 7a 65  tablesize<= size
164a0 6f 66 28 74 61 62 6c 65 29 2f 73 69 7a 65 6f 66  of(table)/sizeof
164b0 28 74 61 62 6c 65 5b 30 5d 29 20 29 3b 0a 20 20  (table[0]) );.  
164c0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 74 61 62    for(j=0; j<tab
164d0 6c 65 73 69 7a 65 3b 20 6a 2b 2b 29 7b 0a 20 20  lesize; j++){.  
164e0 20 20 20 20 74 61 62 6c 65 5b 6a 5d 20 3d 20 30      table[j] = 0
164f0 3b 0a 20 20 20 20 20 20 63 6f 6c 6c 69 64 65 5b  ;.      collide[
16500 6a 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  j] = -1;.    }..
16510 20 20 20 20 2f 2a 20 48 61 73 68 20 74 68 65 20      /* Hash the 
16520 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 74 68 65  actions into the
16530 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
16540 20 20 20 73 74 70 2d 3e 74 61 62 64 66 6c 74 61     stp->tabdflta
16550 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ct = lemp->nstat
16560 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b  e + lemp->nrule;
16570 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
16580 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
16590 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  next){.      int
165a0 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74   action = comput
165b0 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70  e_action(lemp,ap
165c0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 68 3b 0a  );.      int h;.
165d0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
165e0 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e  ->index==lemp->n
165f0 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20  symbol ){.      
16600 20 20 73 74 70 2d 3e 74 61 62 64 66 6c 74 61 63    stp->tabdfltac
16610 74 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  t = action;.    
16620 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63 74 69    }else if( acti
16630 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  on>=0 ){.       
16640 20 68 20 3d 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   h = ap->sp->ind
16650 65 78 20 25 20 74 61 62 6c 65 73 69 7a 65 3b 0a  ex % tablesize;.
16660 20 20 20 20 20 20 20 20 61 70 2d 3e 63 6f 6c 6c          ap->coll
16670 69 64 65 20 3d 20 74 61 62 6c 65 5b 68 5d 3b 0a  ide = table[h];.
16680 20 20 20 20 20 20 20 20 74 61 62 6c 65 5b 68 5d          table[h]
16690 20 3d 20 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20   = ap;.      }. 
166a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
166b0 6f 6c 76 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  olve collisions 
166c0 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 6b 3d 30  */.    for(j=k=0
166d0 3b 20 6a 3c 74 61 62 6c 65 73 69 7a 65 3b 20 6a  ; j<tablesize; j
166e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74  ++){.      if( t
166f0 61 62 6c 65 5b 6a 5d 20 26 26 20 74 61 62 6c 65  able[j] && table
16700 5b 6a 5d 2d 3e 63 6f 6c 6c 69 64 65 20 29 7b 0a  [j]->collide ){.
16710 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 74          while( t
16720 61 62 6c 65 5b 6b 5d 20 29 20 6b 2b 2b 3b 0a 20  able[k] ) k++;. 
16730 20 20 20 20 20 20 20 74 61 62 6c 65 5b 6b 5d 20         table[k] 
16740 3d 20 74 61 62 6c 65 5b 6a 5d 2d 3e 63 6f 6c 6c  = table[j]->coll
16750 69 64 65 3b 0a 20 20 20 20 20 20 20 20 63 6f 6c  ide;.        col
16760 6c 69 64 65 5b 6a 5d 20 3d 20 6b 3b 0a 20 20 20  lide[j] = k;.   
16770 20 20 20 20 20 74 61 62 6c 65 5b 6a 5d 2d 3e 63       table[j]->c
16780 6f 6c 6c 69 64 65 20 3d 20 30 3b 0a 20 20 20 20  ollide = 0;.    
16790 20 20 20 20 69 66 28 20 6b 3c 6a 20 29 20 6a 20      if( k<j ) j 
167a0 3d 20 6b 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  = k-1;.      }. 
167b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72 69     }..    /* Pri
167c0 6e 74 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nt the hash tabl
167d0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 74 61 62  e */.    if( tab
167e0 6c 65 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  lesize>0 ){.    
167f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 2f    fprintf(out,"/
16800 2a 20 53 74 61 74 65 20 25 64 20 2a 2f 5c 6e 22  * State %d */\n"
16810 2c 73 74 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69  ,stp->index); li
16820 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
16830 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 74 61 62    for(j=0; j<tab
16840 6c 65 73 69 7a 65 3b 20 6a 2b 2b 29 7b 0a 20 20  lesize; j++){.  
16850 20 20 20 20 61 73 73 65 72 74 28 20 74 61 62 6c      assert( tabl
16860 65 5b 6a 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  e[j]!=0 );.     
16870 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
16880 7b 25 34 64 2c 25 34 64 2c 25 34 64 7d 2c 20 2f  {%4d,%4d,%4d}, /
16890 2a 20 25 32 64 3a 20 22 2c 0a 20 20 20 20 20 20  * %2d: ",.      
168a0 20 20 20 20 74 61 62 6c 65 5b 6a 5d 2d 3e 73 70      table[j]->sp
168b0 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  ->index,.       
168c0 20 20 20 63 6f 6c 6c 69 64 65 5b 6a 5d 2b 31 2c     collide[j]+1,
168d0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 75  .          compu
168e0 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 74  te_action(lemp,t
168f0 61 62 6c 65 5b 6a 5d 29 2c 0a 20 20 20 20 20 20  able[j]),.      
16900 20 20 20 20 6a 2b 31 29 3b 0a 20 20 20 20 20 20      j+1);.      
16910 50 72 69 6e 74 41 63 74 69 6f 6e 28 74 61 62 6c  PrintAction(tabl
16920 65 5b 6a 5d 2c 6f 75 74 2c 32 32 29 3b 0a 20 20  e[j],out,22);.  
16930 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
16940 22 20 2a 2f 5c 6e 22 29 3b 20 0a 20 20 20 20 20  " */\n"); .     
16950 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
16960 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
16970 74 68 65 20 74 61 62 6c 65 20 63 6f 75 6e 74 20  the table count 
16980 2a 2f 0a 20 20 20 20 74 61 62 6c 65 63 6e 74 20  */.    tablecnt 
16990 2b 3d 20 74 61 62 6c 65 73 69 7a 65 3b 0a 20 20  += tablesize;.  
169a0 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
169b0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
169c0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 6c 65 6d 70  &lineno);.  lemp
169d0 2d 3e 74 61 62 6c 65 73 69 7a 65 20 3d 20 74 61  ->tablesize = ta
169e0 62 6c 65 63 6e 74 3b 0a 0a 20 20 2f 2a 20 47 65  blecnt;..  /* Ge
169f0 6e 65 72 61 74 65 20 74 68 65 20 73 74 61 74 65  nerate the state
16a00 20 74 61 62 6c 65 0a 20 20 2a 2a 0a 20 20 2a 2a   table.  **.  **
16a10 20 45 61 63 68 20 65 6e 74 72 79 20 69 73 20 61   Each entry is a
16a20 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  n element of the
16a30 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
16a40 74 75 72 65 3a 0a 20 20 2a 2a 20 20 20 20 73 74  ture:.  **    st
16a50 72 75 63 74 20 79 79 53 74 61 74 65 45 6e 74 72  ruct yyStateEntr
16a60 79 20 7b 0a 20 20 2a 2a 20 20 20 20 20 20 73 74  y {.  **      st
16a70 72 75 63 74 20 79 79 41 63 74 69 6f 6e 45 6e 74  ruct yyActionEnt
16a80 72 79 20 2a 68 61 73 68 74 62 6c 3b 0a 20 20 2a  ry *hashtbl;.  *
16a90 2a 20 20 20 20 20 20 59 59 43 4f 44 45 54 59 50  *      YYCODETYP
16aa0 45 20 6e 45 6e 74 72 79 3b 0a 20 20 2a 2a 20 20  E nEntry;.  **  
16ab0 20 20 20 20 59 59 41 43 54 49 4f 4e 54 59 50 45      YYACTIONTYPE
16ac0 20 61 63 74 69 6f 6e 44 65 66 61 75 6c 74 3b 0a   actionDefault;.
16ad0 20 20 2a 2a 20 20 20 20 7d 0a 20 20 2a 2f 0a 20    **    }.  */. 
16ae0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
16af0 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
16b00 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
16b10 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
16b20 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b 20  printf(out,"  { 
16b30 26 79 79 41 63 74 69 6f 6e 54 61 62 6c 65 5b 25  &yyActionTable[%
16b40 64 5d 2c 25 34 64 2c 25 34 64 20 7d 2c 5c 6e 22  d],%4d,%4d },\n"
16b50 2c 0a 20 20 20 20 20 20 73 74 70 2d 3e 74 61 62  ,.      stp->tab
16b60 73 74 61 72 74 2c 0a 20 20 20 20 20 20 73 74 70  start,.      stp
16b70 2d 3e 6e 61 63 74 69 6f 6e 2c 0a 20 20 20 20 20  ->naction,.     
16b80 20 73 74 70 2d 3e 74 61 62 64 66 6c 74 61 63 74   stp->tabdfltact
16b90 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
16ba0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
16bb0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
16bc0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
16bd0 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65 20  enerate a table 
16be0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
16bf0 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20  ymbolic name of 
16c00 65 76 65 72 79 20 73 79 6d 62 6f 6c 20 2a 2f 0a  every symbol */.
16c10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
16c20 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
16c30 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 6c 69  {.    sprintf(li
16c40 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d  ne,"\"%s\",",lem
16c50 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
16c60 61 6d 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ame);.    fprint
16c70 66 28 6f 75 74 2c 22 20 20 25 2d 31 35 73 22 2c  f(out,"  %-15s",
16c80 6c 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28  line);.    if( (
16c90 69 26 33 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e  i&3)==3 ){ fprin
16ca0 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69  tf(out,"\n"); li
16cb0 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  neno++; }.  }.  
16cc0 69 66 28 20 28 69 26 33 29 21 3d 30 20 29 7b 20  if( (i&3)!=0 ){ 
16cd0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22  fprintf(out,"\n"
16ce0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
16cf0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
16d00 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
16d10 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
16d20 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
16d30 20 65 78 65 63 75 74 65 73 20 65 76 65 72 79 20   executes every 
16d40 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20 69 73  time a symbol is
16d50 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20 20 2a   popped from.  *
16d60 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68 69 6c  * the stack whil
16d70 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65 72 72  e processing err
16d80 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64 65 73  ors or while des
16d90 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61 72 73  troying the pars
16da0 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20 6f 74  er. .  ** (In ot
16db0 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e 65 72  her words, gener
16dc0 61 74 65 20 74 68 65 20 25 64 65 73 74 72 75 63  ate the %destruc
16dd0 74 6f 72 20 61 63 74 69 6f 6e 73 29 20 2a 2f 0a  tor actions) */.
16de0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
16df0 6e 64 65 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  ndest ){.    for
16e00 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
16e10 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
16e20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
16e30 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d   *sp = lemp->sym
16e40 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
16e50 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e  f( sp==0 || sp->
16e60 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 29  type!=TERMINAL )
16e70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
16e80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
16e90 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70    case %d:\n",sp
16ea0 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f  ->index); lineno
16eb0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ++;.    }.    fo
16ec0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
16ed0 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e  symbol && lemp->
16ee0 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65  symbols[i]->type
16ef0 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29  !=TERMINAL; i++)
16f00 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70  ;.    if( i<lemp
16f10 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20  ->nsymbol ){.   
16f20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74     emit_destruct
16f30 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70  or_code(out,lemp
16f40 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d  ->symbols[i],lem
16f50 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
16f60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
16f70 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
16f80 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
16f90 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
16fa0 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
16fb0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
16fc0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
16fd0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
16fe0 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c  .    if( sp==0 |
16ff0 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  | sp->type==TERM
17000 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74  INAL || sp->dest
17010 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74  ructor==0 ) cont
17020 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74  inue;.    fprint
17030 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
17040 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65 78  %d:\n",sp->index
17050 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
17060 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
17070 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e  _code(out,lemp->
17080 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c  symbols[i],lemp,
17090 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70  &lineno);.    fp
170a0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
170b0 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
170c0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  eno++;.  }.  if(
170d0 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
170e0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
170f0 62 6f 6c 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30  bol *dflt_sp = 0
17100 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
17110 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
17120 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
17130 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
17140 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
17150 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d  ;.      if( sp==
17160 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54  0 || sp->type==T
17170 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20  ERMINAL ||.     
17180 20 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d       sp->index<=
17190 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  0 || sp->destruc
171a0 74 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  tor!=0 ) continu
171b0 65 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e;.      fprintf
171c0 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
171d0 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29  d:\n",sp->index)
171e0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
171f0 20 20 64 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a    dflt_sp = sp;.
17200 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 66      }.    if( df
17210 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20 20 20  lt_sp!=0 ){.    
17220 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
17230 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f  r_code(out,dflt_
17240 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  sp,lemp,&lineno)
17250 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
17260 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
17270 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
17280 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c  .    }.  }.  tpl
17290 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
172a0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
172b0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
172c0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
172d0 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74  cutes whenever t
172e0 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
172f0 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74  overflows */.  t
17300 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
17310 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f  mp,lemp->overflo
17320 77 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77  w,lemp->overflow
17330 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  ln,&lineno);.  t
17340 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
17350 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
17360 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
17370 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66  ate the table of
17380 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   rule informatio
17390 6e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  n .  **.  ** Not
173a0 65 3a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  e: This code dep
173b0 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
173c0 20 74 68 61 74 20 72 75 6c 65 73 20 61 72 65 20   that rules are 
173d0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71 75  number.  ** sequ
173e0 65 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69  entually beginni
173f0 6e 67 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a  ng with 0..  */.
17400 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
17410 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
17420 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e  next){.    fprin
17430 74 66 28 6f 75 74 2c 22 20 20 7b 20 25 64 2c 20  tf(out,"  { %d, 
17440 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73  %d },\n",rp->lhs
17450 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e 72 68 73  ->index,rp->nrhs
17460 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
17470 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
17480 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
17490 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
174a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
174b0 63 68 20 65 78 65 63 75 74 69 6f 6e 20 64 75 72  ch execution dur
174c0 69 6e 67 20 65 61 63 68 20 52 45 44 55 43 45 20  ing each REDUCE 
174d0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  action */.  for(
174e0 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
174f0 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
17500 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
17510 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a  ,"      case %d:
17520 5c 6e 22 2c 72 70 2d 3e 69 6e 64 65 78 29 3b 20  \n",rp->index); 
17530 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
17540 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
17550 20 20 20 59 59 54 52 41 43 45 28 5c 22 25 73 20     YYTRACE(\"%s 
17560 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  ::=",rp->lhs->na
17570 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  me);.    for(i=0
17580 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
17590 2b 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  +) fprintf(out,"
175a0 20 25 73 22 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d   %s",rp->rhs[i]-
175b0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70 72 69  >name);.    fpri
175c0 6e 74 66 28 6f 75 74 2c 22 5c 22 29 5c 6e 22 29  ntf(out,"\")\n")
175d0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
175e0 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70  emit_code(out,rp
175f0 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
17600 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17610 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  "        break;\
17620 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
17630 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
17640 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
17650 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
17660 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
17670 68 69 63 68 20 65 78 65 63 75 74 65 73 20 69 66  hich executes if
17680 20 61 20 70 61 72 73 65 20 66 61 69 6c 73 20 2a   a parse fails *
17690 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
176a0 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61  ut,lemp,lemp->fa
176b0 69 6c 75 72 65 2c 6c 65 6d 70 2d 3e 66 61 69 6c  ilure,lemp->fail
176c0 75 72 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ureln,&lineno);.
176d0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
176e0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
176f0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
17700 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
17710 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20  h executes when 
17720 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6f  a syntax error o
17730 63 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  ccurs */.  tplt_
17740 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
17750 65 6d 70 2d 3e 65 72 72 6f 72 2c 6c 65 6d 70 2d  emp->error,lemp-
17760 3e 65 72 72 6f 72 6c 6e 2c 26 6c 69 6e 65 6e 6f  >errorln,&lineno
17770 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
17780 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
17790 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
177a0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
177b0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
177c0 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 63  en the parser ac
177d0 63 65 70 74 73 20 69 74 73 20 69 6e 70 75 74 20  cepts its input 
177e0 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
177f0 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61  out,lemp,lemp->a
17800 63 63 65 70 74 2c 6c 65 6d 70 2d 3e 61 63 63 65  ccept,lemp->acce
17810 70 74 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  ptln,&lineno);. 
17820 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
17830 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
17840 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70  neno);..  /* App
17850 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e  end any addition
17860 20 63 6f 64 65 20 74 68 65 20 75 73 65 72 20 64   code the user d
17870 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74  esires */.  tplt
17880 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
17890 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c  lemp->extracode,
178a0 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 6c  lemp->extracodel
178b0 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66  n,&lineno);..  f
178c0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c  close(in);.  fcl
178d0 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75  ose(out);.  retu
178e0 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  rn;.}../* Genera
178f0 74 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65  te a header file
17900 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
17910 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65  */.void ReportHe
17920 61 64 65 72 28 6c 65 6d 70 29 0a 73 74 72 75 63  ader(lemp).struc
17930 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
17940 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69  .  FILE *out, *i
17950 6e 3b 0a 20 20 63 68 61 72 20 2a 70 72 65 66 69  n;.  char *prefi
17960 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c  x;.  char line[L
17970 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72  INESIZE];.  char
17980 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a   pattern[LINESIZ
17990 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  E];.  int i;..  
179a0 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70  if( lemp->tokenp
179b0 72 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d  refix ) prefix =
179c0 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
179d0 69 78 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20  ix;.  else      
179e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
179f0 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20  efix = "";.  in 
17a00 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
17a10 2c 22 2e 68 22 2c 22 72 22 29 3b 0a 20 20 69 66  ,".h","r");.  if
17a20 28 20 69 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28  ( in ){.    for(
17a30 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
17a40 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28  rminal && fgets(
17a50 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e  line,LINESIZE,in
17a60 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ); i++){.      s
17a70 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c 22  printf(pattern,"
17a80 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
17a90 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
17aa0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
17ab0 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 69  name,i);.      i
17ac0 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70  f( strcmp(line,p
17ad0 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b 3b  attern) ) break;
17ae0 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73  .    }.    fclos
17af0 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 69  e(in);.    if( i
17b00 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  ==lemp->ntermina
17b10 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  l ){.      /* No
17b20 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 66   change in the f
17b30 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65 77 72  ile.  Don't rewr
17b40 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ite it. */.     
17b50 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
17b60 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f   }.  out = file_
17b70 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22  open(lemp,".h","
17b80 77 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29  w");.  if( out )
17b90 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  {.    for(i=1; i
17ba0 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
17bb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70  ; i++){.      fp
17bc0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
17bd0 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e  ne %s%-30s %2d\n
17be0 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73  ",prefix,lemp->s
17bf0 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c  ymbols[i]->name,
17c00 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63  i);.    }.    fc
17c10 6c 6f 73 65 28 6f 75 74 29 3b 20 20 0a 20 20 7d  lose(out);  .  }
17c20 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
17c30 20 52 65 64 75 63 65 20 74 68 65 20 73 69 7a 65   Reduce the size
17c40 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74   of the action t
17c50 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73 69 62  ables, if possib
17c60 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  le, by making us
17c70 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74 73  e.** of defaults
17c80 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ..**.** In this 
17c90 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b 65  version, we take
17ca0 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71 75 65   the most freque
17cb0 6e 74 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e  nt REDUCE action
17cc0 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74 20   and make.** it 
17cd0 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 4f 6e  the default.  On
17ce0 6c 79 20 64 65 66 61 75 6c 74 20 61 20 72 65 64  ly default a red
17cf0 75 63 65 20 69 66 20 74 68 65 72 65 20 61 72 65  uce if there are
17d00 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2e 0a   more than one..
17d10 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73  */.void Compress
17d20 54 61 62 6c 65 73 28 6c 65 6d 70 29 0a 73 74 72  Tables(lemp).str
17d30 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
17d40 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
17d50 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
17d60 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 61 70   action *ap, *ap
17d70 32 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  2;.  struct rule
17d80 20 2a 72 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65   *rp, *rp2, *rbe
17d90 73 74 3b 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c  st;.  int nbest,
17da0 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   n;.  int i;.  i
17db0 6e 74 20 63 6e 74 3b 0a 0a 20 20 66 6f 72 28 69  nt cnt;..  for(i
17dc0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
17dd0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
17de0 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
17df0 5b 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d  [i];.    nbest =
17e00 20 30 3b 0a 20 20 20 20 72 62 65 73 74 20 3d 20   0;.    rbest = 
17e10 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  0;..    for(ap=s
17e20 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
17e30 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
17e40 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 52 45  if( ap->type!=RE
17e50 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DUCE ) continue;
17e60 0a 20 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e  .      rp = ap->
17e70 78 2e 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20  x.rp;.      if( 
17e80 72 70 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74  rp==rbest ) cont
17e90 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20  inue;.      n = 
17ea0 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32  1;.      for(ap2
17eb0 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20  =ap->next; ap2; 
17ec0 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a  ap2=ap2->next){.
17ed0 20 20 20 20 20 20 20 20 69 66 28 20 61 70 32 2d          if( ap2-
17ee0 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20  >type!=REDUCE ) 
17ef0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
17f00 20 20 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72    rp2 = ap2->x.r
17f10 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  p;.        if( r
17f20 70 32 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74  p2==rbest ) cont
17f30 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
17f40 28 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b  ( rp2==rp ) n++;
17f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17f60 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20  f( n>nbest ){.  
17f70 20 20 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b        nbest = n;
17f80 0a 20 20 20 20 20 20 20 20 72 62 65 73 74 20 3d  .        rbest =
17f90 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rp;.      }.   
17fa0 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e   }. .    /* Do n
17fb0 6f 74 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c  ot make a defaul
17fc0 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t if the number 
17fd0 6f 66 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61  of rules to defa
17fe0 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ult.    ** is no
17ff0 74 20 61 74 20 6c 65 61 73 74 20 32 20 2a 2f 0a  t at least 2 */.
18000 20 20 20 20 69 66 28 20 6e 62 65 73 74 3c 32 20      if( nbest<2 
18010 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20  ) continue;...  
18020 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74    /* Combine mat
18030 63 68 69 6e 67 20 52 45 44 55 43 45 20 61 63 74  ching REDUCE act
18040 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ions into a sing
18050 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20  le default */.  
18060 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
18070 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
18080 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
18090 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
180a0 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73  & ap->x.rp==rbes
180b0 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
180c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20  .    assert( ap 
180d0 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20  );.    ap->sp = 
180e0 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66  Symbol_new("{def
180f0 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72  ault}");.    for
18100 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  (ap=ap->next; ap
18110 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
18120 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
18130 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
18140 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
18150 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55  ap->type = NOT_U
18160 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  SED;.    }.    s
18170 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f  tp->ap = Action_
18180 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20  sort(stp->ap);. 
18190 20 7d 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}../*********
181a0 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
181b0 65 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20 2a  e file "set.c" *
181c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
181e0 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d  ***/./*.** Set m
181f0 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74  anipulation rout
18200 69 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d  ines for the LEM
18210 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
18220 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  tor..*/..static 
18230 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f  int size = 0;../
18240 2a 20 53 65 74 20 74 68 65 20 73 65 74 20 73 69  * Set the set si
18250 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69  ze */.void SetSi
18260 7a 65 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20  ze(n).int n;.{. 
18270 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a   size = n+1;.}..
18280 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
18290 77 20 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53  w set */.char *S
182a0 65 74 4e 65 77 28 29 7b 0a 20 20 63 68 61 72 20  etNew(){.  char 
182b0 2a 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  *s;.  int i;.  s
182c0 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63   = (char*)malloc
182d0 28 20 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  ( size );.  if( 
182e0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65  s==0 ){.    exte
182f0 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65  rn void memory_e
18300 72 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f  rror();.    memo
18310 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a  ry_error();.  }.
18320 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
18330 65 3b 20 69 2b 2b 29 20 73 5b 69 5d 20 3d 20 30  e; i++) s[i] = 0
18340 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
18350 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  ./* Deallocate a
18360 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74   set */.void Set
18370 46 72 65 65 28 73 29 0a 63 68 61 72 20 2a 73 3b  Free(s).char *s;
18380 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a  .{.  free(s);.}.
18390 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  ./* Add a new el
183a0 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65 74  ement to the set
183b0 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
183c0 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77 61  f the element wa
183d0 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46  s added.** and F
183e0 41 4c 53 45 20 69 66 20 69 74 20 77 61 73 20 61  ALSE if it was a
183f0 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a 2f  lready there. */
18400 0a 69 6e 74 20 53 65 74 41 64 64 28 73 2c 65 29  .int SetAdd(s,e)
18410 0a 63 68 61 72 20 2a 73 3b 0a 69 6e 74 20 65 3b  .char *s;.int e;
18420 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20 72  .{.  int rv;.  r
18430 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d  v = s[e];.  s[e]
18440 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 21   = 1;.  return !
18450 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76  rv;.}../* Add ev
18460 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73  ery element of s
18470 32 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72 6e  2 to s1.  Return
18480 20 54 52 55 45 20 69 66 20 73 31 20 63 68 61 6e   TRUE if s1 chan
18490 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55  ges. */.int SetU
184a0 6e 69 6f 6e 28 73 31 2c 73 32 29 0a 63 68 61 72  nion(s1,s2).char
184b0 20 2a 73 31 3b 0a 63 68 61 72 20 2a 73 32 3b 0a   *s1;.char *s2;.
184c0 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f 67 72  {.  int i, progr
184d0 65 73 73 3b 0a 20 20 70 72 6f 67 72 65 73 73 20  ess;.  progress 
184e0 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
184f0 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  i<size; i++){.  
18500 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29    if( s2[i]==0 )
18510 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
18520 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20  f( s1[i]==0 ){. 
18530 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20       progress = 
18540 31 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d 20 3d  1;.      s1[i] =
18550 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
18560 72 65 74 75 72 6e 20 70 72 6f 67 72 65 73 73 3b  return progress;
18570 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
18580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
18590 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e  the file "table.
185a0 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
185b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
185c0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20  ./*.** All code 
185d0 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61 73  in this file has
185e0 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61   been automatica
185f0 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lly generated.**
18600 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63   from a specific
18610 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c  ation in the fil
18620 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
18630 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62    "table.q".** b
18640 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69 76  y the associativ
18650 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75 69  e array code bui
18660 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61  lding program "a
18670 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  agen"..** Do not
18680 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65 21   edit this file!
18690 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20    Instead, edit 
186a0 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  the specificatio
186b0 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  n.** file, then 
186c0 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a  rerun aagen..*/.
186d0 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
186e0 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73  rocessing tables
186f0 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
18700 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
18710 2a 2f 0a 0a 50 52 49 56 41 54 45 20 69 6e 74 20  */..PRIVATE int 
18720 73 74 72 68 61 73 68 28 78 29 0a 63 68 61 72 20  strhash(x).char 
18730 2a 78 3b 0a 7b 0a 20 20 69 6e 74 20 68 20 3d 20  *x;.{.  int h = 
18740 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 78 29 20  0;.  while( *x) 
18750 68 20 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b  h = h*13 + *(x++
18760 29 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d  );.  return h;.}
18770 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20  ../* Works like 
18780 73 74 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e  strdup, sort of.
18790 20 20 53 61 76 65 20 61 20 73 74 72 69 6e 67 20    Save a string 
187a0 69 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f  in malloced memo
187b0 72 79 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20  ry, but.** keep 
187c0 73 74 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62  strings in a tab
187d0 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  le so that the s
187e0 61 6d 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f  ame string is no
187f0 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61  t in more.** tha
18800 6e 20 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a  n one place..*/.
18810 63 68 61 72 20 2a 53 74 72 73 61 66 65 28 79 29  char *Strsafe(y)
18820 0a 63 68 61 72 20 2a 79 3b 0a 7b 0a 20 20 63 68  .char *y;.{.  ch
18830 61 72 20 2a 7a 3b 0a 0a 20 20 7a 20 3d 20 53 74  ar *z;..  z = St
18840 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20  rsafe_find(y);. 
18850 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 7a 3d   if( z==0 && (z=
18860 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 79  malloc( strlen(y
18870 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20  )+1 ))!=0 ){.   
18880 20 73 74 72 63 70 79 28 7a 2c 79 29 3b 0a 20 20   strcpy(z,y);.  
18890 20 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74    Strsafe_insert
188a0 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72  (z);.  }.  Memor
188b0 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74  yCheck(z);.  ret
188c0 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn z;.}../* The
188d0 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
188e0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
188f0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
18900 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
18910 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
18920 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72  ype "x1"..*/.str
18930 75 63 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74  uct s_x1 {.  int
18940 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
18950 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
18960 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
18970 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18990 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
189a0 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
189b0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
189c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
189d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
189e0 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
189f0 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
18a00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18a10 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
18a20 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
18a30 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
18a40 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
18a50 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
18a60 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
18a70 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
18a80 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
18a90 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
18aa0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
18ab0 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
18ac0 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
18ad0 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
18ae0 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
18af0 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
18b00 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x1"..*/.typed
18b10 65 66 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  ef struct s_x1no
18b20 64 65 20 7b 0a 20 20 63 68 61 72 20 2a 64 61 74  de {.  char *dat
18b30 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
18b40 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
18b50 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
18b60 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
18b70 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
18b80 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
18b90 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
18ba0 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
18bb0 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
18bc0 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x1node;../* T
18bd0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
18be0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
18bf0 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
18c00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
18c10 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
18c20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41  s_x1 *x1a;../* A
18c30 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
18c40 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
18c50 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f  */.void Strsafe_
18c60 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 31  init(){.  if( x1
18c70 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 31  a ) return;.  x1
18c80 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 31  a = (struct s_x1
18c90 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
18ca0 28 73 74 72 75 63 74 20 73 5f 78 31 29 20 29 3b  (struct s_x1) );
18cb0 0a 20 20 69 66 28 20 78 31 61 20 29 7b 0a 20 20  .  if( x1a ){.  
18cc0 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20 31 30    x1a->size = 10
18cd0 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63 6f 75  24;.    x1a->cou
18ce0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 31 61 2d  nt = 0;.    x1a-
18cf0 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29  >tbl = (x1node*)
18d00 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
18d10 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b  sizeof(x1node) +
18d20 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29   sizeof(x1node*)
18d30 29 2a 31 30 32 34 20 29 3b 0a 20 20 20 20 69 66  )*1024 );.    if
18d40 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x1a->tbl==0 ){
18d50 0a 20 20 20 20 20 20 66 72 65 65 28 78 31 61 29  .      free(x1a)
18d60 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30 3b  ;.      x1a = 0;
18d70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18d80 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
18d90 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64 65  1a->ht = (x1node
18da0 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31 30  **)&(x1a->tbl[10
18db0 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  24]);.      for(
18dc0 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b 2b  i=0; i<1024; i++
18dd0 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x1a->ht[i] = 0
18de0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
18df0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
18e00 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
18e10 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
18e20 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
18e30 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
18e40 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
18e50 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
18e60 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73 61  ten */.int Strsa
18e70 66 65 5f 69 6e 73 65 72 74 28 64 61 74 61 29 0a  fe_insert(data).
18e80 63 68 61 72 20 2a 64 61 74 61 3b 0a 7b 0a 20 20  char *data;.{.  
18e90 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e  x1node *np;.  in
18ea0 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a  t h;.  int ph;..
18eb0 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72    if( x1a==0 ) r
18ec0 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
18ed0 73 74 72 68 61 73 68 28 64 61 74 61 29 3b 0a 20  strhash(data);. 
18ee0 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e   h = ph & (x1a->
18ef0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
18f00 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x1a->ht[h];.  wh
18f10 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
18f20 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61  f( strcmp(np->da
18f30 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20  ta,data)==0 ){. 
18f40 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
18f50 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
18f60 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
18f70 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
18f80 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
18f90 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
18fa0 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
18fb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
18fc0 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
18fd0 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 31  xt;.  }.  if( x1
18fe0 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73  a->count>=x1a->s
18ff0 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
19000 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
19010 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
19020 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69   */.    int i,si
19030 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
19040 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x1 array;.    a
19050 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65  rray.size = size
19060 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x1a->size*2;.
19070 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
19080 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x1a->count;.  
19090 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
190a0 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20  1node*)malloc(. 
190b0 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 31 6e       (sizeof(x1n
190c0 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31  ode) + sizeof(x1
190d0 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a  node*))*size );.
190e0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
190f0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
19100 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
19110 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
19120 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
19130 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x1node**)&(ar
19140 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
19150 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
19160 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
19170 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
19180 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e 63  or(i=0; i<x1a->c
19190 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
191a0 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x1node *oldnp,
191b0 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
191c0 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62  ldnp = &(x1a->tb
191d0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
191e0 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e   strhash(oldnp->
191f0 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29  data) & (size-1)
19200 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
19210 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
19220 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
19230 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
19240 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
19250 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
19260 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
19270 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
19280 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
19290 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
192a0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
192b0 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
192c0 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
192d0 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
192e0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 31 61    }.    free(x1a
192f0 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61  ->tbl);.    *x1a
19300 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
19310 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
19320 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
19330 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d  ph & (x1a->size-
19340 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31 61  1);.  np = &(x1a
19350 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74  ->tbl[x1a->count
19360 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61  ++]);.  np->data
19370 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
19380 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d  1a->ht[h] ) x1a-
19390 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
193a0 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
193b0 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68 74  ->next = x1a->ht
193c0 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68  [h];.  x1a->ht[h
193d0 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
193e0 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68  om = &(x1a->ht[h
193f0 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
19400 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
19410 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
19420 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
19430 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
19440 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
19450 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 68 61  such key. */.cha
19460 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28  r *Strsafe_find(
19470 6b 65 79 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a  key).char *key;.
19480 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 31 6e  {.  int h;.  x1n
19490 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
194a0 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x1a==0 ) return 
194b0 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68  0;.  h = strhash
194c0 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69  (key) & (x1a->si
194d0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31  ze-1);.  np = x1
194e0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
194f0 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
19500 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61   strcmp(np->data
19510 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
19520 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
19530 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
19540 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
19550 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
19560 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
19570 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20  he (terminal or 
19580 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d  nonterminal) sym
19590 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61  bol "x"..** Crea
195a0 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20  te a new symbol 
195b0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
195c0 69 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61  irst time "x" ha
195d0 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a  s been seen..*/.
195e0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
195f0 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 0a 63 68 61  ymbol_new(x).cha
19600 72 20 2a 78 3b 0a 7b 0a 20 20 73 74 72 75 63 74  r *x;.{.  struct
19610 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20   symbol *sp;..  
19620 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
19630 28 78 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30  (x);.  if( sp==0
19640 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74   ){.    sp = (st
19650 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 6d 61  ruct symbol *)ma
19660 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
19670 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20  uct symbol) );. 
19680 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73     MemoryCheck(s
19690 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65  p);.    sp->name
196a0 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20   = Strsafe(x);. 
196b0 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20 69 73     sp->type = is
196c0 75 70 70 65 72 28 2a 78 29 20 3f 20 54 45 52 4d  upper(*x) ? TERM
196d0 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e  INAL : NONTERMIN
196e0 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65  AL;.    sp->rule
196f0 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72   = 0;.    sp->pr
19700 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d  ec = -1;.    sp-
19710 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20  >assoc = UNK;.  
19720 20 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 3d    sp->firstset =
19730 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62   0;.    sp->lamb
19740 64 61 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  da = FALSE;.    
19750 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d  sp->destructor =
19760 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74 61   0;.    sp->data
19770 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 53 79  type = 0;.    Sy
19780 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73  mbol_insert(sp,s
19790 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  p->name);.  }.  
197a0 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a  return sp;.}../*
197b0 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d   Compare two sym
197c0 62 6f 6c 73 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  bols */.int Symb
197d0 6f 6c 63 6d 70 70 28 61 2c 62 29 0a 73 74 72 75  olcmpp(a,b).stru
197e0 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 3b 0a 73  ct symbol **a;.s
197f0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 62  truct symbol **b
19800 3b 0a 7b 0a 20 20 72 65 74 75 72 6e 20 73 74 72  ;.{.  return str
19810 63 6d 70 28 28 2a 2a 61 29 2e 6e 61 6d 65 2c 28  cmp((**a).name,(
19820 2a 2a 62 29 2e 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f  **b).name);.}../
19830 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
19840 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
19850 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
19860 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
19870 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
19880 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a   of type "x2"..*
19890 2f 0a 73 74 72 75 63 74 20 73 5f 78 32 20 7b 0a  /.struct s_x2 {.
198a0 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
198b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
198c0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
198d0 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198f0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
19900 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
19910 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
19920 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19940 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
19950 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
19960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19970 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
19980 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
19990 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
199a0 32 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  2node *tbl;  /* 
199b0 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
199c0 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
199d0 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x2node **ht; 
199e0 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
199f0 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
19a00 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
19a10 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
19a20 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
19a30 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
19a40 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
19a50 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
19a60 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a  f type "x2"..*/.
19a70 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
19a80 5f 78 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x2node {.  stru
19a90 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b  ct symbol *data;
19aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ab0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
19ac0 0a 20 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20  .  char *key;   
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
19af0 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
19b00 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
19b10 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
19b20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
19b30 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a  truct s_x2node *
19b40 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
19b50 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32  ous link */.} x2
19b60 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
19b70 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
19b80 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
19b90 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
19ba0 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
19bb0 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 32 20  tic struct s_x2 
19bc0 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x2a;../* Alloca
19bd0 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
19be0 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
19bf0 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29  id Symbol_init()
19c00 7b 0a 20 20 69 66 28 20 78 32 61 20 29 20 72 65  {.  if( x2a ) re
19c10 74 75 72 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73  turn;.  x2a = (s
19c20 74 72 75 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c  truct s_x2*)mall
19c30 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
19c40 74 20 73 5f 78 32 29 20 29 3b 0a 20 20 69 66 28  t s_x2) );.  if(
19c50 20 78 32 61 20 29 7b 0a 20 20 20 20 78 32 61 2d   x2a ){.    x2a-
19c60 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20  >size = 128;.   
19c70 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x2a->count = 0;
19c80 0a 20 20 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20  .    x2a->tbl = 
19c90 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x2node*)malloc(
19ca0 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28   .      (sizeof(
19cb0 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x2node) + sizeof
19cc0 28 78 32 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29  (x2node*))*128 )
19cd0 3b 0a 20 20 20 20 69 66 28 20 78 32 61 2d 3e 74  ;.    if( x2a->t
19ce0 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
19cf0 72 65 65 28 78 32 61 29 3b 0a 20 20 20 20 20 20  ree(x2a);.      
19d00 78 32 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x2a = 0;.    }el
19d10 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
19d20 0a 20 20 20 20 20 20 78 32 61 2d 3e 68 74 20 3d  .      x2a->ht =
19d30 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61   (x2node**)&(x2a
19d40 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20  ->tbl[128]);.   
19d50 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32     for(i=0; i<12
19d60 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b  8; i++) x2a->ht[
19d70 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
19d80 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
19d90 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
19da0 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
19db0 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
19dc0 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
19dd0 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
19de0 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
19df0 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
19e00 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 64   Symbol_insert(d
19e10 61 74 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20  ata,key).struct 
19e20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 63 68  symbol *data;.ch
19e30 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 32 6e  ar *key;.{.  x2n
19e40 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68  ode *np;.  int h
19e50 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69  ;.  int ph;..  i
19e60 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75  f( x2a==0 ) retu
19e70 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72  rn 0;.  ph = str
19e80 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d  hash(key);.  h =
19e90 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65   ph & (x2a->size
19ea0 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d  -1);.  np = x2a-
19eb0 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
19ec0 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
19ed0 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  trcmp(np->key,ke
19ee0 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  y)==0 ){.      /
19ef0 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
19f00 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
19f10 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
19f20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
19f30 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
19f40 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
19f50 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
19f60 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
19f70 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
19f80 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75  }.  if( x2a->cou
19f90 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x2a->size ){
19fa0 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
19fb0 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
19fc0 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
19fd0 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
19fe0 20 20 73 74 72 75 63 74 20 73 5f 78 32 20 61 72    struct s_x2 ar
19ff0 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
1a000 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 32 61  ize = size = x2a
1a010 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
1a020 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d  ray.count = x2a-
1a030 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
1a040 79 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a  y.tbl = (x2node*
1a050 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28  )malloc(.      (
1a060 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
1a070 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
1a080 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  )*size );.    if
1a090 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
1a0a0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
1a0b0 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
1a0c0 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
1a0d0 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 32 6e   array.ht = (x2n
1a0e0 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
1a0f0 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  l[size]);.    fo
1a100 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
1a110 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
1a120 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
1a130 3b 20 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x2a->count; 
1a140 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f  i++){.      x2no
1a150 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
1a160 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
1a170 20 26 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x2a->tbl[i]);
1a180 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61  .      h = strha
1a190 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26  sh(oldnp->key) &
1a1a0 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
1a1b0 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
1a1c0 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
1a1d0 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
1a1e0 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
1a1f0 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
1a200 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
1a210 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
1a220 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
1a230 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
1a240 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
1a250 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
1a260 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
1a270 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
1a280 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
1a290 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
1a2a0 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
1a2b0 66 72 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a  free(x2a->tbl);.
1a2c0 20 20 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79      *x2a = array
1a2d0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
1a2e0 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
1a2f0 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  /.  h = ph & (x2
1a300 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1a310 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32   = &(x2a->tbl[x2
1a320 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
1a330 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
1a340 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
1a350 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b  ;.  if( x2a->ht[
1a360 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d  h] ) x2a->ht[h]-
1a370 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
1a380 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
1a390 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
1a3a0 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x2a->ht[h] = np;
1a3b0 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
1a3c0 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x2a->ht[h]);.  r
1a3d0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
1a3e0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1a3f0 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
1a400 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
1a410 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
1a420 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
1a430 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  y. */.struct sym
1a440 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
1a450 28 6b 65 79 29 0a 63 68 61 72 20 2a 6b 65 79 3b  (key).char *key;
1a460 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 32  .{.  int h;.  x2
1a470 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28  node *np;..  if(
1a480 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
1a490 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73   0;.  h = strhas
1a4a0 68 28 6b 65 79 29 20 26 20 28 78 32 61 2d 3e 73  h(key) & (x2a->s
1a4b0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
1a4c0 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  2a->ht[h];.  whi
1a4d0 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
1a4e0 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79  ( strcmp(np->key
1a4f0 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
1a500 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
1a510 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
1a520 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
1a530 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
1a540 6e 20 74 68 65 20 6e 2d 74 68 20 64 61 74 61 2e  n the n-th data.
1a550 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
1a560 20 6e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   n is out of ran
1a570 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79  ge. */.struct sy
1a580 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68  mbol *Symbol_Nth
1a590 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73  (n).int n;.{.  s
1a5a0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61  truct symbol *da
1a5b0 74 61 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26  ta;.  if( x2a &&
1a5c0 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e   n>0 && n<=x2a->
1a5d0 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74  count ){.    dat
1a5e0 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31  a = x2a->tbl[n-1
1a5f0 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b  ].data;.  }else{
1a600 0a 20 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20  .    data = 0;. 
1a610 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61   }.  return data
1a620 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
1a630 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
1a640 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  rray */.int Symb
1a650 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72  ol_count().{.  r
1a660 65 74 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d  eturn x2a ? x2a-
1a670 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f  >count : 0;.}../
1a680 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61  * Return an arra
1a690 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
1a6a0 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65   all data in the
1a6b0 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61   table..** The a
1a6c0 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
1a6d0 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52   from malloc.  R
1a6e0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65  eturn NULL if me
1a6f0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
1a700 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20  ** problems, or 
1a710 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  if the array is 
1a720 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74  empty. */.struct
1a730 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
1a740 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73  _arrayof().{.  s
1a750 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61  truct symbol **a
1a760 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69  rray;.  int i,si
1a770 7a 65 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  ze;.  if( x2a==0
1a780 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
1a790 69 7a 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74  ize = x2a->count
1a7a0 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72  ;.  array = (str
1a7b0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 6d 61  uct symbol **)ma
1a7c0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
1a7d0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 2a 73 69  uct symbol *)*si
1a7e0 7a 65 20 29 3b 0a 20 20 69 66 28 20 61 72 72 61  ze );.  if( arra
1a7f0 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
1a800 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
1a810 72 72 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74  rray[i] = x2a->t
1a820 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a  bl[i].data;.  }.
1a830 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a    return array;.
1a840 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
1a850 6f 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  o configurations
1a860 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d   */.int Configcm
1a870 70 28 61 2c 62 29 0a 73 74 72 75 63 74 20 63 6f  p(a,b).struct co
1a880 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75 63 74 20  nfig *a;.struct 
1a890 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69  config *b;.{.  i
1a8a0 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72  nt x;.  x = a->r
1a8b0 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70  p->index - b->rp
1a8c0 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 78  ->index;.  if( x
1a8d0 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74  ==0 ) x = a->dot
1a8e0 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74   - b->dot;.  ret
1a8f0 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  urn x;.}../* Com
1a900 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20  pare two states 
1a910 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73  */.PRIVATE int s
1a920 74 61 74 65 63 6d 70 28 61 2c 62 29 0a 73 74 72  tatecmp(a,b).str
1a930 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73  uct config *a;.s
1a940 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b  truct config *b;
1a950 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 66  .{.  int rc;.  f
1a960 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26  or(rc=0; rc==0 &
1a970 26 20 61 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e  & a && b;  a=a->
1a980 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20  bp, b=b->bp){.  
1a990 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e    rc = a->rp->in
1a9a0 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64  dex - b->rp->ind
1a9b0 65 78 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ex;.    if( rc==
1a9c0 30 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20  0 ) rc = a->dot 
1a9d0 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20  - b->dot;.  }.  
1a9e0 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
1a9f0 20 69 66 28 20 61 20 29 20 72 63 20 3d 20 31 3b   if( a ) rc = 1;
1aa00 0a 20 20 20 20 69 66 28 20 62 20 29 20 72 63 20  .    if( b ) rc 
1aa10 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
1aa20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73  rn rc;.}../* Has
1aa30 68 20 61 20 73 74 61 74 65 20 2a 2f 0a 50 52 49  h a state */.PRI
1aa40 56 41 54 45 20 69 6e 74 20 73 74 61 74 65 68 61  VATE int stateha
1aa50 73 68 28 61 29 0a 73 74 72 75 63 74 20 63 6f 6e  sh(a).struct con
1aa60 66 69 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20  fig *a;.{.  int 
1aa70 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28 20 61 20  h=0;.  while( a 
1aa80 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a 35 37 31  ){.    h = h*571
1aa90 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a   + a->rp->index*
1aaa0 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20  37 + a->dot;.   
1aab0 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a   a = a->bp;.  }.
1aac0 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
1aad0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
1aae0 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65   state structure
1aaf0 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65   */.struct state
1ab00 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a   *State_new().{.
1ab10 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1ab20 6e 65 77 3b 0a 20 20 6e 65 77 20 3d 20 28 73 74  new;.  new = (st
1ab30 72 75 63 74 20 73 74 61 74 65 20 2a 29 6d 61 6c  ruct state *)mal
1ab40 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
1ab50 63 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d  ct state) );.  M
1ab60 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 29 3b  emoryCheck(new);
1ab70 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d  .  return new;.}
1ab80 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1ab90 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1aba0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1abb0 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
1abc0 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
1abd0 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 33 22  ray of type "x3"
1abe0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 33  ..*/.struct s_x3
1abf0 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ac10 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
1ac20 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
1ac30 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1ac50 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
1ac60 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
1ac70 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
1aca0 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
1acb0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1acc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
1acd0 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
1ace0 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
1acf0 73 5f 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x3node *tbl;  
1ad00 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
1ad10 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
1ad20 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68  uct s_x3node **h
1ad30 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
1ad40 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
1ad50 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
1ad60 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1ad70 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
1ad80 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
1ad90 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
1ada0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1adb0 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a  y of type "x3"..
1adc0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1add0 74 20 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73  t s_x3node {.  s
1ade0 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74  truct state *dat
1adf0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
1ae00 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
1ae10 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
1ae20 69 67 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20  ig *key;        
1ae30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ae40 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
1ae50 74 20 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74  t s_x3node *next
1ae60 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
1ae70 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
1ae80 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
1ae90 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x3node **from
1aea0 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
1aeb0 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b  ink */.} x3node;
1aec0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1aed0 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
1aee0 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
1aef0 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
1af00 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
1af10 74 72 75 63 74 20 73 5f 78 33 20 2a 78 33 61 3b  truct s_x3 *x3a;
1af20 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
1af30 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
1af40 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74  array */.void St
1af50 61 74 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  ate_init(){.  if
1af60 28 20 78 33 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x3a ) return;.
1af70 20 20 78 33 61 20 3d 20 28 73 74 72 75 63 74 20    x3a = (struct 
1af80 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x3*)malloc( si
1af90 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 33  zeof(struct s_x3
1afa0 29 20 29 3b 0a 20 20 69 66 28 20 78 33 61 20 29  ) );.  if( x3a )
1afb0 7b 0a 20 20 20 20 78 33 61 2d 3e 73 69 7a 65 20  {.    x3a->size 
1afc0 3d 20 31 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e  = 128;.    x3a->
1afd0 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  count = 0;.    x
1afe0 33 61 2d 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64  3a->tbl = (x3nod
1aff0 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20  e*)malloc( .    
1b000 20 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65    (sizeof(x3node
1b010 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64  ) + sizeof(x3nod
1b020 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20 20 20  e*))*128 );.    
1b030 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20  if( x3a->tbl==0 
1b040 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 33  ){.      free(x3
1b050 61 29 3b 0a 20 20 20 20 20 20 78 33 61 20 3d 20  a);.      x3a = 
1b060 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1b070 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1b080 20 78 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f   x3a->ht = (x3no
1b090 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b  de**)&(x3a->tbl[
1b0a0 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  128]);.      for
1b0b0 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b  (i=0; i<128; i++
1b0c0 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x3a->ht[i] = 0
1b0d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
1b0e0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
1b0f0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
1b100 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
1b110 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
1b120 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
1b130 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
1b140 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
1b150 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65  ten */.int State
1b160 5f 69 6e 73 65 72 74 28 64 61 74 61 2c 6b 65 79  _insert(data,key
1b170 29 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  ).struct state *
1b180 64 61 74 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e  data;.struct con
1b190 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 33  fig *key;.{.  x3
1b1a0 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20  node *np;.  int 
1b1b0 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20  h;.  int ph;..  
1b1c0 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
1b1d0 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74  urn 0;.  ph = st
1b1e0 61 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20 20  atehash(key);.  
1b1f0 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73  h = ph & (x3a->s
1b200 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
1b210 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  3a->ht[h];.  whi
1b220 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
1b230 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b  ( statecmp(np->k
1b240 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  ey,key)==0 ){.  
1b250 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
1b260 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
1b270 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
1b280 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
1b290 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
1b2a0 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
1b2b0 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
1b2c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1b2d0 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
1b2e0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33 61  t;.  }.  if( x3a
1b2f0 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69  ->count>=x3a->si
1b300 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
1b310 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
1b320 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
1b330 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a  */.    int i,siz
1b340 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f  e;.    struct s_
1b350 78 33 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72  x3 array;.    ar
1b360 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20  ray.size = size 
1b370 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x3a->size*2;. 
1b380 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
1b390 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x3a->count;.   
1b3a0 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33   array.tbl = (x3
1b3b0 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20  node*)malloc(.  
1b3c0 20 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f      (sizeof(x3no
1b3d0 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e  de) + sizeof(x3n
1b3e0 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20  ode*))*size );. 
1b3f0 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
1b400 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1b410 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
1b420 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
1b430 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
1b440 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x3node**)&(arr
1b450 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20  ay.tbl[size]);. 
1b460 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
1b470 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68  ze; i++) array.h
1b480 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t[i] = 0;.    fo
1b490 72 28 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f  r(i=0; i<x3a->co
1b4a0 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unt; i++){.     
1b4b0 20 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20   x3node *oldnp, 
1b4c0 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c  *newnp;.      ol
1b4d0 64 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c  dnp = &(x3a->tbl
1b4e0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  [i]);.      h = 
1b4f0 73 74 61 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d  statehash(oldnp-
1b500 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29  >key) & (size-1)
1b510 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
1b520 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
1b530 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
1b540 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
1b550 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
1b560 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
1b570 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
1b580 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
1b590 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d      newnp->key =
1b5a0 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20   oldnp->key;.   
1b5b0 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
1b5c0 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
1b5d0 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
1b5e0 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
1b5f0 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
1b600 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
1b610 20 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61 2d   }.    free(x3a-
1b620 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20  >tbl);.    *x3a 
1b630 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
1b640 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
1b650 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
1b660 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  h & (x3a->size-1
1b670 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61 2d  );.  np = &(x3a-
1b680 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x3a->count+
1b690 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d  +]);.  np->key =
1b6a0 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61   key;.  np->data
1b6b0 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
1b6c0 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d  3a->ht[h] ) x3a-
1b6d0 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
1b6e0 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
1b6f0 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68 74  ->next = x3a->ht
1b700 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68  [h];.  x3a->ht[h
1b710 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
1b720 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68  om = &(x3a->ht[h
1b730 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
1b740 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
1b750 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
1b760 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
1b770 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
1b780 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
1b790 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
1b7a0 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65  uct state *State
1b7b0 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74 72 75 63  _find(key).struc
1b7c0 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b  t config *key;.{
1b7d0 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 33 6e 6f  .  int h;.  x3no
1b7e0 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
1b7f0 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  3a==0 ) return 0
1b800 3b 0a 20 20 68 20 3d 20 73 74 61 74 65 68 61 73  ;.  h = statehas
1b810 68 28 6b 65 79 29 20 26 20 28 78 33 61 2d 3e 73  h(key) & (x3a->s
1b820 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
1b830 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  3a->ht[h];.  whi
1b840 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
1b850 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b  ( statecmp(np->k
1b860 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  ey,key)==0 ) bre
1b870 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
1b880 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
1b890 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
1b8a0 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  a : 0;.}../* Ret
1b8b0 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20  urn an array of 
1b8c0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
1b8d0 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c  data in the tabl
1b8e0 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20  e..** The array 
1b8f0 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
1b900 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e   malloc.  Return
1b910 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20   NULL if memory 
1b920 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72  allocation.** pr
1b930 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68  oblems, or if th
1b940 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79  e array is empty
1b950 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
1b960 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f  e **State_arrayo
1b970 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  f().{.  struct s
1b980 74 61 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20  tate **array;.  
1b990 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66  int i,size;.  if
1b9a0 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x3a==0 ) retur
1b9b0 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 33  n 0;.  size = x3
1b9c0 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61  a->count;.  arra
1b9d0 79 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74  y = (struct stat
1b9e0 65 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  e **)malloc( siz
1b9f0 65 6f 66 28 73 74 72 75 63 74 20 73 74 61 74 65  eof(struct state
1ba00 20 2a 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66   *)*size );.  if
1ba10 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66  ( array ){.    f
1ba20 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
1ba30 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20  i++) array[i] = 
1ba40 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61  x3a->tbl[i].data
1ba50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
1ba60 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68  rray;.}../* Hash
1ba70 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
1ba80 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20   */.PRIVATE int 
1ba90 63 6f 6e 66 69 67 68 61 73 68 28 61 29 0a 73 74  confighash(a).st
1baa0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a  ruct config *a;.
1bab0 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 68  {.  int h=0;.  h
1bac0 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70   = h*571 + a->rp
1bad0 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e  ->index*37 + a->
1bae0 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b  dot;.  return h;
1baf0 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  .}../* There is 
1bb00 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
1bb10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1bb20 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
1bb30 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20  .** associative 
1bb40 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
1bb50 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  4"..*/.struct s_
1bb60 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  x4 {.  int size;
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bb80 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1bb90 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e  available slots.
1bba0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bbc0 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77     Must be a pow
1bbd0 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
1bbe0 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20  than or */.     
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20       /*   equal 
1bc10 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  to 1 */.  int co
1bc20 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
1bc30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1bc40 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66  urrently slots f
1bc50 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  illed */.  struc
1bc60 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b  t s_x4node *tbl;
1bc70 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74    /* The data st
1bc80 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73  ored here */.  s
1bc90 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
1bca0 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61  *ht;  /* Hash ta
1bcb0 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20  ble for lookups 
1bcc0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  */.};../* There 
1bcd0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
1bce0 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
1bcf0 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  e for every data
1bd00 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61   element.** in a
1bd10 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  n associative ar
1bd20 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22  ray of type "x4"
1bd30 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1bd40 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20  uct s_x4node {. 
1bd50 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
1bd60 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
1bd70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1bd80 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ta */.  struct s
1bd90 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x4node *next;  
1bda0 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
1bdb0 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
1bdc0 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
1bdd0 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x4node **from;  
1bde0 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
1bdf0 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f   */.} x4node;../
1be00 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
1be10 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
1be20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
1be30 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
1be40 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
1be50 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f  ct s_x4 *x4a;../
1be60 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
1be70 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1be80 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  ay */.void Confi
1be90 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a 20  gtable_init(){. 
1bea0 20 69 66 28 20 78 34 61 20 29 20 72 65 74 75 72   if( x4a ) retur
1beb0 6e 3b 0a 20 20 78 34 61 20 3d 20 28 73 74 72 75  n;.  x4a = (stru
1bec0 63 74 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28  ct s_x4*)malloc(
1bed0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
1bee0 5f 78 34 29 20 29 3b 0a 20 20 69 66 28 20 78 34  _x4) );.  if( x4
1bef0 61 20 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69  a ){.    x4a->si
1bf00 7a 65 20 3d 20 36 34 3b 0a 20 20 20 20 78 34 61  ze = 64;.    x4a
1bf10 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
1bf20 20 78 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e   x4a->tbl = (x4n
1bf30 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20  ode*)malloc( .  
1bf40 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f      (sizeof(x4no
1bf50 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e  de) + sizeof(x4n
1bf60 6f 64 65 2a 29 29 2a 36 34 20 29 3b 0a 20 20 20  ode*))*64 );.   
1bf70 20 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d 30   if( x4a->tbl==0
1bf80 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
1bf90 34 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20 3d  4a);.      x4a =
1bfa0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1bfb0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1bfc0 20 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34 6e    x4a->ht = (x4n
1bfd0 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62 6c  ode**)&(x4a->tbl
1bfe0 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  [64]);.      for
1bff0 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29  (i=0; i<64; i++)
1c000 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x4a->ht[i] = 0;
1c010 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
1c020 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
1c030 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
1c040 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
1c050 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
1c060 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
1c070 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
1c080 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
1c090 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67  en */.int Config
1c0a0 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 64 61 74  table_insert(dat
1c0b0 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a).struct config
1c0c0 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78 34 6e 6f   *data;.{.  x4no
1c0d0 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b  de *np;.  int h;
1c0e0 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66  .  int ph;..  if
1c0f0 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
1c100 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66  n 0;.  ph = conf
1c110 69 67 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20  ighash(data);.  
1c120 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73  h = ph & (x4a->s
1c130 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
1c140 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  4a->ht[h];.  whi
1c150 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
1c160 28 20 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d 3e  ( Configcmp(np->
1c170 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b  data,data)==0 ){
1c180 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
1c190 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
1c1a0 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
1c1b0 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
1c1c0 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
1c1d0 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
1c1e0 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
1c1f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1c200 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
1c210 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
1c220 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d  x4a->count>=x4a-
1c230 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
1c240 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
1c250 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
1c260 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
1c270 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
1c280 20 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20 20   s_x4 array;.   
1c290 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
1c2a0 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32  ze = x4a->size*2
1c2b0 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
1c2c0 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x4a->count;.
1c2d0 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
1c2e0 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x4node*)malloc(
1c2f0 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
1c300 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  4node) + sizeof(
1c310 78 34 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x4node*))*size )
1c320 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
1c330 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
1c340 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
1c350 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
1c360 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
1c370 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28  t = (x4node**)&(
1c380 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
1c390 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1c3a0 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
1c3b0 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
1c3c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d   for(i=0; i<x4a-
1c3d0 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
1c3e0 20 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e      x4node *oldn
1c3f0 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
1c400 20 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e   oldnp = &(x4a->
1c410 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
1c420 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c   = confighash(ol
1c430 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69  dnp->data) & (si
1c440 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
1c450 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
1c460 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
1c470 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
1c480 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
1c490 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
1c4a0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
1c4b0 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
1c4c0 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
1c4d0 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61  data = oldnp->da
1c4e0 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ta;.      newnp-
1c4f0 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e  >from = &(array.
1c500 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72  ht[h]);.      ar
1c510 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e  ray.ht[h] = newn
1c520 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65  p;.    }.    fre
1c530 65 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20  e(x4a->tbl);.   
1c540 20 2a 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20   *x4a = array;. 
1c550 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74   }.  /* Insert t
1c560 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20  he new data */. 
1c570 20 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e   h = ph & (x4a->
1c580 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
1c590 26 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e  &(x4a->tbl[x4a->
1c5a0 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d  count++]);.  np-
1c5b0 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
1c5c0 69 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29  if( x4a->ht[h] )
1c5d0 20 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x4a->ht[h]->fro
1c5e0 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
1c5f0 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34  .  np->next = x4
1c600 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d  a->ht[h];.  x4a-
1c610 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
1c620 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d  p->from = &(x4a-
1c630 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
1c640 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
1c650 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
1c660 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
1c670 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
1c680 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
1c690 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
1c6a0 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
1c6b0 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e  *Configtable_fin
1c6c0 64 28 6b 65 79 29 0a 73 74 72 75 63 74 20 63 6f  d(key).struct co
1c6d0 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69  nfig *key;.{.  i
1c6e0 6e 74 20 68 3b 0a 20 20 78 34 6e 6f 64 65 20 2a  nt h;.  x4node *
1c6f0 6e 70 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d  np;..  if( x4a==
1c700 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1c710 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6b  h = confighash(k
1c720 65 79 29 20 26 20 28 78 34 61 2d 3e 73 69 7a 65  ey) & (x4a->size
1c730 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d  -1);.  np = x4a-
1c740 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
1c750 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43   np ){.    if( C
1c760 6f 6e 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74  onfigcmp(np->dat
1c770 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61  a,key)==0 ) brea
1c780 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e  k;.    np = np->
1c790 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  next;.  }.  retu
1c7a0 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61  rn np ? np->data
1c7b0 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f   : 0;.}../* Remo
1c7c0 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d  ve all data from
1c7d0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 50 61 73   the table.  Pas
1c7e0 73 20 65 61 63 68 20 64 61 74 61 20 74 6f 20 74  s each data to t
1c7f0 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a  he function "f".
1c800 2a 2a 20 61 73 20 69 74 20 69 73 20 72 65 6d 6f  ** as it is remo
1c810 76 65 64 2e 20 20 28 22 66 22 20 6d 61 79 20 62  ved.  ("f" may b
1c820 65 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20  e null to avoid 
1c830 74 68 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76  this step.) */.v
1c840 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  oid Configtable_
1c850 63 6c 65 61 72 28 66 29 0a 69 6e 74 28 2a 66 29  clear(f).int(*f)
1c860 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69  (/* struct confi
1c870 67 20 2a 20 2a 2f 29 3b 0a 7b 0a 20 20 69 6e 74  g * */);.{.  int
1c880 20 69 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30   i;.  if( x4a==0
1c890 20 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d   || x4a->count==
1c8a0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
1c8b0 28 20 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  ( f ) for(i=0; i
1c8c0 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x4a->count; i++
1c8d0 29 20 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b  ) (*f)(x4a->tbl[
1c8e0 69 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28  i].data);.  for(
1c8f0 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65  i=0; i<x4a->size
1c900 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69  ; i++) x4a->ht[i
1c910 5d 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f  ] = 0;.  x4a->co
1c920 75 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  unt = 0;.  retur
1c930 6e 3b 0a 7d 0a                                   n;.}.