/ Hex Artifact Content
Login

Artifact 459cb2bb3738a1ad5cb0ad8b805587a88a885d95:


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 73  if an NT) */.  s
1030: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61  truct symbol *fa
1040: 6c 6c 62 61 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62  llback; /* fallb
1050: 61 63 6b 20 74 6f 6b 65 6e 20 69 6e 20 63 61 73  ack token in cas
1060: 65 20 74 68 69 73 20 74 6f 6b 65 6e 20 64 6f 65  e this token doe
1070: 73 6e 27 74 20 70 61 72 73 65 20 2a 2f 0a 20 20  sn't parse */.  
1080: 69 6e 74 20 70 72 65 63 3b 20 20 20 20 20 20 20  int prec;       
1090: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63           /* Prec
10a0: 65 64 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65  edence if define
10b0: 64 20 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29  d (-1 otherwise)
10c0: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73   */.  enum e_ass
10d0: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
10e0: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
10f0: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 20 20 7d 20  NE,.    UNK.  } 
1100: 61 73 73 6f 63 3b 20 20 20 20 20 20 20 20 20 20  assoc;          
1110: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
1120: 61 74 69 76 69 74 79 20 69 66 20 70 72 65 64 65  ativity if prede
1130: 63 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64  cence is defined
1140: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73   */.  char *firs
1150: 74 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  tset;          /
1160: 2a 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20  * First-set for 
1170: 61 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69  all rules of thi
1180: 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f  s symbol */.  Bo
1190: 6f 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20  olean lambda;   
11a0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11b0: 66 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e  f NT and can gen
11c0: 65 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73  erate an empty s
11d0: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
11e0: 2a 64 65 73 74 72 75 63 74 6f 72 3b 20 20 20 20  *destructor;    
11f0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 77 68 69 63      /* Code whic
1200: 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65  h executes whene
1210: 76 65 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20  ver this symbol 
1220: 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  is.             
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1240: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
1250: 20 73 74 61 63 6b 20 64 75 72 69 6e 67 20 65 72   stack during er
1260: 72 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  ror processing *
1270: 2f 0a 20 20 69 6e 74 20 64 65 73 74 72 75 63 74  /.  int destruct
1280: 6f 72 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  orln;        /* 
1290: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 64  Line number of d
12a0: 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20 2a  estructor code *
12b0: 2f 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79  /.  char *dataty
12c0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe;          /* 
12d0: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66  The data type of
12e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c   information hel
12f0: 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20  d by this.      
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
1320: 4f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70  Only used if typ
1330: 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a  e==NONTERMINAL *
1340: 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20  /.  int dtnum;  
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1360: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75  The data type nu
1370: 6d 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61  mber.  In the pa
1380: 72 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a  rser, the value.
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74             ** st
13b0: 61 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20  ack is a union. 
13c0: 20 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65   The .yy%d eleme
13d0: 6e 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20  nt of this.     
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69        ** union i
1400: 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61  s the correct da
1410: 74 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  ta type for this
1420: 20 6f 62 6a 65 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f   object */.};../
1430: 2a 20 45 61 63 68 20 70 72 6f 64 75 63 74 69 6f  * Each productio
1440: 6e 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72  n rule in the gr
1450: 61 6d 6d 61 72 20 69 73 20 73 74 6f 72 65 64 20  ammar is stored 
1460: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1470: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
1480: 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c 65 20 7b  */.struct rule {
1490: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
14a0: 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f 2a 20 4c   *lhs;      /* L
14b0: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  eft-hand side of
14c0: 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 63   the rule */.  c
14d0: 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20  har *lhsalias;  
14e0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73          /* Alias
14f0: 20 66 6f 72 20 74 68 65 20 4c 48 53 20 28 4e 55   for the LHS (NU
1500: 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20  LL if none) */. 
1510: 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20   int ruleline;  
1520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
1530: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
1540: 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   rule */.  int n
1550: 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  rhs;            
1560: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1570: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a   RHS symbols */.
1580: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1590: 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68  **rhs;     /* Th
15a0: 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f  e RHS symbols */
15b0: 0a 20 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69  .  char **rhsali
15c0: 61 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  as;         /* A
15d0: 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68  n alias for each
15e0: 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c   RHS symbol (NUL
15f0: 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20  L if none) */.  
1600: 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20  int line;       
1610: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
1620: 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68   number at which
1630: 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a   code begins */.
1640: 20 20 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20    char *code;   
1650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1660: 65 20 63 6f 64 65 20 65 78 65 63 75 74 65 64 20  e code executed 
1670: 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69  when this rule i
1680: 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 73  s reduced */.  s
1690: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72  truct symbol *pr
16a0: 65 63 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65  ecsym;  /* Prece
16b0: 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72  dence symbol for
16c0: 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20   this rule */.  
16d0: 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20  int index;      
16e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
16f0: 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20  ndex number for 
1700: 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 42  this rule */.  B
1710: 6f 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75 63 65  oolean canReduce
1720: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
1730: 69 66 20 74 68 69 73 20 72 75 6c 65 20 69 73 20  if this rule is 
1740: 65 76 65 72 20 72 65 64 75 63 65 64 20 2a 2f 0a  ever reduced */.
1750: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e    struct rule *n
1760: 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65  extlhs;    /* Ne
1770: 78 74 20 72 75 6c 65 20 77 69 74 68 20 74 68 65  xt rule with the
1780: 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73   same LHS */.  s
1790: 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74  truct rule *next
17a0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  ;       /* Next 
17b0: 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62  rule in the glob
17c0: 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f  al list */.};../
17d0: 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  * A configuratio
17e0: 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f  n is a productio
17f0: 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72  n rule of the gr
1800: 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77  ammar together w
1810: 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64  ith.** a mark (d
1820: 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20  ot) showing how 
1830: 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c  much of that rul
1840: 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65  e has been proce
1850: 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20  ssed so far..** 
1860: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61  Configurations a
1870: 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f  lso contain a fo
1880: 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69  llow-set which i
1890: 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d  s a list of term
18a0: 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20  inal.** symbols 
18b0: 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65  which are allowe
18c0: 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  d to immediately
18d0: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20   follow the end 
18e0: 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20  of the rule..** 
18f0: 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74  Every configurat
1900: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
1910: 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  as an instance o
1920: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
1930: 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69   */.struct confi
1940: 67 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  g {.  struct rul
1950: 65 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f  e *rp;         /
1960: 2a 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20  * The rule upon 
1970: 77 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67  which the config
1980: 75 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64  uration is based
1990: 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20   */.  int dot;  
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19b0: 2a 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e  * The parse poin
19c0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73  t */.  char *fws
19d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19e0: 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f  /* Follow-set fo
19f0: 72 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61  r this configura
1a00: 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73  tion only */.  s
1a10: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c  truct plink *fpl
1a20: 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f  p;      /* Follo
1a30: 77 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72  w-set forward pr
1a40: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20  opagation links 
1a50: 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  */.  struct plin
1a60: 6b 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a  k *bplp;      /*
1a70: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b   Follow-set back
1a80: 77 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f  wards propagatio
1a90: 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72  n links */.  str
1aa0: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
1ab0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1ac0: 20 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20   to state which 
1ad0: 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f  contains this */
1ae0: 0a 20 20 65 6e 75 6d 20 7b 0a 20 20 20 20 43 4f  .  enum {.    CO
1af0: 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20  MPLETE,         
1b00: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74       /* The stat
1b10: 75 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  us is used durin
1b20: 67 20 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20  g followset and 
1b30: 2a 2f 0a 20 20 20 20 49 4e 43 4f 4d 50 4c 45 54  */.    INCOMPLET
1b40: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E             /*
1b50: 20 20 20 20 73 68 69 66 74 20 63 6f 6d 70 75 74      shift comput
1b60: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 20 73 74  ations */.  } st
1b70: 61 74 75 73 3b 0a 20 20 73 74 72 75 63 74 20 63  atus;.  struct c
1b80: 6f 6e 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20  onfig *next;    
1b90: 20 2f 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75   /* Next configu
1ba0: 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74  ration in the st
1bb0: 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
1bc0: 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20  config *bp;     
1bd0: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61    /* The next ba
1be0: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
1bf0: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72  n */.};../* Ever
1c00: 79 20 73 68 69 66 74 20 6f 72 20 72 65 64 75 63  y shift or reduc
1c10: 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73  e operation is s
1c20: 74 6f 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20  tored as one of 
1c30: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
1c40: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b  .struct action {
1c50: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1c60: 20 2a 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *sp;       /* T
1c70: 68 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79  he look-ahead sy
1c80: 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65  mbol */.  enum e
1c90: 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 53 48  _action {.    SH
1ca0: 49 46 54 2c 0a 20 20 20 20 41 43 43 45 50 54 2c  IFT,.    ACCEPT,
1cb0: 0a 20 20 20 20 52 45 44 55 43 45 2c 0a 20 20 20  .    REDUCE,.   
1cc0: 20 45 52 52 4f 52 2c 0a 20 20 20 20 43 4f 4e 46   ERROR,.    CONF
1cd0: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
1ce0: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65       /* Was a re
1cf0: 64 75 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f  duce, but part o
1d00: 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  f a conflict */.
1d10: 20 20 20 20 53 48 5f 52 45 53 4f 4c 56 45 44 2c      SH_RESOLVED,
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d30: 57 61 73 20 61 20 73 68 69 66 74 2e 20 20 50 72  Was a shift.  Pr
1d40: 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65  ecedence resolve
1d50: 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  d conflict */.  
1d60: 20 20 52 44 5f 52 45 53 4f 4c 56 45 44 2c 20 20    RD_RESOLVED,  
1d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
1d80: 73 20 72 65 64 75 63 65 2e 20 20 50 72 65 63 65  s reduce.  Prece
1d90: 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63  dence resolved c
1da0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 4e  onflict */.    N
1db0: 4f 54 5f 55 53 45 44 20 20 20 20 20 20 20 20 20  OT_USED         
1dc0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1dd0: 65 64 20 62 79 20 63 6f 6d 70 72 65 73 73 69 6f  ed by compressio
1de0: 6e 20 2a 2f 0a 20 20 7d 20 74 79 70 65 3b 0a 20  n */.  } type;. 
1df0: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72   union {.    str
1e00: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
1e10: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 73      /* The new s
1e20: 74 61 74 65 2c 20 69 66 20 61 20 73 68 69 66 74  tate, if a shift
1e30: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 72   */.    struct r
1e40: 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 2f  ule *rp;       /
1e50: 2a 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20 61  * The rule, if a
1e60: 20 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78   reduce */.  } x
1e70: 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
1e80: 6e 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20  n *next;     /* 
1e90: 4e 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  Next action for 
1ea0: 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20  this state */.  
1eb0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 63  struct action *c
1ec0: 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78 74  ollide;  /* Next
1ed0: 20 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65   action with the
1ee0: 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d 3b   same hash */.};
1ef0: 0a 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65 20  ../* Each state 
1f00: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
1f10: 20 70 61 72 73 65 72 27 73 20 66 69 6e 69 74 65   parser's finite
1f20: 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 2a   state machine.*
1f30: 2a 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20  * is encoded as 
1f40: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1f50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1f60: 75 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75 63  ucture. */.struc
1f70: 74 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72 75  t state {.  stru
1f80: 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20  ct config *bp;  
1f90: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73 69       /* The basi
1fa0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  s configurations
1fb0: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20   for this state 
1fc0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
1fd0: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
1fe0: 20 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   All configurati
1ff0: 6f 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74 20  ons in this set 
2000: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2020: 20 53 65 71 75 65 6e 63 69 61 6c 20 6e 75 6d 62   Sequencial numb
2030: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
2040: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63  e */.  struct ac
2050: 74 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20 20  tion *ap;       
2060: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
2070: 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74 61  ons for this sta
2080: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 61 63 74  te */.  int nact
2090: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
20a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63   /* Number of ac
20b0: 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73  tions for this s
20c0: 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 74 61  tate */.  int ta
20d0: 62 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20  bstart;         
20e0: 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 64 65     /* First inde
20f0: 78 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20  x of the action 
2100: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74  table */.  int t
2110: 61 62 64 66 6c 74 61 63 74 3b 20 20 20 20 20 20  abdfltact;      
2120: 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 61      /* Default a
2130: 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  ction */.};../* 
2140: 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70  A followset prop
2150: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64  agation link ind
2160: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
2170: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a  contents of one.
2180: 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** configuration
2190: 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c   followset shoul
21a0: 64 20 62 65 20 70 72 6f 70 61 67 61 74 65 64 20  d be propagated 
21b0: 74 6f 20 61 6e 6f 74 68 65 72 20 77 68 65 6e 65  to another whene
21c0: 76 65 72 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ver.** the first
21d0: 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72   changes. */.str
21e0: 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74  uct plink {.  st
21f0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
2200: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;      /* The co
2210: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 77  nfiguration to w
2220: 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20  hich linked */. 
2230: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
2240: 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ext;      /* The
2250: 20 6e 65 78 74 20 70 72 6f 70 61 67 61 74 65 20   next propagate 
2260: 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  link */.};../* T
2270: 68 65 20 73 74 61 74 65 20 76 65 63 74 6f 72 20  he state vector 
2280: 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 70  for the entire p
2290: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20  arser generator 
22a0: 69 73 20 72 65 63 6f 72 64 65 64 20 61 73 0a 2a  is recorded as.*
22b0: 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d  * follows.  (LEM
22c0: 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61  ON uses no globa
22d0: 6c 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  l variables and 
22e0: 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20 75 73 65  makes little use
22f0: 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63 20 76 61   of.** static va
2300: 72 69 61 62 6c 65 73 2e 20 20 46 69 65 6c 64 73  riables.  Fields
2310: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
2320: 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  g structure can 
2330: 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66  be thought.** of
2340: 20 61 73 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c   as begin global
2350: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
2360: 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73  e program.) */.s
2370: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20  truct lemon {.  
2380: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 73  struct state **s
2390: 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c  orted;   /* Tabl
23a0: 65 20 6f 66 20 73 74 61 74 65 73 20 73 6f 72 74  e of states sort
23b0: 65 64 20 62 79 20 73 74 61 74 65 20 6e 75 6d 62  ed by state numb
23c0: 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  er */.  struct r
23d0: 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20  ule *rule;      
23e0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
23f0: 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rules */.  int n
2400: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
2410: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2420: 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74   states */.  int
2430: 20 6e 72 75 6c 65 3b 20 20 20 20 20 20 20 20 20   nrule;         
2440: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2450: 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e  of rules */.  in
2460: 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20  t nsymbol;      
2470: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2480: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64   of terminal and
2490: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d   nonterminal sym
24a0: 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74  bols */.  int nt
24b0: 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20 20  erminal;        
24c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24d0: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
24e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
24f0: 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f  bol **symbols; /
2500: 2a 20 53 6f 72 74 65 64 20 61 72 72 61 79 20 6f  * Sorted array o
2510: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 79  f pointers to sy
2520: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65  mbols */.  int e
2530: 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20  rrorcnt;        
2540: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2550: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72   errors */.  str
2560: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73  uct symbol *errs
2570: 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65 72 72  ym;   /* The err
2580: 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 63  or symbol */.  c
2590: 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
25a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
25b0: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
25c0: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61   parser */.  cha
25d0: 72 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20  r *arg;         
25e0: 20 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61        /* Declara
25f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20  tion of the 3th 
2600: 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73  argument to pars
2610: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  er */.  char *to
2620: 6b 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20  kentype;        
2630: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d   /* Type of term
2640: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20  inal symbols in 
2650: 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b  the parser stack
2660: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74   */.  char *vart
2670: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ype;           /
2680: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 74 79  * The default ty
2690: 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e  pe of non-termin
26a0: 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  al symbols */.  
26b0: 63 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20  char *start;    
26c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
26d0: 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 73 79   of the start sy
26e0: 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61  mbol for the gra
26f0: 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mmar */.  char *
2700: 73 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20  stacksize;      
2710: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
2720: 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a  e parser stack *
2730: 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64  /.  char *includ
2740: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2750: 43 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20 74  Code to put at t
2760: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2770: 43 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  C file */.  int 
2780: 20 69 6e 63 6c 75 64 65 6c 6e 3b 20 20 20 20 20   includeln;     
2790: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
27a0: 62 65 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66  ber for start of
27b0: 20 69 6e 63 6c 75 64 65 20 63 6f 64 65 20 2a 2f   include code */
27c0: 0a 20 20 63 68 61 72 20 2a 65 72 72 6f 72 3b 20  .  char *error; 
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
27e0: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 77  ode to execute w
27f0: 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 69 73 20  hen an error is 
2800: 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 20 65  seen */.  int  e
2810: 72 72 6f 72 6c 6e 3b 20 20 20 20 20 20 20 20 20  rrorln;         
2820: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
2830: 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 65  r for start of e
2840: 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  rror code */.  c
2850: 68 61 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20  har *overflow;  
2860: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2870: 74 6f 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20  to execute on a 
2880: 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a  stack overflow *
2890: 2f 0a 20 20 69 6e 74 20 20 6f 76 65 72 66 6c 6f  /.  int  overflo
28a0: 77 6c 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  wln;         /* 
28b0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
28c0: 73 74 61 72 74 20 6f 66 20 6f 76 65 72 66 6c 6f  start of overflo
28d0: 77 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  w code */.  char
28e0: 20 2a 66 61 69 6c 75 72 65 3b 20 20 20 20 20 20   *failure;      
28f0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
2900: 65 78 65 63 75 74 65 20 6f 6e 20 70 61 72 73 65  execute on parse
2910: 72 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 69  r failure */.  i
2920: 6e 74 20 20 66 61 69 6c 75 72 65 6c 6e 3b 20 20  nt  failureln;  
2930: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
2940: 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74  number for start
2950: 20 6f 66 20 66 61 69 6c 75 72 65 20 63 6f 64 65   of failure code
2960: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65   */.  char *acce
2970: 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pt;            /
2980: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
2990: 65 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65  e when the parse
29a0: 72 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 69  r excepts */.  i
29b0: 6e 74 20 20 61 63 63 65 70 74 6c 6e 3b 20 20 20  nt  acceptln;   
29c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
29d0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73  number for the s
29e0: 74 61 72 74 20 6f 66 20 61 63 63 65 70 74 20 63  tart of accept c
29f0: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65  ode */.  char *e
2a00: 78 74 72 61 63 6f 64 65 3b 20 20 20 20 20 20 20  xtracode;       
2a10: 20 20 2f 2a 20 43 6f 64 65 20 61 70 70 65 6e 64    /* Code append
2a20: 65 64 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61  ed to the genera
2a30: 74 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ted file */.  in
2a40: 74 20 20 65 78 74 72 61 63 6f 64 65 6c 6e 3b 20  t  extracodeln; 
2a50: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
2a60: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 73 74  umber for the st
2a70: 61 72 74 20 6f 66 20 74 68 65 20 65 78 74 72 61  art of the extra
2a80: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
2a90: 2a 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20  *tokendest;     
2aa0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
2ab0: 78 65 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f  xecute to destro
2ac0: 79 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a  y token data */.
2ad0: 20 20 69 6e 74 20 20 74 6f 6b 65 6e 64 65 73 74    int  tokendest
2ae0: 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ln;        /* Li
2af0: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 6f  ne number for to
2b00: 6b 65 6e 20 64 65 73 74 72 6f 79 65 72 20 63 6f  ken destroyer co
2b10: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61  de */.  char *va
2b20: 72 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  rdest;          
2b30: 20 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74 68 65   /* Code for the
2b40: 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74 65 72   default non-ter
2b50: 6d 69 6e 61 6c 20 64 65 73 74 72 75 63 74 6f 72  minal destructor
2b60: 20 2a 2f 0a 20 20 69 6e 74 20 20 76 61 72 64 65   */.  int  varde
2b70: 73 74 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  stln;          /
2b80: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
2b90: 72 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74 65  r default non-te
2ba0: 72 6d 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f  rm destructor co
2bb0: 64 65 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 6c  de*/.  char *fil
2bc0: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
2bd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
2be0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 63  nput file */.  c
2bf0: 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20 20  har *outname;   
2c00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2c10: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  of the current o
2c20: 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  utput file */.  
2c30: 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66 69  char *tokenprefi
2c40: 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70 72  x;       /* A pr
2c50: 65 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 6f  efix added to to
2c60: 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  ken names in the
2c70: 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e   .h file */.  in
2c80: 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20 20  t nconflict;    
2c90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ca0: 20 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e 66   of parsing conf
2cb0: 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20 74  licts */.  int t
2cc0: 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20 20  ablesize;       
2cd0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
2ce0: 68 65 20 70 61 72 73 65 20 74 61 62 6c 65 73 20  he parse tables 
2cf0: 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66 6c  */.  int basisfl
2d00: 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ag;           /*
2d10: 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73 69   Print only basi
2d20: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  s configurations
2d30: 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66 61   */.  int has_fa
2d40: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 2f  llback;        /
2d50: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 25 66  * True if any %f
2d60: 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e 20  allback is seen 
2d70: 69 6e 20 74 68 65 20 67 72 61 6d 6d 65 72 20 2a  in the grammer *
2d80: 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30 3b  /.  char *argv0;
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2da0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 67  Name of the prog
2db0: 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  ram */.};..#defi
2dc0: 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 58  ne MemoryCheck(X
2dd0: 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c 0a  ) if((X)==0){ \.
2de0: 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65    extern void me
2df0: 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a  mory_error(); \.
2e00: 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29    memory_error()
2e10: 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ; \.}../********
2e20: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
2e30: 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68 22  e file "table.h"
2e40: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  **/./*.** All co
2e70: 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
2e80: 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74  has been automat
2e90: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
2ea0: 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69  .** from a speci
2eb0: 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  fication in the 
2ec0: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
2ed0: 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a       "table.q".*
2ee0: 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69 61  * by the associa
2ef0: 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65 20  tive array code 
2f00: 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d  building program
2f10: 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20   "aagen"..** Do 
2f20: 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66 69  not edit this fi
2f30: 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64  le!  Instead, ed
2f40: 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63 61  it the specifica
2f50: 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  tion.** file, th
2f60: 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a  en rerun aagen..
2f70: 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
2f80: 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62  r processing tab
2f90: 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  les in the LEMON
2fa0: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
2fb0: 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 6f 75 74 69 6e  r..*/../* Routin
2fc0: 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20  es for handling 
2fd0: 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63 68  a strings */..ch
2fe0: 61 72 20 2a 53 74 72 73 61 66 65 28 29 3b 0a 0a  ar *Strsafe();..
2ff0: 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69  void Strsafe_ini
3000: 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69  t(/* void */);.i
3010: 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72  nt Strsafe_inser
3020: 74 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29 3b  t(/* char * */);
3030: 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66  .char *Strsafe_f
3040: 69 6e 64 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f  ind(/* char * */
3050: 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20  );../* Routines 
3060: 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73 79 6d  for handling sym
3070: 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d  bols of the gram
3080: 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20 73  mar */..struct s
3090: 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65  ymbol *Symbol_ne
30a0: 77 28 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 63  w();.int Symbolc
30b0: 6d 70 70 28 2f 2a 20 73 74 72 75 63 74 20 73 79  mpp(/* struct sy
30c0: 6d 62 6f 6c 20 2a 2a 2c 20 73 74 72 75 63 74 20  mbol **, struct 
30d0: 73 79 6d 62 6f 6c 20 2a 2a 20 2a 2f 29 3b 0a 76  symbol ** */);.v
30e0: 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28  oid Symbol_init(
30f0: 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74  /* void */);.int
3100: 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 2f   Symbol_insert(/
3110: 2a 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  * struct symbol 
3120: 2a 2c 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a 73  *, char * */);.s
3130: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
3140: 6d 62 6f 6c 5f 66 69 6e 64 28 2f 2a 20 63 68 61  mbol_find(/* cha
3150: 72 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  r * */);.struct 
3160: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e  symbol *Symbol_N
3170: 74 68 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a 69  th(/* int */);.i
3180: 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28  nt Symbol_count(
3190: 2f 2a 20 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  /*  */);.struct 
31a0: 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f  symbol **Symbol_
31b0: 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29 3b  arrayof(/*  */);
31c0: 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  ../* Routines to
31d0: 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61 74   manage the stat
31e0: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74 20  e table */..int 
31f0: 43 6f 6e 66 69 67 63 6d 70 28 2f 2a 20 73 74 72  Configcmp(/* str
3200: 75 63 74 20 63 6f 6e 66 69 67 20 2a 2c 20 73 74  uct config *, st
3210: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f  ruct config * */
3220: 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  );.struct state 
3230: 2a 53 74 61 74 65 5f 6e 65 77 28 29 3b 0a 76 6f  *State_new();.vo
3240: 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 2f 2a  id State_init(/*
3250: 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20 53   void */);.int S
3260: 74 61 74 65 5f 69 6e 73 65 72 74 28 2f 2a 20 73  tate_insert(/* s
3270: 74 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20 73  truct state *, s
3280: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a  truct config * *
3290: 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  /);.struct state
32a0: 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 2f 2a 20   *State_find(/* 
32b0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
32c0: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74  */);.struct stat
32d0: 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f  e **State_arrayo
32e0: 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52  f(/*  */);../* R
32f0: 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72  outines used for
3300: 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e 20 43   efficiency in C
3310: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20 2a 2f  onfiglist_add */
3320: 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62  ..void Configtab
3330: 6c 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20  le_init(/* void 
3340: 2a 2f 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67 74  */);.int Configt
3350: 61 62 6c 65 5f 69 6e 73 65 72 74 28 2f 2a 20 73  able_insert(/* s
3360: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a  truct config * *
3370: 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  /);.struct confi
3380: 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66  g *Configtable_f
3390: 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63 6f  ind(/* struct co
33a0: 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64  nfig * */);.void
33b0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65   Configtable_cle
33c0: 61 72 28 2f 2a 20 69 6e 74 28 2a 29 28 73 74 72  ar(/* int(*)(str
33d0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 2a 2f  uct config *) */
33e0: 29 3b 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );./************
33f0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
3400: 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22 20  file "action.c" 
3410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
3430: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
3440: 70 72 6f 63 65 73 73 69 6e 67 20 70 61 72 73 65  processing parse
3450: 72 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65  r actions in the
3460: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
3470: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
3480: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
3490: 61 72 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f 0a  arser action */.
34a0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
34b0: 63 74 69 6f 6e 5f 6e 65 77 28 29 7b 0a 20 20 73  ction_new(){.  s
34c0: 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74  tatic struct act
34d0: 69 6f 6e 20 2a 66 72 65 65 6c 69 73 74 20 3d 20  ion *freelist = 
34e0: 30 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  0;.  struct acti
34f0: 6f 6e 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28 20  on *new;..  if( 
3500: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
3510: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
3520: 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20  t amt = 100;.   
3530: 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72   freelist = (str
3540: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 61 6c  uct action *)mal
3550: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
3560: 63 74 20 61 63 74 69 6f 6e 29 2a 61 6d 74 20 29  ct action)*amt )
3570: 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69  ;.    if( freeli
3580: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
3590: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
35a0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
35b0: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
35c0: 65 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e  ew parser action
35d0: 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  .");.      exit(
35e0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
35f0: 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20  r(i=0; i<amt-1; 
3600: 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d  i++) freelist[i]
3610: 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73  .next = &freelis
3620: 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65  t[i+1];.    free
3630: 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74  list[amt-1].next
3640: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20   = 0;.  }.  new 
3650: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
3660: 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73  eelist = freelis
3670: 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72  t->next;.  retur
3680: 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  n new;.}../* Com
3690: 70 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e 73  pare two actions
36a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
36b0: 63 74 69 6f 6e 63 6d 70 28 61 70 31 2c 61 70 32  ctioncmp(ap1,ap2
36c0: 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ).struct action 
36d0: 2a 61 70 31 3b 0a 73 74 72 75 63 74 20 61 63 74  *ap1;.struct act
36e0: 69 6f 6e 20 2a 61 70 32 3b 0a 7b 0a 20 20 69 6e  ion *ap2;.{.  in
36f0: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 61 70 31  t rc;.  rc = ap1
3700: 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70  ->sp->index - ap
3710: 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  2->sp->index;.  
3720: 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
3730: 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70 65 20   (int)ap1->type 
3740: 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79 70 65  - (int)ap2->type
3750: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
3760: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 31  .    assert( ap1
3770: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 7c  ->type==REDUCE |
3780: 7c 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52 44 5f  | ap1->type==RD_
3790: 52 45 53 4f 4c 56 45 44 20 7c 7c 20 61 70 31 2d  RESOLVED || ap1-
37a0: 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43 54 29  >type==CONFLICT)
37b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
37c0: 32 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  2->type==REDUCE 
37d0: 7c 7c 20 61 70 32 2d 3e 74 79 70 65 3d 3d 52 44  || ap2->type==RD
37e0: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 20 61 70 32  _RESOLVED || ap2
37f0: 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43 54  ->type==CONFLICT
3800: 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 70 31 2d  );.    rc = ap1-
3810: 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61  >x.rp->index - a
3820: 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b  p2->x.rp->index;
3830: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3840: 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70 61 72  ;.}../* Sort par
3850: 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 73  ser actions */.s
3860: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63  truct action *Ac
3870: 74 69 6f 6e 5f 73 6f 72 74 28 61 70 29 0a 73 74  tion_sort(ap).st
3880: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
3890: 0a 7b 0a 20 20 61 70 20 3d 20 28 73 74 72 75 63  .{.  ap = (struc
38a0: 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f 72 74  t action *)msort
38b0: 28 61 70 2c 26 61 70 2d 3e 6e 65 78 74 2c 61 63  (ap,&ap->next,ac
38c0: 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72 65 74 75  tioncmp);.  retu
38d0: 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20 41  rn ap;.}..void A
38e0: 63 74 69 6f 6e 5f 61 64 64 28 61 70 70 2c 74 79  ction_add(app,ty
38f0: 70 65 2c 73 70 2c 61 72 67 29 0a 73 74 72 75 63  pe,sp,arg).struc
3900: 74 20 61 63 74 69 6f 6e 20 2a 2a 61 70 70 3b 0a  t action **app;.
3910: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79  enum e_action ty
3920: 70 65 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  pe;.struct symbo
3930: 6c 20 2a 73 70 3b 0a 63 68 61 72 20 2a 61 72 67  l *sp;.char *arg
3940: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 61 63 74  ;.{.  struct act
3950: 69 6f 6e 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20  ion *new;.  new 
3960: 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a  = Action_new();.
3970: 20 20 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 2a 61    new->next = *a
3980: 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77  pp;.  *app = new
3990: 3b 0a 20 20 6e 65 77 2d 3e 74 79 70 65 20 3d 20  ;.  new->type = 
39a0: 74 79 70 65 3b 0a 20 20 6e 65 77 2d 3e 73 70 20  type;.  new->sp 
39b0: 3d 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70 65  = sp;.  if( type
39c0: 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e  ==SHIFT ){.    n
39d0: 65 77 2d 3e 78 2e 73 74 70 20 3d 20 28 73 74 72  ew->x.stp = (str
39e0: 75 63 74 20 73 74 61 74 65 20 2a 29 61 72 67 3b  uct state *)arg;
39f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65  .  }else{.    ne
3a00: 77 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75 63  w->x.rp = (struc
3a10: 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20 20  t rule *)arg;.  
3a20: 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
3a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
3a40: 20 74 68 65 20 66 69 6c 65 20 22 61 73 73 65 72   the file "asser
3a50: 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.c" ***********
3a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a70: 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 6d 6f 72 65 20  */./*.** A more 
3a80: 65 66 66 69 63 69 65 6e 74 20 77 61 79 20 6f 66  efficient way of
3a90: 20 68 61 6e 64 6c 69 6e 67 20 61 73 73 65 72 74   handling assert
3aa0: 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 6d 79  ions..*/.void my
3ab0: 61 73 73 65 72 74 28 66 69 6c 65 2c 6c 69 6e 65  assert(file,line
3ac0: 29 0a 63 68 61 72 20 2a 66 69 6c 65 3b 0a 69 6e  ).char *file;.in
3ad0: 74 20 6c 69 6e 65 3b 0a 7b 0a 20 20 66 70 72 69  t line;.{.  fpri
3ae0: 6e 74 66 28 73 74 64 65 72 72 2c 22 41 73 73 65  ntf(stderr,"Asse
3af0: 72 74 69 6f 6e 20 66 61 69 6c 65 64 20 6f 6e 20  rtion failed on 
3b00: 6c 69 6e 65 20 25 64 20 6f 66 20 66 69 6c 65 20  line %d of file 
3b10: 5c 22 25 73 5c 22 5c 6e 22 2c 6c 69 6e 65 2c 66  \"%s\"\n",line,f
3b20: 69 6c 65 29 3b 0a 20 20 65 78 69 74 28 31 29 3b  ile);.  exit(1);
3b30: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
3b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
3b50: 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e  the file "build.
3b60: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
3b70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b80: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
3b90: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e   to construction
3ba0: 20 74 68 65 20 66 69 6e 69 74 65 20 73 74 61 74   the finite stat
3bb0: 65 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68  e machine for th
3bc0: 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65  e LEMON.** parse
3bd0: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
3be0: 0a 2f 2a 20 46 69 6e 64 20 61 20 70 72 65 63 65  ./* Find a prece
3bf0: 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20  dence symbol of 
3c00: 65 76 65 72 79 20 72 75 6c 65 20 69 6e 20 74 68  every rule in th
3c10: 65 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a  e grammar..** .*
3c20: 2a 20 54 68 6f 73 65 20 72 75 6c 65 73 20 77 68  * Those rules wh
3c30: 69 63 68 20 68 61 76 65 20 61 20 70 72 65 63 65  ich have a prece
3c40: 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64  dence symbol cod
3c50: 65 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 0a  ed in the input.
3c60: 2a 2a 20 67 72 61 6d 6d 61 72 20 75 73 69 6e 67  ** grammar using
3c70: 20 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20   the "[symbol]" 
3c80: 63 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c 20 61  construct will a
3c90: 6c 72 65 61 64 79 20 68 61 76 65 20 74 68 65 0a  lready have the.
3ca0: 2a 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 66  ** rp->precsym f
3cb0: 69 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74  ield filled.  Ot
3cc0: 68 65 72 20 72 75 6c 65 73 20 74 61 6b 65 20 61  her rules take a
3cd0: 73 20 74 68 65 69 72 20 70 72 65 63 65 64 65 6e  s their preceden
3ce0: 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65  ce.** symbol the
3cf0: 20 66 69 72 73 74 20 52 48 53 20 73 79 6d 62 6f   first RHS symbo
3d00: 6c 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  l with a defined
3d10: 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 49 66   precedence.  If
3d20: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
3d30: 74 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 69  t RHS symbols wi
3d40: 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65  th a defined pre
3d50: 63 65 64 65 6e 63 65 2c 20 74 68 65 20 70 72 65  cedence, the pre
3d60: 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f  cedence.** symbo
3d70: 6c 20 66 69 65 6c 64 20 69 73 20 6c 65 66 74 20  l field is left 
3d80: 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46  blank..*/.void F
3d90: 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63  indRulePrecedenc
3da0: 65 73 28 78 70 29 0a 73 74 72 75 63 74 20 6c 65  es(xp).struct le
3db0: 6d 6f 6e 20 2a 78 70 3b 0a 7b 0a 20 20 73 74 72  mon *xp;.{.  str
3dc0: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
3dd0: 66 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65 3b  for(rp=xp->rule;
3de0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
3df0: 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70  ){.    if( rp->p
3e00: 72 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20 20  recsym==0 ){.   
3e10: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
3e20: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
3e30: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
3e40: 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69     if( rp->rhs[i
3e50: 5d 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20  ]->prec>=0 ){.  
3e60: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
3e70: 73 79 6d 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  sym = rp->rhs[i]
3e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
3e90: 6b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20  k;..}.      }.  
3ea0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
3eb0: 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c  ;.}../* Find all
3ec0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68   nonterminals wh
3ed0: 69 63 68 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ich will generat
3ee0: 65 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69  e the empty stri
3ef0: 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62  ng..** Then go b
3f00: 61 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74 65 20  ack and compute 
3f10: 74 68 65 20 66 69 72 73 74 20 73 65 74 73 20 6f  the first sets o
3f20: 66 20 65 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69  f every nontermi
3f30: 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73  nal..** The firs
3f40: 74 20 73 65 74 20 69 73 20 74 68 65 20 73 65 74  t set is the set
3f50: 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c   of all terminal
3f60: 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63   symbols which c
3f70: 61 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74  an begin.** a st
3f80: 72 69 6e 67 20 67 65 6e 65 72 61 74 65 64 20 62  ring generated b
3f90: 79 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e  y that nontermin
3fa0: 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  al..*/.void Find
3fb0: 46 69 72 73 74 53 65 74 73 28 6c 65 6d 70 29 0a  FirstSets(lemp).
3fc0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
3fd0: 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
3fe0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
3ff0: 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73  ;.  int progress
4000: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
4010: 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
4020: 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73  ++){.    lemp->s
4030: 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64  ymbols[i]->lambd
4040: 61 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 20  a = FALSE;.  }. 
4050: 20 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65   for(i=lemp->nte
4060: 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e  rminal; i<lemp->
4070: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
4080: 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73     lemp->symbols
4090: 5b 69 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d 20  [i]->firstset = 
40a0: 53 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20  SetNew();.  }.. 
40b0: 20 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70 75 74   /* First comput
40c0: 65 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f  e all lambdas */
40d0: 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72  .  do{.    progr
40e0: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ess = 0;.    for
40f0: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
4100: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
4110: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  {.      if( rp->
4120: 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f  lhs->lambda ) co
4130: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
4140: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
4150: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
4160: 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d    if( rp->rhs[i]
4170: 2d 3e 6c 61 6d 62 64 61 3d 3d 46 41 4c 53 45 20  ->lambda==FALSE 
4180: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
4190: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70  .      if( i==rp
41a0: 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  ->nrhs ){.      
41b0: 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64    rp->lhs->lambd
41c0: 61 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  a = TRUE;.      
41d0: 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a    progress = 1;.
41e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
41f0: 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73  }while( progress
4200: 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f   );..  /* Now co
4210: 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74 20  mpute all first 
4220: 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  sets */.  do{.  
4230: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
4240: 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70 72  *s1, *s2;.    pr
4250: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
4260: 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
4270: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
4280: 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d 20  xt){.      s1 = 
4290: 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 66  rp->lhs;.      f
42a0: 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
42b0: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
42c0: 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b 69    s2 = rp->rhs[i
42d0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ];.        if( s
42e0: 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  2->type==TERMINA
42f0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  L ){.          p
4300: 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64  rogress += SetAd
4310: 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73  d(s1->firstset,s
4320: 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  2->index);.     
4330: 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65 6c       break;..}el
4340: 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29 7b  se if( s1==s2 ){
4350: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
4360: 31 2d 3e 6c 61 6d 62 64 61 3d 3d 46 41 4c 53 45  1->lambda==FALSE
4370: 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65   ) break;..}else
4380: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67  {.          prog
4390: 72 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e  ress += SetUnion
43a0: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
43b0: 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20  ->firstset);.   
43c0: 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 6c         if( s2->l
43d0: 61 6d 62 64 61 3d 3d 46 41 4c 53 45 20 29 20 62  ambda==FALSE ) b
43e0: 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d  reak;..}.      }
43f0: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
4400: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72   progress );.  r
4410: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  eturn;.}../* Com
4420: 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73  pute all LR(0) s
4430: 74 61 74 65 73 20 66 6f 72 20 74 68 65 20 67 72  tates for the gr
4440: 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a  ammar.  Links.**
4450: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 62 65   are added to be
4460: 74 77 65 65 6e 20 73 6f 6d 65 20 73 74 61 74 65  tween some state
4470: 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 4c 52  s so that the LR
4480: 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74 73 0a  (1) follow sets.
4490: 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74  ** can be comput
44a0: 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52 49  ed later..*/.PRI
44b0: 56 41 54 45 20 73 74 72 75 63 74 20 73 74 61 74  VATE struct stat
44c0: 65 20 2a 67 65 74 73 74 61 74 65 28 2f 2a 20 73  e *getstate(/* s
44d0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f  truct lemon * */
44e0: 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20 72  );  /* forward r
44f0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64  eference */.void
4500: 20 46 69 6e 64 53 74 61 74 65 73 28 6c 65 6d 70   FindStates(lemp
4510: 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
4520: 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  lemp;.{.  struct
4530: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73   symbol *sp;.  s
4540: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
4550: 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e  .  Configlist_in
4560: 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  it();..  /* Find
4570: 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f   the start symbo
4580: 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d  l */.  if( lemp-
4590: 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70  >start ){.    sp
45a0: 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c   = Symbol_find(l
45b0: 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20  emp->start);.   
45c0: 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20   if( sp==0 ){.  
45d0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
45e0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22  p->filename,0,."
45f0: 54 68 65 20 73 70 65 63 69 66 69 65 64 20 73 74  The specified st
4600: 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c  art symbol \"%s\
4610: 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61 20  " is not \.in a 
4620: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20 74  nonterminal of t
4630: 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22 25  he grammar.  \"%
4640: 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73 65 64  s\" will be used
4650: 20 61 73 20 74 68 65 20 73 74 61 72 74 20 5c 0a   as the start \.
4660: 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e 22  symbol instead."
4670: 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65 6d  ,lemp->start,lem
4680: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61  p->rule->lhs->na
4690: 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  me);.      lemp-
46a0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
46b0: 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75     sp = lemp->ru
46c0: 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a 20  le->lhs;.    }. 
46d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d   }else{.    sp =
46e0: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
46f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
4700: 20 73 75 72 65 20 74 68 65 20 73 74 61 72 74 20   sure the start 
4710: 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f  symbol doesn't o
4720: 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69 67 68  ccur on the righ
4730: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 0a 20  t-hand side of. 
4740: 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20 52   ** any rule.  R
4750: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69  eport an error i
4760: 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59 41 43  f it does.  (YAC
4770: 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61 74 65  C would generate
4780: 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72   a new.  ** star
4790: 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73  t symbol in this
47a0: 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72   case.) */.  for
47b0: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
47c0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
47d0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
47e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
47f0: 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
4800: 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d    if( rp->rhs[i]
4810: 3d 3d 73 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ==sp ){.        
4820: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
4830: 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20  ilename,0,."The 
4840: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25  start symbol \"%
4850: 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  s\" occurs on th
4860: 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e 64 20 73  e \.right-hand s
4870: 69 64 65 20 6f 66 20 61 20 72 75 6c 65 2e 20 54  ide of a rule. T
4880: 68 69 73 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  his will result 
4890: 69 6e 20 61 20 70 61 72 73 65 72 20 77 68 69 63  in a parser whic
48a0: 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20 77 6f 72  h \.does not wor
48b0: 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c 73 70 2d  k properly.",sp-
48c0: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
48d0: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
48e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
48f0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 62 61    }..  /* The ba
4900: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
4910: 6e 20 73 65 74 20 66 6f 72 20 74 68 65 20 66 69  n set for the fi
4920: 72 73 74 20 73 74 61 74 65 0a 20 20 2a 2a 20 69  rst state.  ** i
4930: 73 20 61 6c 6c 20 72 75 6c 65 73 20 77 68 69 63  s all rules whic
4940: 68 20 68 61 76 65 20 74 68 65 20 73 74 61 72 74  h have the start
4950: 20 73 79 6d 62 6f 6c 20 61 73 20 74 68 65 69 72   symbol as their
4960: 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 20  .  ** left-hand 
4970: 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70  side */.  for(rp
4980: 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  =sp->rule; rp; r
4990: 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a  p=rp->nextlhs){.
49a0: 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69      struct confi
49b0: 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20 20 20 6e  g *newcfp;.    n
49c0: 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69  ewcfp = Configli
49d0: 73 74 5f 61 64 64 62 61 73 69 73 28 72 70 2c 30  st_addbasis(rp,0
49e0: 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28 6e 65  );.    SetAdd(ne
49f0: 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20  wcfp->fws,0);.  
4a00: 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
4a10: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 2e  the first state.
4a20: 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 61 74    All other stat
4a30: 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20  es will be.  ** 
4a40: 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d 61 74  computed automat
4a50: 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20 74 68  ically during th
4a60: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66  e computation of
4a70: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a   the first one..
4a80: 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65    ** The returne
4a90: 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
4aa0: 20 66 69 72 73 74 20 73 74 61 74 65 20 69 73 20   first state is 
4ab0: 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28  not used. */.  (
4ac0: 76 6f 69 64 29 67 65 74 73 74 61 74 65 28 6c 65  void)getstate(le
4ad0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  mp);.  return;.}
4ae0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
4af0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65  inter to a state
4b00: 20 77 68 69 63 68 20 69 73 20 64 65 73 63 72 69   which is descri
4b10: 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e 66 69  bed by the confi
4b20: 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74  guration.** list
4b30: 20 77 68 69 63 68 20 68 61 73 20 62 65 65 6e 20   which has been 
4b40: 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73  built from calls
4b50: 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61   to Configlist_a
4b60: 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  dd..*/.PRIVATE v
4b70: 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73 28  oid buildshifts(
4b80: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
4b90: 2a 2c 20 73 74 72 75 63 74 20 73 74 61 74 65 20  *, struct state 
4ba0: 2a 20 2a 2f 29 3b 20 2f 2a 20 46 6f 72 77 64 20  * */); /* Forwd 
4bb0: 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45 20 73  ref */.PRIVATE s
4bc0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 67 65 74  truct state *get
4bd0: 73 74 61 74 65 28 6c 65 6d 70 29 0a 73 74 72 75  state(lemp).stru
4be0: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
4bf0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
4c00: 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20 73  g *cfp, *bp;.  s
4c10: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
4c20: 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20  ;..  /* Extract 
4c30: 74 68 65 20 73 6f 72 74 65 64 20 62 61 73 69 73  the sorted basis
4c40: 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74 61 74   of the new stat
4c50: 65 2e 20 20 54 68 65 20 62 61 73 69 73 20 77 61  e.  The basis wa
4c60: 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20  s constructed.  
4c70: 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61 6c 6c  ** by prior call
4c80: 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73 74  s to "Configlist
4c90: 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20 2a 2f  _addbasis()". */
4ca0: 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f  .  Configlist_so
4cb0: 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62 70 20  rtbasis();.  bp 
4cc0: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73  = Configlist_bas
4cd0: 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  is();..  /* Get 
4ce0: 61 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65  a state with the
4cf0: 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a 20   same basis */. 
4d00: 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66 69 6e   stp = State_fin
4d10: 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73 74 70  d(bp);.  if( stp
4d20: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74 61   ){.    /* A sta
4d30: 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  te with the same
4d40: 20 62 61 73 69 73 20 61 6c 72 65 61 64 79 20 65   basis already e
4d50: 78 69 73 74 73 21 20 20 43 6f 70 79 20 61 6c 6c  xists!  Copy all
4d60: 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a   the follow-set.
4d70: 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 69      ** propagati
4d80: 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74 68  on links from th
4d90: 65 20 73 74 61 74 65 20 75 6e 64 65 72 20 63 6f  e state under co
4da0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f 20  nstruction into 
4db0: 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65 65 78  the.    ** preex
4dc0: 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20 74 68  isting state, th
4dd0: 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  en return a poin
4de0: 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 65 78  ter to the preex
4df0: 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a 2f 0a  isting state */.
4e00: 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69      struct confi
4e10: 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66 6f  g *x, *y;.    fo
4e20: 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e 62  r(x=bp, y=stp->b
4e30: 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78 2d 3e  p; x && y; x=x->
4e40: 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20 20  bp, y=y->bp){.  
4e50: 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 26      Plink_copy(&
4e60: 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70 29  y->bplp,x->bplp)
4e70: 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64 65  ;.      Plink_de
4e80: 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a 20  lete(x->fplp);. 
4e90: 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20 78       x->fplp = x
4ea0: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
4eb0: 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66  }.    cfp = Conf
4ec0: 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b  iglist_return();
4ed0: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
4ee0: 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c 73  eat(cfp);.  }els
4ef0: 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72  e{.    /* This r
4f00: 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77 20 73  eally is a new s
4f10: 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75 63 74  tate.  Construct
4f20: 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69 6c 73   all the details
4f30: 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69   */.    Configli
4f40: 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29  st_closure(lemp)
4f50: 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;    /* Compute 
4f60: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
4f70: 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20  n closure */.   
4f80: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
4f90: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ();           /*
4fa0: 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67   Sort the config
4fb0: 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20  uration closure 
4fc0: 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e  */.    cfp = Con
4fd0: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
4fe0: 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69  ;   /* Get a poi
4ff0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6e 66  nter to the conf
5000: 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73  ig list */.    s
5010: 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77 28 29  tp = State_new()
5020: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
5030: 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63   new state struc
5040: 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f  ture */.    Memo
5050: 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a 20 20  ryCheck(stp);.  
5060: 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b 20    stp->bp = bp; 
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5080: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
5090: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 61 73  onfiguration bas
50a0: 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 63  is */.    stp->c
50b0: 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20 20 20  fp = cfp;       
50c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62         /* Rememb
50d0: 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  er the configura
50e0: 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a  tion closure */.
50f0: 20 20 20 20 73 74 70 2d 3e 69 6e 64 65 78 20 3d      stp->index =
5100: 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b   lemp->nstate++;
5110: 20 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65 20   /* Every state 
5120: 67 65 74 73 20 61 20 73 65 71 75 65 6e 63 65 20  gets a sequence 
5130: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74  number */.    st
5140: 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20  p->ap = 0;      
5150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
5160: 20 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a   actions, yet. *
5170: 2f 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65  /.    State_inse
5180: 72 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b  rt(stp,stp->bp);
5190: 20 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65     /* Add to the
51a0: 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a   state table */.
51b0: 20 20 20 20 62 75 69 6c 64 73 68 69 66 74 73 28      buildshifts(
51c0: 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20  lemp,stp);      
51d0: 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20   /* Recursively 
51e0: 63 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f  compute successo
51f0: 72 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a  r states */.  }.
5200: 20 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a    return stp;.}.
5210: 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6c  ./* Construct al
5220: 6c 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74  l successor stat
5230: 65 73 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  es to the given 
5240: 73 74 61 74 65 2e 20 20 41 20 22 73 75 63 63 65  state.  A "succe
5250: 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20 69  ssor".** state i
5260: 73 20 61 6e 79 20 73 74 61 74 65 20 77 68 69 63  s any state whic
5270: 68 20 63 61 6e 20 62 65 20 72 65 61 63 68 65 64  h can be reached
5280: 20 62 79 20 61 20 73 68 69 66 74 20 61 63 74 69   by a shift acti
5290: 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  on..*/.PRIVATE v
52a0: 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74 73 28  oid buildshifts(
52b0: 6c 65 6d 70 2c 73 74 70 29 0a 73 74 72 75 63 74  lemp,stp).struct
52c0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74   lemon *lemp;.st
52d0: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
52e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74       /* The stat
52f0: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 73 75 63  e from which suc
5300: 63 65 73 73 6f 72 73 20 61 72 65 20 63 6f 6d 70  cessors are comp
5310: 75 74 65 64 20 2a 2f 0a 7b 0a 20 20 73 74 72 75  uted */.{.  stru
5320: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20  ct config *cfp; 
5330: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
5340: 74 68 72 75 20 74 68 65 20 63 6f 6e 66 69 67 20  thru the config 
5350: 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22  closure of "stp"
5360: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
5370: 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46 6f  fig *bcfp; /* Fo
5380: 72 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  r the inner loop
5390: 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75   on config closu
53a0: 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20  re of "stp" */. 
53b0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
53c0: 6e 65 77 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74  new;  /* */.  st
53d0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
53e0: 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c     /* Symbol fol
53f0: 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69  lowing the dot i
5400: 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  n configuration 
5410: 22 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "cfp" */.  struc
5420: 74 20 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20  t symbol *bsp;  
5430: 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77  /* Symbol follow
5440: 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63  ing the dot in c
5450: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 62 63  onfiguration "bc
5460: 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  fp" */.  struct 
5470: 73 74 61 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f  state *newstp; /
5480: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
5490: 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65   successor state
54a0: 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63   */..  /* Each c
54b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 65 63  onfiguration bec
54c0: 6f 6d 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 66  omes complete af
54d0: 74 65 72 20 69 74 20 63 6f 6e 74 69 62 75 74 65  ter it contibute
54e0: 73 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72  s to a successor
54f0: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e  .  ** state.  In
5500: 69 74 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e  itially, all con
5510: 66 69 67 75 72 61 74 69 6f 6e 73 20 61 72 65 20  figurations are 
5520: 69 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  incomplete */.  
5530: 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70  for(cfp=stp->cfp
5540: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
5550: 6e 65 78 74 29 20 63 66 70 2d 3e 73 74 61 74 75  next) cfp->statu
5560: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
5570: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
5580: 67 68 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61  gh all configura
5590: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 74 61  tions of the sta
55a0: 74 65 20 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f  te "stp" */.  fo
55b0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
55c0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
55d0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 63 66 70  xt){.    if( cfp
55e0: 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45  ->status==COMPLE
55f0: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  TE ) continue;  
5600: 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65    /* Already use
5610: 64 20 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20  d by inner loop 
5620: 2a 2f 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e  */.    if( cfp->
5630: 64 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72  dot>=cfp->rp->nr
5640: 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  hs ) continue;  
5650: 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20 74  /* Can't shift t
5660: 68 69 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20  his config */.  
5670: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73    Configlist_res
5680: 65 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  et();           
5690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
56a0: 73 65 74 20 74 68 65 20 6e 65 77 20 63 6f 6e 66  set the new conf
56b0: 69 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 73 70  ig set */.    sp
56c0: 20 3d 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b   = cfp->rp->rhs[
56d0: 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20  cfp->dot];      
56e0: 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c         /* Symbol
56f0: 20 61 66 74 65 72 20 74 68 65 20 64 6f 74 20 2a   after the dot *
5700: 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65 76  /..    /* For ev
5710: 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ery configuratio
5720: 6e 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 22  n in the state "
5730: 73 74 70 22 20 77 68 69 63 68 20 68 61 73 20 74  stp" which has t
5740: 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20  he symbol "sp". 
5750: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
5760: 69 74 73 20 64 6f 74 2c 20 61 64 64 20 74 68 65  its dot, add the
5770: 20 73 61 6d 65 20 63 6f 6e 66 69 67 75 72 61 74   same configurat
5780: 69 6f 6e 20 74 6f 20 74 68 65 20 62 61 73 69 73  ion to the basis
5790: 20 73 65 74 20 75 6e 64 65 72 0a 20 20 20 20 2a   set under.    *
57a0: 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62  * construction b
57b0: 75 74 20 77 69 74 68 20 74 68 65 20 64 6f 74 20  ut with the dot 
57c0: 73 68 69 66 74 65 64 20 6f 6e 65 20 73 79 6d 62  shifted one symb
57d0: 6f 6c 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e  ol to the right.
57e0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 62 63 66 70   */.    for(bcfp
57f0: 3d 63 66 70 3b 20 62 63 66 70 3b 20 62 63 66 70  =cfp; bcfp; bcfp
5800: 3d 62 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  =bcfp->next){.  
5810: 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 73 74      if( bcfp->st
5820: 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29  atus==COMPLETE )
5830: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a   continue;    /*
5840: 20 41 6c 72 65 61 64 79 20 75 73 65 64 20 2a 2f   Already used */
5850: 0a 20 20 20 20 20 20 69 66 28 20 62 63 66 70 2d  .      if( bcfp-
5860: 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e  >dot>=bcfp->rp->
5870: 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b  nrhs ) continue;
5880: 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20   /* Can't shift 
5890: 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20  this one */.    
58a0: 20 20 62 73 70 20 3d 20 62 63 66 70 2d 3e 72 70    bsp = bcfp->rp
58b0: 2d 3e 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d  ->rhs[bcfp->dot]
58c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  ;           /* G
58d0: 65 74 20 73 79 6d 62 6f 6c 20 61 66 74 65 72 20  et symbol after 
58e0: 64 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dot */.      if(
58f0: 20 62 73 70 21 3d 73 70 20 29 20 63 6f 6e 74 69   bsp!=sp ) conti
5900: 6e 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  nue;            
5910: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
5920: 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 22 63  e same as for "c
5930: 66 70 22 20 2a 2f 0a 20 20 20 20 20 20 62 63 66  fp" */.      bcf
5940: 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50  p->status = COMP
5950: 4c 45 54 45 3b 20 20 20 20 20 20 20 20 20 20 20  LETE;           
5960: 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74         /* Mark t
5970: 68 69 73 20 63 6f 6e 66 69 67 20 61 73 20 75 73  his config as us
5980: 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77 20  ed */.      new 
5990: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
59a0: 62 61 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62  basis(bcfp->rp,b
59b0: 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20  cfp->dot+1);.   
59c0: 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65     Plink_add(&ne
59d0: 77 2d 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20  w->bplp,bcfp);. 
59e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
59f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5a00: 65 20 73 74 61 74 65 20 64 65 73 63 72 69 62 65  e state describe
5a10: 64 20 62 79 20 74 68 65 20 62 61 73 69 73 20 63  d by the basis c
5a20: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74  onfiguration set
5a30: 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63  .    ** construc
5a40: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 63 65  ted in the prece
5a50: 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  ding loop */.   
5a60: 20 6e 65 77 73 74 70 20 3d 20 67 65 74 73 74 61   newstp = getsta
5a70: 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f  te(lemp);..    /
5a80: 2a 20 54 68 65 20 73 74 61 74 65 20 22 6e 65 77  * The state "new
5a90: 73 74 70 22 20 69 73 20 72 65 61 63 68 65 64 20  stp" is reached 
5aa0: 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22  from the state "
5ab0: 73 74 70 22 20 62 79 20 61 20 73 68 69 66 74 20  stp" by a shift 
5ac0: 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e  action.    ** on
5ad0: 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22   the symbol "sp"
5ae0: 20 2a 2f 0a 20 20 20 20 41 63 74 69 6f 6e 5f 61   */.    Action_a
5af0: 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46  dd(&stp->ap,SHIF
5b00: 54 2c 73 70 2c 6e 65 77 73 74 70 29 3b 0a 20 20  T,sp,newstp);.  
5b10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  }.}../*.** Const
5b20: 72 75 63 74 20 74 68 65 20 70 72 6f 70 61 67 61  ruct the propaga
5b30: 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f  tion links.*/.vo
5b40: 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 6c 65 6d  id FindLinks(lem
5b50: 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
5b60: 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69  *lemp;.{.  int i
5b70: 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  ;.  struct confi
5b80: 67 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a  g *cfp, *other;.
5b90: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
5ba0: 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c  stp;.  struct pl
5bb0: 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20  ink *plp;..  /* 
5bc0: 48 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65 74  Housekeeping det
5bd0: 61 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f  ail:.  ** Add to
5be0: 20 65 76 65 72 79 20 70 72 6f 70 61 67 61 74 65   every propagate
5bf0: 20 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20   link a pointer 
5c00: 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74  back to the stat
5c10: 65 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20  e to.  ** which 
5c20: 74 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74 61  the link is atta
5c30: 63 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  ched. */.  for(i
5c40: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
5c50: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
5c60: 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
5c70: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70  [i];.    for(cfp
5c80: 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20  =stp->cfp; cfp; 
5c90: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
5ca0: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d        cfp->stp =
5cb0: 20 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   stp;.    }.  }.
5cc0: 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c  .  /* Convert al
5cd0: 6c 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f  l backlinks into
5ce0: 20 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20   forward links. 
5cf0: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61 72   Only the forwar
5d00: 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65  d.  ** links are
5d10: 20 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f 6c   used in the fol
5d20: 6c 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61 74  low-set computat
5d30: 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ion. */.  for(i=
5d40: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
5d50: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
5d60: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
5d70: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  i];.    for(cfp=
5d80: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
5d90: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
5da0: 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70       for(plp=cfp
5db0: 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70  ->bplp; plp; plp
5dc0: 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =plp->next){.   
5dd0: 20 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c 70       other = plp
5de0: 2d 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20 50  ->cfp;.        P
5df0: 6c 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d  link_add(&other-
5e00: 3e 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20  >fplp,cfp);.    
5e10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
5e20: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20  ./* Compute all 
5e30: 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a  followsets..**.*
5e40: 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73  * A followset is
5e50: 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20   the set of all 
5e60: 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61  symbols which ca
5e70: 6e 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65  n come immediate
5e80: 6c 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63 6f  ly.** after a co
5e90: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  nfiguration..*/.
5ea0: 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  void FindFollowS
5eb0: 65 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  ets(lemp).struct
5ec0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
5ed0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
5ee0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
5ef0: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70   struct plink *p
5f00: 6c 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65  lp;.  int progre
5f10: 73 73 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67 65  ss;.  int change
5f20: 3b 0a 0a 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 66 6f 72 28 63 66 70 3d  +){.    for(cfp=
5f50: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
5f60: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
5f70: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
5f80: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49   cfp->status = I
5f90: 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d  NCOMPLETE;.    }
5fa0: 0a 20 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20 20  .  }.  .  do{.  
5fb0: 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a    progress = 0;.
5fc0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
5fd0: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
5fe0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 63 66 70  ){.      for(cfp
5ff0: 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d  =lemp->sorted[i]
6000: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
6010: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
6020: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61      if( cfp->sta
6030: 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20  tus==COMPLETE ) 
6040: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6050: 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 66    for(plp=cfp->f
6060: 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c  plp; plp; plp=pl
6070: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
6080: 20 20 20 20 63 68 61 6e 67 65 20 3d 20 53 65 74      change = Set
6090: 55 6e 69 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e  Union(plp->cfp->
60a0: 66 77 73 2c 63 66 70 2d 3e 66 77 73 29 3b 0a 20  fws,cfp->fws);. 
60b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 68 61           if( cha
60c0: 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nge ){.         
60d0: 20 20 20 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 61     plp->cfp->sta
60e0: 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45  tus = INCOMPLETE
60f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
6100: 6f 67 72 65 73 73 20 3d 20 31 3b 0a 09 20 20 7d  ogress = 1;..  }
6110: 0a 09 7d 0a 20 20 20 20 20 20 20 20 63 66 70 2d  ..}.        cfp-
6120: 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45  >status = COMPLE
6130: 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  TE;.      }.    
6140: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67  }.  }while( prog
6150: 72 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61 74 69  ress );.}..stati
6160: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f  c int resolve_co
6170: 6e 66 6c 69 63 74 28 29 3b 0a 0a 2f 2a 20 43 6f  nflict();../* Co
6180: 6d 70 75 74 65 20 74 68 65 20 72 65 64 75 63 65  mpute the reduce
6190: 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72 65   actions, and re
61a0: 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 2e  solve conflicts.
61b0: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63 74  .*/.void FindAct
61c0: 69 6f 6e 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  ions(lemp).struc
61d0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
61e0: 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74  .  int i,j;.  st
61f0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
6200: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
6210: 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
6220: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74  symbol *sp;.  st
6230: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a  ruct rule *rp;..
6240: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20    /* Add all of 
6250: 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f  the reduce actio
6260: 6e 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75 63  ns .  ** A reduc
6270: 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65  e action is adde
6280: 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65  d for each eleme
6290: 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nt of the follow
62a0: 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f  set of.  ** a co
62b0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63  nfiguration whic
62c0: 68 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74  h has its dot at
62d0: 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
62e0: 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ht..  */.  for(i
62f0: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
6300: 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c  te; i++){   /* L
6310: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61  oop over all sta
6320: 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  tes */.    stp =
6330: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
6340: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
6350: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
6360: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a  =cfp->next){  /*
6370: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63   Loop over all c
6380: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
6390: 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e  .      if( cfp->
63a0: 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64  rp->nrhs==cfp->d
63b0: 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20  ot ){        /* 
63c0: 49 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d  Is dot at extrem
63d0: 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20  e right? */.    
63e0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
63f0: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
6400: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
6410: 69 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d  if( SetFind(cfp-
6420: 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20  >fws,j) ){.     
6430: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
6440: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f  reduce action to
6450: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
6460: 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75   which will redu
6470: 63 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20  ce by the.      
6480: 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63        ** rule "c
6490: 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c  fp->rp" if the l
64a0: 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20  ookahead symbol 
64b0: 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  is "lemp->symbol
64c0: 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20  s[j]" */.       
64d0: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
64e0: 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c  &stp->ap,REDUCE,
64f0: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
6500: 2c 63 66 70 2d 3e 72 70 29 3b 0a 20 20 20 20 20  ,cfp->rp);.     
6510: 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20       }..}.      
6520: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
6530: 2a 20 41 64 64 20 74 68 65 20 61 63 63 65 70 74  * Add the accept
6540: 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69  ing token */.  i
6550: 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29  f( lemp->start )
6560: 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f  {.    sp = Symbo
6570: 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61  l_find(lemp->sta
6580: 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d  rt);.    if( sp=
6590: 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  =0 ) sp = lemp->
65a0: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c  rule->lhs;.  }el
65b0: 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  se{.    sp = lem
65c0: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  p->rule->lhs;.  
65d0: 7d 0a 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68  }.  /* Add to th
65e0: 65 20 66 69 72 73 74 20 73 74 61 74 65 20 28 77  e first state (w
65f0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 74  hich is always t
6600: 68 65 20 73 74 61 72 74 69 6e 67 20 73 74 61 74  he starting stat
6610: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  e of the.  ** fi
6620: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
6630: 6e 65 29 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f  ne) an action to
6640: 20 41 43 43 45 50 54 20 69 66 20 74 68 65 20 6c   ACCEPT if the l
6650: 6f 6f 6b 61 68 65 61 64 20 69 73 20 74 68 65 0a  ookahead is the.
6660: 20 20 2a 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65    ** start nonte
6670: 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63  rminal.  */.  Ac
6680: 74 69 6f 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e  tion_add(&lemp->
6690: 73 6f 72 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43  sorted[0]->ap,AC
66a0: 43 45 50 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f  CEPT,sp,0);..  /
66b0: 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69  * Resolve confli
66c0: 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  cts */.  for(i=0
66d0: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
66e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
66f0: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a  ct action *ap, *
6700: 6e 61 70 3b 0a 20 20 20 20 73 74 72 75 63 74 20  nap;.    struct 
6710: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 20 20  state *stp;.    
6720: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
6730: 65 64 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ed[i];.    asser
6740: 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 0a 20 20  t( stp->ap );.  
6750: 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69    stp->ap = Acti
6760: 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29  on_sort(stp->ap)
6770: 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
6780: 2d 3e 61 70 3b 20 61 70 20 26 26 20 61 70 2d 3e  ->ap; ap && ap->
6790: 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  next; ap=ap->nex
67a0: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6e 61  t){.      for(na
67b0: 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e 61 70 20  p=ap->next; nap 
67c0: 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e  && nap->sp==ap->
67d0: 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78  sp; nap=nap->nex
67e0: 74 29 7b 0a 20 20 20 20 20 20 20 20 20 2f 2a 20  t){.         /* 
67f0: 54 68 65 20 74 77 6f 20 61 63 74 69 6f 6e 73 20  The two actions 
6800: 22 61 70 22 20 61 6e 64 20 22 6e 61 70 22 20 68  "ap" and "nap" h
6810: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f  ave the same loo
6820: 6b 61 68 65 61 64 2e 0a 20 20 20 20 20 20 20 20  kahead..        
6830: 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   ** Figure out w
6840: 68 69 63 68 20 6f 6e 65 20 73 68 6f 75 6c 64 20  hich one should 
6850: 62 65 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  be used */.     
6860: 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c      lemp->nconfl
6870: 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76 65 5f 63  ict += resolve_c
6880: 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61 70 2c 6c  onflict(ap,nap,l
6890: 65 6d 70 2d 3e 65 72 72 73 79 6d 29 3b 0a 20 20  emp->errsym);.  
68a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
68b0: 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20  .  /* Report an 
68c0: 65 72 72 6f 72 20 66 6f 72 20 65 61 63 68 20 72  error for each r
68d0: 75 6c 65 20 74 68 61 74 20 63 61 6e 20 6e 65 76  ule that can nev
68e0: 65 72 20 62 65 20 72 65 64 75 63 65 64 2e 20 2a  er be reduced. *
68f0: 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
6900: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
6910: 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63 61 6e 52  ->next) rp->canR
6920: 65 64 75 63 65 20 3d 20 46 41 4c 53 45 3b 0a 20  educe = FALSE;. 
6930: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
6940: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
6950: 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f      struct actio
6960: 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28 61  n *ap;.    for(a
6970: 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  p=lemp->sorted[i
6980: 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  ]->ap; ap; ap=ap
6990: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
69a0: 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
69b0: 55 43 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e  UCE ) ap->x.rp->
69c0: 63 61 6e 52 65 64 75 63 65 20 3d 20 54 52 55 45  canReduce = TRUE
69d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
69e0: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
69f0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
6a00: 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63  ){.    if( rp->c
6a10: 61 6e 52 65 64 75 63 65 20 29 20 63 6f 6e 74 69  anReduce ) conti
6a20: 6e 75 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73  nue;.    ErrorMs
6a30: 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
6a40: 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54  ,rp->ruleline,"T
6a50: 68 69 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74  his rule can not
6a60: 20 62 65 20 72 65 64 75 63 65 64 2e 5c 6e 22 29   be reduced.\n")
6a70: 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
6a80: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  rcnt++;.  }.}../
6a90: 2a 20 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66  * Resolve a conf
6aa0: 6c 69 63 74 20 62 65 74 77 65 65 6e 20 74 68 65  lict between the
6ab0: 20 74 77 6f 20 67 69 76 65 6e 20 61 63 74 69 6f   two given actio
6ac0: 6e 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63  ns.  If the.** c
6ad0: 6f 6e 66 6c 69 63 74 20 63 61 6e 27 74 20 62 65  onflict can't be
6ae0: 20 72 65 73 6f 6c 76 65 2c 20 72 65 74 75 72 6e   resolve, return
6af0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
6b00: 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a   NO LONGER TRUE:
6b10: 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65  .**   To resolve
6b20: 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72   a conflict, fir
6b30: 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  st look to see i
6b40: 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a  f either action.
6b50: 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72  **   is on an er
6b60: 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68  ror rule.  In th
6b70: 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68  at case, take th
6b80: 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a  e action which.*
6b90: 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63  *   is not assoc
6ba0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 65  iated with the e
6bb0: 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e  rror rule.  If n
6bc0: 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a  either or both.*
6bd0: 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20  *   actions are 
6be0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6bf0: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74  an error rule, t
6c00: 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20  hen try to.**   
6c10: 75 73 65 20 70 72 65 63 65 64 65 6e 63 65 20 74  use precedence t
6c20: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  o resolve the co
6c30: 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  nflict..**.** If
6c40: 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69   either action i
6c50: 73 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20  s a SHIFT, then 
6c60: 69 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20  it must be apx. 
6c70: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
6c80: 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20  n won't work if 
6c90: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apx->type==REDUC
6ca0: 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d  E and apy->type=
6cb0: 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69  =SHIFT..*/.stati
6cc0: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f  c int resolve_co
6cd0: 6e 66 6c 69 63 74 28 61 70 78 2c 61 70 79 2c 65  nflict(apx,apy,e
6ce0: 72 72 73 79 6d 29 0a 73 74 72 75 63 74 20 61 63  rrsym).struct ac
6cf0: 74 69 6f 6e 20 2a 61 70 78 3b 0a 73 74 72 75 63  tion *apx;.struc
6d00: 74 20 61 63 74 69 6f 6e 20 2a 61 70 79 3b 0a 73  t action *apy;.s
6d10: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72  truct symbol *er
6d20: 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65  rsym;   /* The e
6d30: 72 72 6f 72 20 73 79 6d 62 6f 6c 20 28 69 66 20  rror symbol (if 
6d40: 64 65 66 69 6e 65 64 2e 20 20 4e 55 4c 4c 20 6f  defined.  NULL o
6d50: 74 68 65 72 77 69 73 65 29 20 2a 2f 0a 7b 0a 20  therwise) */.{. 
6d60: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
6d70: 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e 74  spx, *spy;.  int
6d80: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61   errcnt = 0;.  a
6d90: 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d 3d  ssert( apx->sp==
6da0: 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20 4f  apy->sp );  /* O
6db0: 74 68 65 72 77 69 73 65 20 74 68 65 72 65 20 77  therwise there w
6dc0: 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66 6c  ould be no confl
6dd0: 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70 78  ict */.  if( apx
6de0: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26  ->type==SHIFT &&
6df0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apy->type==REDU
6e00: 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d 20  CE ){.    spx = 
6e10: 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20 73 70 79  apx->sp;.    spy
6e20: 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72   = apy->x.rp->pr
6e30: 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73  ecsym;.    if( s
6e40: 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72  py==0 || spx->pr
6e50: 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e 70 72 65  ec<0 || spy->pre
6e60: 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  c<0 ){.      /* 
6e70: 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72 65 63 65  Not enough prece
6e80: 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  dence informatio
6e90: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d  n. */.      apy-
6ea0: 3e 74 79 70 65 20 3d 20 43 4f 4e 46 4c 49 43 54  >type = CONFLICT
6eb0: 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b  ;.      errcnt++
6ec0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6ed0: 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70  spx->prec>spy->p
6ee0: 72 65 63 20 29 7b 20 20 20 20 2f 2a 20 4c 6f 77  rec ){    /* Low
6ef0: 65 72 20 70 72 65 63 65 64 65 6e 63 65 20 77 69  er precedence wi
6f00: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d  ns */.      apy-
6f10: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
6f20: 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  VED;.    }else i
6f30: 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79  f( spx->prec<spy
6f40: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
6f50: 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52  apx->type = SH_R
6f60: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
6f70: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
6f80: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
6f90: 70 78 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54  px->assoc==RIGHT
6fa0: 20 29 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61   ){ /* Use opera
6fb0: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  tor */.      apy
6fc0: 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f  ->type = RD_RESO
6fd0: 4c 56 45 44 3b 20 20 20 20 20 20 20 20 20 20 20  LVED;           
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ff0: 20 20 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69    /* associativi
7000: 74 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  ty */.    }else 
7010: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73  if( spx->prec==s
7020: 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d  py->prec && spx-
7030: 3e 61 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20  >assoc==LEFT ){ 
7040: 20 2f 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65   /* to break tie
7050: 20 2a 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   */.      apx->t
7060: 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45  ype = SH_RESOLVE
7070: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
7080: 20 20 20 20 61 73 73 65 72 74 28 20 73 70 78 2d      assert( spx-
7090: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
70a0: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
70b0: 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70  NONE );.      ap
70c0: 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46 4c 49  y->type = CONFLI
70d0: 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74  CT;.      errcnt
70e0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
70f0: 65 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d  e if( apx->type=
7100: 3d 52 45 44 55 43 45 20 26 26 20 61 70 79 2d 3e  =REDUCE && apy->
7110: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a  type==REDUCE ){.
7120: 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 78      spx = apx->x
7130: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
7140: 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72    spy = apy->x.r
7150: 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20  p->precsym;.    
7160: 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70  if( spx==0 || sp
7170: 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65  y==0 || spx->pre
7180: 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e  c<0 ||.    spy->
7190: 70 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70  prec<0 || spx->p
71a0: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29  rec==spy->prec )
71b0: 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  {.      apy->typ
71c0: 65 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20  e = CONFLICT;.  
71d0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
71e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
71f0: 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20  >prec>spy->prec 
7200: 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ){.      apy->ty
7210: 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44  pe = RD_RESOLVED
7220: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
7230: 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70  spx->prec<spy->p
7240: 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78  rec ){.      apx
7250: 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f  ->type = RD_RESO
7260: 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LVED;.    }.  }e
7270: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7280: 20 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70   .      apx->typ
7290: 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c  e==SH_RESOLVED |
72a0: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
72b0: 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c  e==RD_RESOLVED |
72c0: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
72d0: 65 3d 3d 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  e==CONFLICT ||. 
72e0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
72f0: 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20  SH_RESOLVED ||. 
7300: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
7310: 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20  RD_RESOLVED ||. 
7320: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
7330: 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29 3b 0a  CONFLICT.    );.
7340: 20 20 20 20 2f 2a 20 54 68 65 20 52 45 44 55 43      /* The REDUC
7350: 45 2f 53 48 49 46 54 20 63 61 73 65 20 63 61 6e  E/SHIFT case can
7360: 6e 6f 74 20 68 61 70 70 65 6e 20 62 65 63 61 75  not happen becau
7370: 73 65 20 53 48 49 46 54 73 20 63 6f 6d 65 20 62  se SHIFTs come b
7380: 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52 45 44  efore.    ** RED
7390: 55 43 45 73 20 6f 6e 20 74 68 65 20 6c 69 73 74  UCEs on the list
73a0: 2e 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  .  If we reach t
73b0: 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73  his point it mus
73c0: 74 20 62 65 20 62 65 63 61 75 73 65 0a 20 20 20  t be because.   
73d0: 20 2a 2a 20 74 68 65 20 70 61 72 73 65 72 20 63   ** the parser c
73e0: 6f 6e 66 6c 69 63 74 20 68 61 64 20 61 6c 72 65  onflict had alre
73f0: 61 64 79 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  ady been resolve
7400: 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  d. */.  }.  retu
7410: 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a  rn errcnt;.}./**
7420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7430: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
7440: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63 22  e "configlist.c"
7450: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
7460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
7470: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 70 72  * Routines to pr
7480: 6f 63 65 73 73 69 6e 67 20 61 20 63 6f 6e 66 69  ocessing a confi
7490: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
74a0: 64 20 62 75 69 6c 64 69 6e 67 20 61 20 73 74 61  d building a sta
74b0: 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d  te.** in the LEM
74c0: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
74d0: 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  tor..*/..static 
74e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 66  struct config *f
74f0: 72 65 65 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  reelist = 0;    
7500: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
7510: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  e configurations
7520: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
7530: 74 20 63 6f 6e 66 69 67 20 2a 63 75 72 72 65 6e  t config *curren
7540: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
7550: 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 63  Top of list of c
7560: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
7570: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
7580: 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e 74 65  onfig **currente
7590: 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61 73  nd = 0;   /* Las
75a0: 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f 6e  t on list of con
75b0: 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  figs */.static s
75c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 61  truct config *ba
75d0: 73 69 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sis = 0;        
75e0: 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20   /* Top of list 
75f0: 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73  of basis configs
7600: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
7610: 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69 73  t config **basis
7620: 65 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  end = 0;     /* 
7630: 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66 20 62  End of list of b
7640: 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  asis configs */.
7650: 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
7660: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 6f  nter to a new co
7670: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50  nfiguration */.P
7680: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 63 6f  RIVATE struct co
7690: 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67 28  nfig *newconfig(
76a0: 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  ){.  struct conf
76b0: 69 67 20 2a 6e 65 77 3b 0a 20 20 69 66 28 20 66  ig *new;.  if( f
76c0: 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
76d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
76e0: 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20 66 72   amt = 3;.    fr
76f0: 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74  eelist = (struct
7700: 20 63 6f 6e 66 69 67 20 2a 29 6d 61 6c 6c 6f 63   config *)malloc
7710: 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
7720: 63 6f 6e 66 69 67 29 2a 61 6d 74 20 29 3b 0a 20  config)*amt );. 
7730: 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d     if( freelist=
7740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
7750: 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62  ntf(stderr,"Unab
7760: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
7770: 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
7780: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22 29  configuration.")
7790: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
77a0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
77b0: 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
77c0: 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  ) freelist[i].ne
77d0: 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69  xt = &freelist[i
77e0: 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  +1];.    freelis
77f0: 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
7800: 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 66  0;.  }.  new = f
7810: 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c  reelist;.  freel
7820: 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e  ist = freelist->
7830: 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  next;.  return n
7840: 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f  ew;.}../* The co
7850: 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 6f 6c 64  nfiguration "old
7860: 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  " is no longer u
7870: 73 65 64 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  sed */.PRIVATE v
7880: 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e 66 69 67  oid deleteconfig
7890: 28 6f 6c 64 29 0a 73 74 72 75 63 74 20 63 6f 6e  (old).struct con
78a0: 66 69 67 20 2a 6f 6c 64 3b 0a 7b 0a 20 20 6f 6c  fig *old;.{.  ol
78b0: 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c 69  d->next = freeli
78c0: 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d  st;.  freelist =
78d0: 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74   old;.}../* Init
78e0: 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66  ialized the conf
78f0: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62  iguration list b
7900: 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43  uilder */.void C
7910: 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29  onfiglist_init()
7920: 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  {.  current = 0;
7930: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
7940: 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69  &current;.  basi
7950: 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e  s = 0;.  basisen
7960: 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f  d = &basis;.  Co
7970: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29  nfigtable_init()
7980: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
7990: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68  * Initialized th
79a0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
79b0: 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a  list builder */.
79c0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
79d0: 72 65 73 65 74 28 29 7b 0a 20 20 63 75 72 72 65  reset(){.  curre
79e0: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
79f0: 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b  tend = &current;
7a00: 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20  .  basis = 0;.  
7a10: 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69  basisend = &basi
7a20: 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65  s;.  Configtable
7a30: 5f 63 6c 65 61 72 28 30 29 3b 0a 20 20 72 65 74  _clear(0);.  ret
7a40: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  urn;.}../* Add a
7a50: 6e 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61  nother configura
7a60: 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66  tion to the conf
7a70: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a  iguration list *
7a80: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
7a90: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28  *Configlist_add(
7aa0: 72 70 2c 64 6f 74 29 0a 73 74 72 75 63 74 20 72  rp,dot).struct r
7ab0: 75 6c 65 20 2a 72 70 3b 20 20 20 20 2f 2a 20 54  ule *rp;    /* T
7ac0: 68 65 20 72 75 6c 65 20 2a 2f 0a 69 6e 74 20 64  he rule */.int d
7ad0: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ot;            /
7ae0: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
7af0: 20 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c 65   RHS of the rule
7b00: 20 77 68 65 72 65 20 74 68 65 20 64 6f 74 20 67   where the dot g
7b10: 6f 65 73 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63  oes */.{.  struc
7b20: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d  t config *cfp, m
7b30: 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  odel;..  assert(
7b40: 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29   currentend!=0 )
7b50: 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72  ;.  model.rp = r
7b60: 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d  p;.  model.dot =
7b70: 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f   dot;.  cfp = Co
7b80: 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26  nfigtable_find(&
7b90: 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66  model);.  if( cf
7ba0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20  p==0 ){.    cfp 
7bb0: 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20  = newconfig();. 
7bc0: 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b     cfp->rp = rp;
7bd0: 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20  .    cfp->dot = 
7be0: 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77  dot;.    cfp->fw
7bf0: 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20  s = SetNew();.  
7c00: 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a    cfp->stp = 0;.
7c10: 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20      cfp->fplp = 
7c20: 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20  cfp->bplp = 0;. 
7c30: 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30     cfp->next = 0
7c40: 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20  ;.    cfp->bp = 
7c50: 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65  0;.    *currente
7c60: 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75  nd = cfp;.    cu
7c70: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d  rrentend = &cfp-
7c80: 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f 6e 66 69  >next;.    Confi
7c90: 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66  gtable_insert(cf
7ca0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
7cb0: 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20   cfp;.}../* Add 
7cc0: 61 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  a basis configur
7cd0: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e  ation to the con
7ce0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
7cf0: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
7d00: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
7d10: 62 61 73 69 73 28 72 70 2c 64 6f 74 29 0a 73 74  basis(rp,dot).st
7d20: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 69  ruct rule *rp;.i
7d30: 6e 74 20 64 6f 74 3b 0a 7b 0a 20 20 73 74 72 75  nt dot;.{.  stru
7d40: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20  ct config *cfp, 
7d50: 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74  model;..  assert
7d60: 28 20 62 61 73 69 73 65 6e 64 21 3d 30 20 29 3b  ( basisend!=0 );
7d70: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65  .  assert( curre
7d80: 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f  ntend!=0 );.  mo
7d90: 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d  del.rp = rp;.  m
7da0: 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a  odel.dot = dot;.
7db0: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61    cfp = Configta
7dc0: 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29  ble_find(&model)
7dd0: 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29  ;.  if( cfp==0 )
7de0: 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63  {.    cfp = newc
7df0: 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70  onfig();.    cfp
7e00: 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63  ->rp = rp;.    c
7e10: 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  fp->dot = dot;. 
7e20: 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65     cfp->fws = Se
7e30: 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d  tNew();.    cfp-
7e40: 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  >stp = 0;.    cf
7e50: 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62  p->fplp = cfp->b
7e60: 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  plp = 0;.    cfp
7e70: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
7e80: 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20  cfp->bp = 0;.   
7e90: 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63   *currentend = c
7ea0: 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65  fp;.    currente
7eb0: 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b  nd = &cfp->next;
7ec0: 0a 20 20 20 20 2a 62 61 73 69 73 65 6e 64 20 3d  .    *basisend =
7ed0: 20 63 66 70 3b 0a 20 20 20 20 62 61 73 69 73 65   cfp;.    basise
7ee0: 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20  nd = &cfp->bp;. 
7ef0: 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69     Configtable_i
7f00: 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a  nsert(cfp);.  }.
7f10: 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a    return cfp;.}.
7f20: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
7f30: 63 6c 6f 73 75 72 65 20 6f 66 20 74 68 65 20 63  closure of the c
7f40: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
7f50: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
7f60: 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d  list_closure(lem
7f70: 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
7f80: 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63  *lemp;.{.  struc
7f90: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a  t config *cfp, *
7fa0: 6e 65 77 63 66 70 3b 0a 20 20 73 74 72 75 63 74  newcfp;.  struct
7fb0: 20 72 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72   rule *rp, *newr
7fc0: 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  p;.  struct symb
7fd0: 6f 6c 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20  ol *sp, *xsp;.  
7fe0: 69 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61  int i, dot;..  a
7ff0: 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e  ssert( currenten
8000: 64 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63 66  d!=0 );.  for(cf
8010: 70 3d 63 75 72 72 65 6e 74 3b 20 63 66 70 3b 20  p=current; cfp; 
8020: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
8030: 20 20 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70      rp = cfp->rp
8040: 3b 0a 20 20 20 20 64 6f 74 20 3d 20 63 66 70 2d  ;.    dot = cfp-
8050: 3e 64 6f 74 3b 0a 20 20 20 20 69 66 28 20 64 6f  >dot;.    if( do
8060: 74 3e 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f  t>=rp->nrhs ) co
8070: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d  ntinue;.    sp =
8080: 20 72 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20   rp->rhs[dot];. 
8090: 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
80a0: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  =NONTERMINAL ){.
80b0: 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 72 75        if( sp->ru
80c0: 6c 65 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d  le==0 && sp!=lem
80d0: 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20  p->errsym ){.   
80e0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
80f0: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
8100: 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e  >line,"Nontermin
8110: 61 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f  al \"%s\" has no
8120: 20 72 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20   rules.",.      
8130: 20 20 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20      sp->name);. 
8140: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
8150: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
8160: 0a 20 20 20 20 20 20 66 6f 72 28 6e 65 77 72 70  .      for(newrp
8170: 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70  =sp->rule; newrp
8180: 3b 20 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e  ; newrp=newrp->n
8190: 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 20 20 20  extlhs){.       
81a0: 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67   newcfp = Config
81b0: 6c 69 73 74 5f 61 64 64 28 6e 65 77 72 70 2c 30  list_add(newrp,0
81c0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
81d0: 3d 64 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72  =dot+1; i<rp->nr
81e0: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
81f0: 20 20 20 20 78 73 70 20 3d 20 72 70 2d 3e 72 68      xsp = rp->rh
8200: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
8210: 69 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54  if( xsp->type==T
8220: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
8230: 20 20 20 20 20 20 20 53 65 74 41 64 64 28 6e 65         SetAdd(ne
8240: 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69  wcfp->fws,xsp->i
8250: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ndex);.         
8260: 20 20 20 62 72 65 61 6b 3b 0a 09 20 20 7d 65 6c     break;..  }el
8270: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
8280: 53 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d  SetUnion(newcfp-
8290: 3e 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74 73  >fws,xsp->firsts
82a0: 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  et);.           
82b0: 20 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61   if( xsp->lambda
82c0: 3d 3d 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b  ==FALSE ) break;
82d0: 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20  ..  }..}.       
82e0: 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73   if( i==rp->nrhs
82f0: 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28 26 63 66   ) Plink_add(&cf
8300: 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66 70 29 3b  p->fplp,newcfp);
8310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8320: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
8330: 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66  /* Sort the conf
8340: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a  iguration list *
8350: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
8360: 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63 75 72 72  t_sort(){.  curr
8370: 65 6e 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f  ent = (struct co
8380: 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 63 75 72  nfig *)msort(cur
8390: 72 65 6e 74 2c 26 28 63 75 72 72 65 6e 74 2d 3e  rent,&(current->
83a0: 6e 65 78 74 29 2c 43 6f 6e 66 69 67 63 6d 70 29  next),Configcmp)
83b0: 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d  ;.  currentend =
83c0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
83d0: 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 62 61 73  ./* Sort the bas
83e0: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
83f0: 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f   list */.void Co
8400: 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73  nfiglist_sortbas
8410: 69 73 28 29 7b 0a 20 20 62 61 73 69 73 20 3d 20  is(){.  basis = 
8420: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
8430: 29 6d 73 6f 72 74 28 63 75 72 72 65 6e 74 2c 26  )msort(current,&
8440: 28 63 75 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f  (current->bp),Co
8450: 6e 66 69 67 63 6d 70 29 3b 0a 20 20 62 61 73 69  nfigcmp);.  basi
8460: 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  send = 0;.  retu
8470: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  rn;.}../* Return
8480: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
8490: 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f  e head of the co
84a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
84b0: 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68   and.** reset th
84c0: 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  e list */.struct
84d0: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
84e0: 69 73 74 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20  ist_return(){.  
84f0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f  struct config *o
8500: 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72  ld;.  old = curr
8510: 65 6e 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d  ent;.  current =
8520: 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64   0;.  currentend
8530: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f   = 0;.  return o
8540: 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  ld;.}../* Return
8550: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
8560: 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f  e head of the co
8570: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
8580: 20 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68   and.** reset th
8590: 65 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  e list */.struct
85a0: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
85b0: 69 73 74 5f 62 61 73 69 73 28 29 7b 0a 20 20 73  ist_basis(){.  s
85c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
85d0: 64 3b 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69 73  d;.  old = basis
85e0: 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20  ;.  basis = 0;. 
85f0: 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20   basisend = 0;. 
8600: 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a   return old;.}..
8610: 2f 2a 20 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d  /* Free all elem
8620: 65 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76 65  ents of the give
8630: 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  n configuration 
8640: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
8650: 66 69 67 6c 69 73 74 5f 65 61 74 28 63 66 70 29  figlist_eat(cfp)
8660: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
8670: 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  cfp;.{.  struct 
8680: 63 6f 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b  config *nextcfp;
8690: 0a 20 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66  .  for(; cfp; cf
86a0: 70 3d 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20  p=nextcfp){.    
86b0: 6e 65 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e  nextcfp = cfp->n
86c0: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
86d0: 20 63 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b   cfp->fplp==0 );
86e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70  .    assert( cfp
86f0: 2d 3e 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20  ->bplp==0 );.   
8700: 20 69 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20   if( cfp->fws ) 
8710: 53 65 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73  SetFree(cfp->fws
8720: 29 3b 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e  );.    deletecon
8730: 66 69 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20  fig(cfp);.  }.  
8740: 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  return;.}./*****
8750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
8760: 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f  m the file "erro
8770: 72 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  r.c" ***********
8780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8790: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  ******/./*.** Co
87a0: 64 65 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  de for printing 
87b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
87c0: 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 67 6f 6f  /../* Find a goo
87d0: 64 20 70 6c 61 63 65 20 74 6f 20 62 72 65 61 6b  d place to break
87e0: 20 22 6d 73 67 22 20 73 6f 20 74 68 61 74 20 69   "msg" so that i
87f0: 74 73 20 6c 65 6e 67 74 68 20 69 73 20 61 74 20  ts length is at 
8800: 6c 65 61 73 74 20 22 6d 69 6e 22 0a 2a 2a 20 62  least "min".** b
8810: 75 74 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  ut no more than 
8820: 22 6d 61 78 22 2e 20 20 4d 61 6b 65 20 74 68 65  "max".  Make the
8830: 20 70 6f 69 6e 74 20 61 73 20 63 6c 6f 73 65 20   point as close 
8840: 74 6f 20 6d 61 78 20 61 73 20 70 6f 73 73 69 62  to max as possib
8850: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
8860: 74 20 66 69 6e 64 62 72 65 61 6b 28 6d 73 67 2c  t findbreak(msg,
8870: 6d 69 6e 2c 6d 61 78 29 0a 63 68 61 72 20 2a 6d  min,max).char *m
8880: 73 67 3b 0a 69 6e 74 20 6d 69 6e 3b 0a 69 6e 74  sg;.int min;.int
8890: 20 6d 61 78 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c   max;.{.  int i,
88a0: 73 70 6f 74 3b 0a 20 20 63 68 61 72 20 63 3b 0a  spot;.  char c;.
88b0: 20 20 66 6f 72 28 69 3d 73 70 6f 74 3d 6d 69 6e    for(i=spot=min
88c0: 3b 20 69 3c 3d 6d 61 78 3b 20 69 2b 2b 29 7b 0a  ; i<=max; i++){.
88d0: 20 20 20 20 63 20 3d 20 6d 73 67 5b 69 5d 3b 0a      c = msg[i];.
88e0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 74 27 20      if( c=='\t' 
88f0: 29 20 6d 73 67 5b 69 5d 20 3d 20 27 20 27 3b 0a  ) msg[i] = ' ';.
8900: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
8910: 29 7b 20 6d 73 67 5b 69 5d 20 3d 20 27 20 27 3b  ){ msg[i] = ' ';
8920: 20 73 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b   spot = i; break
8930: 3b 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 30  ; }.    if( c==0
8940: 20 29 7b 20 73 70 6f 74 20 3d 20 69 3b 20 62 72   ){ spot = i; br
8950: 65 61 6b 3b 20 7d 0a 20 20 20 20 69 66 28 20 63  eak; }.    if( c
8960: 3d 3d 27 2d 27 20 26 26 20 69 3c 6d 61 78 2d 31  =='-' && i<max-1
8970: 20 29 20 73 70 6f 74 20 3d 20 69 2b 31 3b 0a 20   ) spot = i+1;. 
8980: 20 20 20 69 66 28 20 63 3d 3d 27 20 27 20 29 20     if( c==' ' ) 
8990: 73 70 6f 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  spot = i;.  }.  
89a0: 72 65 74 75 72 6e 20 73 70 6f 74 3b 0a 7d 0a 0a  return spot;.}..
89b0: 2f 2a 0a 2a 2a 20 54 68 65 20 65 72 72 6f 72 20  /*.** The error 
89c0: 6d 65 73 73 61 67 65 20 69 73 20 73 70 6c 69 74  message is split
89d0: 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65   across multiple
89e0: 20 6c 69 6e 65 73 20 69 66 20 6e 65 63 65 73 73   lines if necess
89f0: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 73 70 6c  ary.  The.** spl
8a00: 69 74 73 20 6f 63 63 75 72 20 61 74 20 61 20 73  its occur at a s
8a10: 70 61 63 65 2c 20 69 66 20 74 68 65 72 65 20 69  pace, if there i
8a20: 73 20 61 20 73 70 61 63 65 20 61 76 61 69 6c 61  s a space availa
8a30: 62 6c 65 20 6e 65 61 72 20 74 68 65 20 65 6e 64  ble near the end
8a40: 0a 2a 2a 20 6f 66 20 74 68 65 20 6c 69 6e 65 2e  .** of the line.
8a50: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 45 52 52 4d  .*/.#define ERRM
8a60: 53 47 53 49 5a 45 20 20 31 30 30 30 30 20 2f 2a  SGSIZE  10000 /*
8a70: 20 48 6f 70 65 20 74 68 69 73 20 69 73 20 62 69   Hope this is bi
8a80: 67 20 65 6e 6f 75 67 68 2e 20 20 4e 6f 20 77 61  g enough.  No wa
8a90: 79 20 74 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  y to error check
8aa0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45   */.#define LINE
8ab0: 57 49 44 54 48 20 20 20 20 20 20 37 39 20 2f 2a  WIDTH      79 /*
8ac0: 20 4d 61 78 20 77 69 64 74 68 20 6f 66 20 61 6e   Max width of an
8ad0: 79 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f  y output line */
8ae0: 0a 23 64 65 66 69 6e 65 20 50 52 45 46 49 58 4c  .#define PREFIXL
8af0: 49 4d 49 54 20 20 20 20 33 30 20 2f 2a 20 4d 61  IMIT    30 /* Ma
8b00: 78 20 77 69 64 74 68 20 6f 66 20 74 68 65 20 70  x width of the p
8b10: 72 65 66 69 78 20 6f 6e 20 65 61 63 68 20 6c 69  refix on each li
8b20: 6e 65 20 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72  ne */.void Error
8b30: 4d 73 67 28 76 61 5f 61 6c 69 73 74 29 0a 76 61  Msg(va_alist).va
8b40: 5f 64 63 6c 0a 7b 0a 20 20 63 68 61 72 20 2a 66  _dcl.{.  char *f
8b50: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6c  ilename;.  int l
8b60: 69 6e 65 6e 6f 3b 0a 20 20 63 68 61 72 20 2a 66  ineno;.  char *f
8b70: 6f 72 6d 61 74 3b 0a 20 20 63 68 61 72 20 65 72  ormat;.  char er
8b80: 72 6d 73 67 5b 45 52 52 4d 53 47 53 49 5a 45 5d  rmsg[ERRMSGSIZE]
8b90: 3b 0a 20 20 63 68 61 72 20 70 72 65 66 69 78 5b  ;.  char prefix[
8ba0: 50 52 45 46 49 58 4c 49 4d 49 54 2b 31 30 5d 3b  PREFIXLIMIT+10];
8bb0: 0a 20 20 69 6e 74 20 65 72 72 6d 73 67 73 69 7a  .  int errmsgsiz
8bc0: 65 3b 0a 20 20 69 6e 74 20 70 72 65 66 69 78 73  e;.  int prefixs
8bd0: 69 7a 65 3b 0a 20 20 69 6e 74 20 61 76 61 69 6c  ize;.  int avail
8be0: 61 62 6c 65 77 69 64 74 68 3b 0a 20 20 76 61 5f  ablewidth;.  va_
8bf0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 65  list ap;.  int e
8c00: 6e 64 2c 20 72 65 73 74 61 72 74 2c 20 62 61 73  nd, restart, bas
8c10: 65 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  e;..  va_start(a
8c20: 70 29 3b 0a 20 20 66 69 6c 65 6e 61 6d 65 20 3d  p);.  filename =
8c30: 20 76 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a   va_arg(ap,char*
8c40: 29 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 76 61  );.  lineno = va
8c50: 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
8c60: 66 6f 72 6d 61 74 20 3d 20 76 61 5f 61 72 67 28  format = va_arg(
8c70: 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 2f 2a 20  ap,char*);.  /* 
8c80: 50 72 65 70 61 72 65 20 61 20 70 72 65 66 69 78  Prepare a prefix
8c90: 20 74 6f 20 62 65 20 70 72 65 70 65 6e 64 65 64   to be prepended
8ca0: 20 74 6f 20 65 76 65 72 79 20 6f 75 74 70 75 74   to every output
8cb0: 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 6c   line */.  if( l
8cc0: 69 6e 65 6e 6f 3e 30 20 29 7b 0a 20 20 20 20 73  ineno>0 ){.    s
8cd0: 70 72 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25  printf(prefix,"%
8ce0: 2e 2a 73 3a 25 64 3a 20 22 2c 50 52 45 46 49 58  .*s:%d: ",PREFIX
8cf0: 4c 49 4d 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d  LIMIT-10,filenam
8d00: 65 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 65 6c  e,lineno);.  }el
8d10: 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  se{.    sprintf(
8d20: 70 72 65 66 69 78 2c 22 25 2e 2a 73 3a 20 22 2c  prefix,"%.*s: ",
8d30: 50 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66  PREFIXLIMIT-10,f
8d40: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ilename);.  }.  
8d50: 70 72 65 66 69 78 73 69 7a 65 20 3d 20 73 74 72  prefixsize = str
8d60: 6c 65 6e 28 70 72 65 66 69 78 29 3b 0a 20 20 61  len(prefix);.  a
8d70: 76 61 69 6c 61 62 6c 65 77 69 64 74 68 20 3d 20  vailablewidth = 
8d80: 4c 49 4e 45 57 49 44 54 48 20 2d 20 70 72 65 66  LINEWIDTH - pref
8d90: 69 78 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 47 65  ixsize;..  /* Ge
8da0: 6e 65 72 61 74 65 20 74 68 65 20 65 72 72 6f 72  nerate the error
8db0: 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 76 73   message */.  vs
8dc0: 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 66 6f  printf(errmsg,fo
8dd0: 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65  rmat,ap);.  va_e
8de0: 6e 64 28 61 70 29 3b 0a 20 20 65 72 72 6d 73 67  nd(ap);.  errmsg
8df0: 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28 65 72  size = strlen(er
8e00: 72 6d 73 67 29 3b 0a 20 20 2f 2a 20 52 65 6d 6f  rmsg);.  /* Remo
8e10: 76 65 20 74 72 61 69 6c 69 6e 67 20 27 5c 6e 27  ve trailing '\n'
8e20: 73 20 66 72 6f 6d 20 74 68 65 20 65 72 72 6f 72  s from the error
8e30: 20 6d 65 73 73 61 67 65 2e 20 2a 2f 0a 20 20 77   message. */.  w
8e40: 68 69 6c 65 28 20 65 72 72 6d 73 67 73 69 7a 65  hile( errmsgsize
8e50: 3e 30 20 26 26 20 65 72 72 6d 73 67 5b 65 72 72  >0 && errmsg[err
8e60: 6d 73 67 73 69 7a 65 2d 31 5d 3d 3d 27 5c 6e 27  msgsize-1]=='\n'
8e70: 20 29 7b 0a 20 20 20 20 20 65 72 72 6d 73 67 5b   ){.     errmsg[
8e80: 2d 2d 65 72 72 6d 73 67 73 69 7a 65 5d 20 3d 20  --errmsgsize] = 
8e90: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69  0;.  }..  /* Pri
8ea0: 6e 74 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  nt the error mes
8eb0: 73 61 67 65 20 2a 2f 0a 20 20 62 61 73 65 20 3d  sage */.  base =
8ec0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 65 72 72   0;.  while( err
8ed0: 6d 73 67 5b 62 61 73 65 5d 21 3d 30 20 29 7b 0a  msg[base]!=0 ){.
8ee0: 20 20 20 20 65 6e 64 20 3d 20 72 65 73 74 61 72      end = restar
8ef0: 74 20 3d 20 66 69 6e 64 62 72 65 61 6b 28 26 65  t = findbreak(&e
8f00: 72 72 6d 73 67 5b 62 61 73 65 5d 2c 30 2c 61 76  rrmsg[base],0,av
8f10: 61 69 6c 61 62 6c 65 77 69 64 74 68 29 3b 0a 20  ailablewidth);. 
8f20: 20 20 20 72 65 73 74 61 72 74 20 2b 3d 20 62 61     restart += ba
8f30: 73 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 65  se;.    while( e
8f40: 72 72 6d 73 67 5b 72 65 73 74 61 72 74 5d 3d 3d  rrmsg[restart]==
8f50: 27 20 27 20 29 20 72 65 73 74 61 72 74 2b 2b 3b  ' ' ) restart++;
8f60: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
8f70: 6f 75 74 2c 22 25 73 25 2e 2a 73 5c 6e 22 2c 70  out,"%s%.*s\n",p
8f80: 72 65 66 69 78 2c 65 6e 64 2c 26 65 72 72 6d 73  refix,end,&errms
8f90: 67 5b 62 61 73 65 5d 29 3b 0a 20 20 20 20 62 61  g[base]);.    ba
8fa0: 73 65 20 3d 20 72 65 73 74 61 72 74 3b 0a 20 20  se = restart;.  
8fb0: 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
8fc0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
8fd0: 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a  ile "main.c" ***
8fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9000: 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72  */./*.** Main pr
9010: 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74  ogram file for t
9020: 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
9030: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f  generator..*/../
9040: 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d  * Report an out-
9050: 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74  of-memory condit
9060: 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20  ion and abort.  
9070: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
9080: 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20   is used mostly 
9090: 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68  by the "MemoryCh
90a0: 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74  eck" macro in st
90b0: 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d  ruct.h.*/.void m
90c0: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a 20  emory_error(){. 
90d0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
90e0: 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20  "Out of memory. 
90f0: 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29   Aborting...\n")
9100: 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  ;.  exit(1);.}..
9110: 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f  ./* The main pro
9120: 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65  gram.  Parse the
9130: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e   command line an
9140: 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e  d do it... */.in
9150: 74 20 6d 61 69 6e 28 61 72 67 63 2c 61 72 67 76  t main(argc,argv
9160: 29 0a 69 6e 74 20 61 72 67 63 3b 0a 63 68 61 72  ).int argc;.char
9170: 20 2a 2a 61 72 67 76 3b 0a 7b 0a 20 20 73 74 61   **argv;.{.  sta
9180: 74 69 63 20 69 6e 74 20 76 65 72 73 69 6f 6e 20  tic int version 
9190: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
91a0: 74 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20  t rpflag = 0;.  
91b0: 73 74 61 74 69 63 20 69 6e 74 20 62 61 73 69 73  static int basis
91c0: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
91d0: 69 63 20 69 6e 74 20 63 6f 6d 70 72 65 73 73 20  ic int compress 
91e0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
91f0: 74 20 71 75 69 65 74 20 3d 20 30 3b 0a 20 20 73  t quiet = 0;.  s
9200: 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 69 73  tatic int statis
9210: 74 69 63 73 20 3d 20 30 3b 0a 20 20 73 74 61 74  tics = 0;.  stat
9220: 69 63 20 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20  ic int mhflag = 
9230: 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  0;.  static stru
9240: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74  ct s_options opt
9250: 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  ions[] = {.    {
9260: 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28  OPT_FLAG, "b", (
9270: 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67  char*)&basisflag
9280: 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68  , "Print only th
9290: 65 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72  e basis in repor
92a0: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
92b0: 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a  LAG, "c", (char*
92c0: 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e  )&compress, "Don
92d0: 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20  't compress the 
92e0: 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c  action table."},
92f0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
9300: 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72 70 66  "g", (char*)&rpf
9310: 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72 61 6d  lag, "Print gram
9320: 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63 74 69  mar without acti
9330: 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ons."},.    {OPT
9340: 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68 61  _FLAG, "m", (cha
9350: 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74  r*)&mhflag, "Out
9360: 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65 72  put a makeheader
9370: 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  s compatible fil
9380: 65 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  e"},.    {OPT_FL
9390: 41 47 2c 20 22 71 22 2c 20 28 63 68 61 72 2a 29  AG, "q", (char*)
93a0: 26 71 75 69 65 74 2c 20 22 28 51 75 69 65 74 29  &quiet, "(Quiet)
93b0: 20 44 6f 6e 27 74 20 70 72 69 6e 74 20 74 68 65   Don't print the
93c0: 20 72 65 70 6f 72 74 20 66 69 6c 65 2e 22 7d 2c   report file."},
93d0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
93e0: 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61  "s", (char*)&sta
93f0: 74 69 73 74 69 63 73 2c 20 22 50 72 69 6e 74 20  tistics, "Print 
9400: 70 61 72 73 65 72 20 73 74 61 74 73 20 74 6f 20  parser stats to 
9410: 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 2e  standard output.
9420: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
9430: 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a 29 26  G, "x", (char*)&
9440: 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e 74 20  version, "Print 
9450: 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  the version numb
9460: 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  er."},.    {OPT_
9470: 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b  FLAG,0,0,0}.  };
9480: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
9490: 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a 0a 20  ct lemon lem;.. 
94a0: 20 4f 70 74 49 6e 69 74 28 61 72 67 76 2c 6f 70   OptInit(argv,op
94b0: 74 69 6f 6e 73 2c 73 74 64 65 72 72 29 3b 0a 20  tions,stderr);. 
94c0: 20 69 66 28 20 76 65 72 73 69 6f 6e 20 29 7b 0a   if( version ){.
94d0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 4c 65 6d       printf("Lem
94e0: 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 5c 6e  on version 1.0\n
94f0: 22 29 3b 0a 20 20 20 20 20 65 78 69 74 28 30 29  ");.     exit(0)
9500: 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 4f 70 74  ; .  }.  if( Opt
9510: 4e 41 72 67 73 28 29 21 3d 31 20 29 7b 0a 20 20  NArgs()!=1 ){.  
9520: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
9530: 2c 22 45 78 61 63 74 6c 79 20 6f 6e 65 20 66 69  ,"Exactly one fi
9540: 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
9550: 69 73 20 72 65 71 75 69 72 65 64 2e 5c 6e 22 29  is required.\n")
9560: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
9570: 20 7d 0a 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e   }.  lem.errorcn
9580: 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69  t = 0;..  /* Ini
9590: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 63 68  tialize the mach
95a0: 69 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61 66 65  ine */.  Strsafe
95b0: 5f 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f  _init();.  Symbo
95c0: 6c 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74 61 74  l_init();.  Stat
95d0: 65 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e  e_init();.  lem.
95e0: 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b  argv0 = argv[0];
95f0: 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20  .  lem.filename 
9600: 3d 20 4f 70 74 41 72 67 28 30 29 3b 0a 20 20 6c  = OptArg(0);.  l
9610: 65 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d 20 62  em.basisflag = b
9620: 61 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e  asisflag;.  lem.
9630: 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 30  has_fallback = 0
9640: 3b 0a 20 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63  ;.  lem.nconflic
9650: 74 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 6e 61 6d  t = 0;.  lem.nam
9660: 65 20 3d 20 6c 65 6d 2e 69 6e 63 6c 75 64 65 20  e = lem.include 
9670: 3d 20 6c 65 6d 2e 61 72 67 20 3d 20 6c 65 6d 2e  = lem.arg = lem.
9680: 74 6f 6b 65 6e 74 79 70 65 20 3d 20 6c 65 6d 2e  tokentype = lem.
9690: 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 65 6d  start = 0;.  lem
96a0: 2e 76 61 72 74 79 70 65 20 3d 20 30 3b 0a 20 20  .vartype = 0;.  
96b0: 6c 65 6d 2e 73 74 61 63 6b 73 69 7a 65 20 3d 20  lem.stacksize = 
96c0: 30 3b 0a 20 20 6c 65 6d 2e 65 72 72 6f 72 20 3d  0;.  lem.error =
96d0: 20 6c 65 6d 2e 6f 76 65 72 66 6c 6f 77 20 3d 20   lem.overflow = 
96e0: 6c 65 6d 2e 66 61 69 6c 75 72 65 20 3d 20 6c 65  lem.failure = le
96f0: 6d 2e 61 63 63 65 70 74 20 3d 20 6c 65 6d 2e 74  m.accept = lem.t
9700: 6f 6b 65 6e 64 65 73 74 20 3d 0a 20 20 20 20 20  okendest =.     
9710: 6c 65 6d 2e 74 6f 6b 65 6e 70 72 65 66 69 78 20  lem.tokenprefix 
9720: 3d 20 6c 65 6d 2e 6f 75 74 6e 61 6d 65 20 3d 20  = lem.outname = 
9730: 6c 65 6d 2e 65 78 74 72 61 63 6f 64 65 20 3d 20  lem.extracode = 
9740: 30 3b 0a 20 20 6c 65 6d 2e 76 61 72 64 65 73 74  0;.  lem.vardest
9750: 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 74 61 62 6c   = 0;.  lem.tabl
9760: 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 53 79 6d  esize = 0;.  Sym
9770: 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20  bol_new("$");.  
9780: 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d  lem.errsym = Sym
9790: 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22 29  bol_new("error")
97a0: 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
97b0: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
97c0: 20 20 50 61 72 73 65 28 26 6c 65 6d 29 3b 0a 20    Parse(&lem);. 
97d0: 20 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72 63 6e   if( lem.errorcn
97e0: 74 20 29 20 65 78 69 74 28 6c 65 6d 2e 65 72 72  t ) exit(lem.err
97f0: 6f 72 63 6e 74 29 3b 0a 20 20 69 66 28 20 6c 65  orcnt);.  if( le
9800: 6d 2e 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  m.rule==0 ){.   
9810: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
9820: 22 45 6d 70 74 79 20 67 72 61 6d 6d 61 72 2e 5c  "Empty grammar.\
9830: 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
9840: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75 6e  ;.  }..  /* Coun
9850: 74 20 61 6e 64 20 69 6e 64 65 78 20 74 68 65 20  t and index the 
9860: 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67  symbols of the g
9870: 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 6c 65 6d 2e  rammar */.  lem.
9880: 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62 6f 6c  nsymbol = Symbol
9890: 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 53 79 6d 62  _count();.  Symb
98a0: 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74  ol_new("{default
98b0: 7d 22 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d 62 6f  }");.  lem.symbo
98c0: 6c 73 20 3d 20 53 79 6d 62 6f 6c 5f 61 72 72 61  ls = Symbol_arra
98d0: 79 6f 66 28 29 3b 0a 20 20 71 73 6f 72 74 28 6c  yof();.  qsort(l
98e0: 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e  em.symbols,lem.n
98f0: 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65 6f 66 28  symbol+1,sizeof(
9900: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c  struct symbol*),
9910: 0a 20 20 20 20 20 20 20 20 28 69 6e 74 28 2a 29  .        (int(*)
9920: 28 29 29 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a  ())Symbolcmpp);.
9930: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65    for(i=0; i<=le
9940: 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20  m.nsymbol; i++) 
9950: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  lem.symbols[i]->
9960: 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 66 6f 72  index = i;.  for
9970: 28 69 3d 31 3b 20 69 73 75 70 70 65 72 28 6c 65  (i=1; isupper(le
9980: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  m.symbols[i]->na
9990: 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20  me[0]); i++);.  
99a0: 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d 20  lem.nterminal = 
99b0: 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  i;..  /* Generat
99c0: 65 20 61 20 72 65 70 72 69 6e 74 20 6f 66 20 74  e a reprint of t
99d0: 68 65 20 67 72 61 6d 6d 61 72 2c 20 69 66 20 72  he grammar, if r
99e0: 65 71 75 65 73 74 65 64 20 6f 6e 20 74 68 65 20  equested on the 
99f0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a  command line */.
9a00: 20 20 69 66 28 20 72 70 66 6c 61 67 20 29 7b 0a    if( rpflag ){.
9a10: 20 20 20 20 52 65 70 72 69 6e 74 28 26 6c 65 6d      Reprint(&lem
9a20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9a30: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
9a40: 65 20 73 69 7a 65 20 66 6f 72 20 61 6c 6c 20 66  e size for all f
9a50: 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72 73 74 20  ollow and first 
9a60: 73 65 74 73 20 2a 2f 0a 20 20 20 20 53 65 74 53  sets */.    SetS
9a70: 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  ize(lem.ntermina
9a80: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  l);..    /* Find
9a90: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 20   the precedence 
9aa0: 66 6f 72 20 65 76 65 72 79 20 70 72 6f 64 75 63  for every produc
9ab0: 74 69 6f 6e 20 72 75 6c 65 20 28 74 68 61 74 20  tion rule (that 
9ac0: 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20  has one) */.    
9ad0: 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e  FindRulePreceden
9ae0: 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ces(&lem);..    
9af0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
9b00: 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61  ambda-nontermina
9b10: 6c 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ls and the first
9b20: 2d 73 65 74 73 20 66 6f 72 20 65 76 65 72 79 0a  -sets for every.
9b30: 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e      ** nontermin
9b40: 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69  al */.    FindFi
9b50: 72 73 74 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  rstSets(&lem);..
9b60: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61      /* Compute a
9b70: 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 2e  ll LR(0) states.
9b80: 20 20 41 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f    Also record fo
9b90: 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
9ba0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b  tion.    ** link
9bb0: 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 6f  s so that the fo
9bc0: 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20 62 65 20  llow-set can be 
9bd0: 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 20 2a  computed later *
9be0: 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65  /.    lem.nstate
9bf0: 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e 64 53 74   = 0;.    FindSt
9c00: 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20  ates(&lem);.    
9c10: 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20 53 74 61  lem.sorted = Sta
9c20: 74 65 5f 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20  te_arrayof();.. 
9c30: 20 20 20 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f     /* Tie up loo
9c40: 73 65 20 65 6e 64 73 20 6f 6e 20 74 68 65 20 70  se ends on the p
9c50: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
9c60: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b   */.    FindLink
9c70: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
9c80: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 6f 6c   Compute the fol
9c90: 6c 6f 77 20 73 65 74 20 6f 66 20 65 76 65 72 79  low set of every
9ca0: 20 72 65 64 75 63 69 62 6c 65 20 63 6f 6e 66 69   reducible confi
9cb0: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  guration */.    
9cc0: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26  FindFollowSets(&
9cd0: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
9ce0: 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
9cf0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46   tables */.    F
9d00: 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29  indActions(&lem)
9d10: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  ;..    /* Compre
9d20: 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ss the action ta
9d30: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  bles */.    if( 
9d40: 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29 20 43 6f  compress==0 ) Co
9d50: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 26 6c 65  mpressTables(&le
9d60: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
9d70: 72 61 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66  rate a report of
9d80: 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e 65   the parser gene
9d90: 72 61 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e  rated.  (the "y.
9da0: 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f  output" file) */
9db0: 0a 20 20 20 20 69 66 28 20 21 71 75 69 65 74 20  .    if( !quiet 
9dc0: 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26  ) ReportOutput(&
9dd0: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
9de0: 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75 72 63  nerate the sourc
9df0: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
9e00: 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70  arser */.    Rep
9e10: 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d  ortTable(&lem, m
9e20: 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  hflag);..    /* 
9e30: 50 72 6f 64 75 63 65 20 61 20 68 65 61 64 65 72  Produce a header
9e40: 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79   file for use by
9e50: 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28   the scanner.  (
9e60: 54 68 69 73 20 73 74 65 70 20 69 73 0a 20 20 20  This step is.   
9e70: 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74   ** omitted if t
9e80: 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69  he "-m" option i
9e90: 73 20 75 73 65 64 20 62 65 63 61 75 73 65 20 6d  s used because m
9ea0: 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a  akeheaders will.
9eb0: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20      ** generate 
9ec0: 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e  the file for us.
9ed0: 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68  ) */.    if( !mh
9ee0: 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48 65 61  flag ) ReportHea
9ef0: 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20  der(&lem);.  }. 
9f00: 20 69 66 28 20 73 74 61 74 69 73 74 69 63 73 20   if( statistics 
9f10: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
9f20: 61 72 73 65 72 20 73 74 61 74 69 73 74 69 63 73  arser statistics
9f30: 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73 2c 20  : %d terminals, 
9f40: 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2c  %d nonterminals,
9f50: 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a 20 20   %d rules\n",.  
9f60: 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61      lem.ntermina
9f70: 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d  l, lem.nsymbol -
9f80: 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20   lem.nterminal, 
9f90: 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20 20  lem.nrule);.    
9fa0: 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 20 20  printf("        
9fb0: 20 20 20 20 20 20 20 20 20 20 20 25 64 20 73 74             %d st
9fc0: 61 74 65 73 2c 20 25 64 20 70 61 72 73 65 72 20  ates, %d parser 
9fd0: 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c 20 25  table entries, %
9fe0: 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22 2c 0a  d conflicts\n",.
9ff0: 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65        lem.nstate
a000: 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 2c  , lem.tablesize,
a010: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b   lem.nconflict);
a020: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e  .  }.  if( lem.n
a030: 63 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20  conflict ){.    
a040: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
a050: 25 64 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c  %d parsing confl
a060: 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f  icts.\n",lem.nco
a070: 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20 65  nflict);.  }.  e
a080: 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74  xit(lem.errorcnt
a090: 20 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74   + lem.nconflict
a0a0: 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}./**********
a0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
a0c0: 74 68 65 20 66 69 6c 65 20 22 6d 73 6f 72 74 2e  the file "msort.
a0d0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
a0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a0f0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e 65  **/./*.** A gene
a100: 72 69 63 20 6d 65 72 67 65 2d 73 6f 72 74 20 70  ric merge-sort p
a110: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53  rogram..**.** US
a120: 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70 74 72  AGE:.** Let "ptr
a130: 22 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  " be a pointer t
a140: 6f 20 73 6f 6d 65 20 73 74 72 75 63 74 75 72 65  o some structure
a150: 20 77 68 69 63 68 20 69 73 20 61 74 20 74 68 65   which is at the
a160: 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20 6e 75   head of.** a nu
a170: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69  ll-terminated li
a180: 73 74 2e 20 20 54 68 65 6e 20 74 6f 20 73 6f 72  st.  Then to sor
a190: 74 20 74 68 65 20 6c 69 73 74 20 63 61 6c 6c 3a  t the list call:
a1a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72 20 3d  .**.**     ptr =
a1b0: 20 6d 73 6f 72 74 28 70 74 72 2c 26 28 70 74 72   msort(ptr,&(ptr
a1c0: 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63 29 3b  ->next),cmpfnc);
a1d0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  .**.** In the ab
a1e0: 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22 20 69 73  ove, "cmpfnc" is
a1f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
a200: 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 68 20 63  function which c
a210: 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f 20 69  ompares.** two i
a220: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
a230: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65  structure and re
a240: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
a250: 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72 63 6d  , as in.** strcm
a260: 70 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61  p.  The second a
a270: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
a280: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 6f 69 6e  nter to the poin
a290: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 65  ter to the.** se
a2a0: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
a2b0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  the linked list.
a2c0: 20 20 54 68 69 73 20 61 64 64 72 65 73 73 20 69    This address i
a2d0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
a2e0: 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20  e.** the offset 
a2f0: 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  to the "next" fi
a300: 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20 73  eld within the s
a310: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6f  tructure.  The o
a320: 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ffset to.** the 
a330: 22 6e 65 78 74 22 20 66 69 65 6c 64 20 6d 75 73  "next" field mus
a340: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f  t be constant fo
a350: 72 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73  r all structures
a360: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   in the list..**
a370: 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  .** The function
a380: 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 70   returns a new p
a390: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 69 73 20  ointer which is 
a3a0: 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20  the head of the 
a3b0: 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72 20 73 6f  list.** after so
a3c0: 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47  rting..**.** ALG
a3d0: 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67 65  ORITHM:.** Merge
a3e0: 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  -sort..*/../*.**
a3f0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
a400: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74  r to the next st
a410: 72 75 63 74 75 72 65 20 69 6e 20 74 68 65 20 6c  ructure in the l
a420: 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 23  inked list..*/.#
a430: 64 65 66 69 6e 65 20 4e 45 58 54 28 41 29 20 28  define NEXT(A) (
a440: 2a 28 63 68 61 72 2a 2a 29 28 28 28 75 6e 73 69  *(char**)(((unsi
a450: 67 6e 65 64 20 6c 6f 6e 67 29 41 29 2b 6f 66 66  gned long)A)+off
a460: 73 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  set))../*.** Inp
a470: 75 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20  uts:.**   a:    
a480: 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c     A sorted, nul
a490: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e  l-terminated lin
a4a0: 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20  ked list.  (May 
a4b0: 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62  be null)..**   b
a4c0: 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64  :       A sorted
a4d0: 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  , null-terminate
a4e0: 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20  d linked list.  
a4f0: 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a  (May be null)..*
a500: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70  *   cmp:     A p
a510: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
a520: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
a530: 6e 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20  n..**   offset: 
a540: 20 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73   Offset in the s
a550: 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20  tructure to the 
a560: 22 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a  "next" field..**
a570: 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65  .** Return Value
a580: 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72  :.**   A pointer
a590: 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
a5a0: 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f  a sorted list co
a5b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65  ntaining the ele
a5c0: 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f  ments.**   of bo
a5d0: 74 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a  th a and b..**.*
a5e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
a5f0: 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20  **   The "next" 
a600: 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65  pointers for ele
a610: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73  ments in the lis
a620: 74 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a  ts a and b are.*
a630: 2a 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  *   changed..*/.
a640: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72  static char *mer
a650: 67 65 28 61 2c 62 2c 63 6d 70 2c 6f 66 66 73 65  ge(a,b,cmp,offse
a660: 74 29 0a 63 68 61 72 20 2a 61 3b 0a 63 68 61 72  t).char *a;.char
a670: 20 2a 62 3b 0a 69 6e 74 20 28 2a 63 6d 70 29 28   *b;.int (*cmp)(
a680: 29 3b 0a 69 6e 74 20 6f 66 66 73 65 74 3b 0a 7b  );.int offset;.{
a690: 0a 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68  .  char *ptr, *h
a6a0: 65 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30  ead;..  if( a==0
a6b0: 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62   ){.    head = b
a6c0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d  ;.  }else if( b=
a6d0: 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d  =0 ){.    head =
a6e0: 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
a6f0: 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29   if( (*cmp)(a,b)
a700: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20  <0 ){.      ptr 
a710: 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e  = a;.      a = N
a720: 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73  EXT(a);.    }els
a730: 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62  e{.      ptr = b
a740: 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54  ;.      b = NEXT
a750: 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  (b);.    }.    h
a760: 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77  ead = ptr;.    w
a770: 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a  hile( a && b ){.
a780: 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29        if( (*cmp)
a790: 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20 20 20  (a,b)<0 ){.     
a7a0: 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61     NEXT(ptr) = a
a7b0: 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20  ;.        ptr = 
a7c0: 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e  a;.        a = N
a7d0: 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65  EXT(a);.      }e
a7e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58  lse{.        NEX
a7f0: 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20  T(ptr) = b;.    
a800: 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20      ptr = b;.   
a810: 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29       b = NEXT(b)
a820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a830: 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58 54      if( a ) NEXT
a840: 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65  (ptr) = a;.    e
a850: 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72 29  lse    NEXT(ptr)
a860: 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = b;.  }.  retu
a870: 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn head;.}../*.*
a880: 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c  * Inputs:.**   l
a890: 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ist:      Pointe
a8a0: 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69  r to a singly-li
a8b0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72  nked list of str
a8c0: 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65  uctures..**   ne
a8d0: 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72  xt:      Pointer
a8e0: 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74   to pointer to t
a8f0: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
a900: 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  t of the list..*
a910: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41  *   cmp:       A
a920: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
a930: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tion..**.** Retu
a940: 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41  rn Value:.**   A
a950: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a960: 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64  head of a sorted
a970: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
a980: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a   the elements.**
a990: 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20     orginally in 
a9a0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65  list..**.** Side
a9b0: 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54   effects:.**   T
a9c0: 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65  he "next" pointe
a9d0: 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20  rs for elements 
a9e0: 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e  in list are chan
a9f0: 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ged..*/.#define 
aa00: 4c 49 53 54 53 49 5a 45 20 33 30 0a 63 68 61 72  LISTSIZE 30.char
aa10: 20 2a 6d 73 6f 72 74 28 6c 69 73 74 2c 6e 65 78   *msort(list,nex
aa20: 74 2c 63 6d 70 29 0a 63 68 61 72 20 2a 6c 69 73  t,cmp).char *lis
aa30: 74 3b 0a 63 68 61 72 20 2a 2a 6e 65 78 74 3b 0a  t;.char **next;.
aa40: 69 6e 74 20 28 2a 63 6d 70 29 28 29 3b 0a 7b 0a  int (*cmp)();.{.
aa50: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
aa60: 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20 2a  offset;.  char *
aa70: 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74 5b  ep;.  char *set[
aa80: 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LISTSIZE];.  int
aa90: 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20 28   i;.  offset = (
aaa0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6e 65  unsigned long)ne
aab0: 78 74 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 6c  xt - (unsigned l
aac0: 6f 6e 67 29 6c 69 73 74 3b 0a 20 20 66 6f 72 28  ong)list;.  for(
aad0: 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b  i=0; i<LISTSIZE;
aae0: 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d 20 30   i++) set[i] = 0
aaf0: 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69 73 74 20  ;.  while( list 
ab00: 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69 73 74  ){.    ep = list
ab10: 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e 45 58  ;.    list = NEX
ab20: 54 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e 45 58  T(list);.    NEX
ab30: 54 28 65 70 29 20 3d 20 30 3b 0a 20 20 20 20 66  T(ep) = 0;.    f
ab40: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
ab50: 5a 45 2d 31 20 26 26 20 73 65 74 5b 69 5d 21 3d  ZE-1 && set[i]!=
ab60: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 65  0; i++){.      e
ab70: 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65 74  p = merge(ep,set
ab80: 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b  [i],cmp,offset);
ab90: 0a 20 20 20 20 20 20 73 65 74 5b 69 5d 20 3d 20  .      set[i] = 
aba0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  0;.    }.    set
abb0: 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a 20 20  [i] = ep;.  }.  
abc0: 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ep = 0;.  for(i=
abd0: 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69  0; i<LISTSIZE; i
abe0: 2b 2b 29 20 69 66 28 20 73 65 74 5b 69 5d 20 29  ++) if( set[i] )
abf0: 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73   ep = merge(ep,s
ac00: 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74  et[i],cmp,offset
ac10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 70 3b 0a  );.  return ep;.
ac20: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
ac30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
ac40: 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69 6f   the file "optio
ac50: 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.c" ***********
ac60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
ac70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61  .static char **a
ac80: 72 67 76 3b 0a 73 74 61 74 69 63 20 73 74 72 75  rgv;.static stru
ac90: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70  ct s_options *op
aca0: 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 65  ;.static FILE *e
acb0: 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65 66 69  rrstream;..#defi
acc0: 6e 65 20 49 53 4f 50 54 28 58 29 20 28 28 58 29  ne ISOPT(X) ((X)
acd0: 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30 5d  [0]=='-'||(X)[0]
ace0: 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28 28 58  =='+'||strchr((X
acf0: 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a 2a  ),'=')!=0)../*.*
ad00: 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6d 6d  * Print the comm
ad10: 61 6e 64 20 6c 69 6e 65 20 77 69 74 68 20 61 20  and line with a 
ad20: 63 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e 67 20  carrot pointing 
ad30: 74 6f 20 74 68 65 20 6b 2d 74 68 20 63 68 61 72  to the k-th char
ad40: 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  acter.** of the 
ad50: 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73  n-th field..*/.s
ad60: 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c 69  tatic void errli
ad70: 6e 65 28 6e 2c 6b 2c 65 72 72 29 0a 69 6e 74 20  ne(n,k,err).int 
ad80: 6e 3b 0a 69 6e 74 20 6b 3b 0a 46 49 4c 45 20 2a  n;.int k;.FILE *
ad90: 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 73 70 63  err;.{.  int spc
ada0: 6e 74 2c 20 69 3b 0a 20 20 73 70 63 6e 74 20 3d  nt, i;.  spcnt =
adb0: 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30   0;.  if( argv[0
adc0: 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c  ] ) fprintf(err,
add0: 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20  "%s",argv[0]);. 
ade0: 20 73 70 63 6e 74 20 3d 20 73 74 72 6c 65 6e 28   spcnt = strlen(
adf0: 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20  argv[0]) + 1;.  
ae00: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20  for(i=1; i<n && 
ae10: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
ae20: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
ae30: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
ae40: 20 20 20 73 70 63 6e 74 20 2b 3d 20 73 74 72 6c     spcnt += strl
ae50: 65 6e 28 61 72 67 76 5b 69 5d 2b 31 29 3b 0a 20  en(argv[i]+1);. 
ae60: 20 7d 0a 20 20 73 70 63 6e 74 20 2b 3d 20 6b 3b   }.  spcnt += k;
ae70: 0a 20 20 66 6f 72 28 3b 20 61 72 67 76 5b 69 5d  .  for(; argv[i]
ae80: 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74 66 28 65  ; i++) fprintf(e
ae90: 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d  rr," %s",argv[i]
aea0: 29 3b 0a 20 20 69 66 28 20 73 70 63 6e 74 3c 32  );.  if( spcnt<2
aeb0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
aec0: 28 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68  (err,"\n%*s^-- h
aed0: 65 72 65 5c 6e 22 2c 73 70 63 6e 74 2c 22 22 29  ere\n",spcnt,"")
aee0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
aef0: 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a  printf(err,"\n%*
af00: 73 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63  shere --^\n",spc
af10: 6e 74 2d 37 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a  nt-7,"");.  }.}.
af20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
af30: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4e  e index of the N
af40: 2d 74 68 20 6e 6f 6e 2d 73 77 69 74 63 68 20 61  -th non-switch a
af50: 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  rgument.  Return
af60: 20 2d 31 0a 2a 2a 20 69 66 20 4e 20 69 73 20 6f   -1.** if N is o
af70: 75 74 20 6f 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a  ut of range..*/.
af80: 73 74 61 74 69 63 20 69 6e 74 20 61 72 67 69 6e  static int argin
af90: 64 65 78 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a  dex(n).int n;.{.
afa0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 64    int i;.  int d
afb0: 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69  ashdash = 0;.  i
afc0: 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 2a 61  f( argv!=0 && *a
afd0: 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  rgv!=0 ){.    fo
afe0: 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20  r(i=1; argv[i]; 
aff0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
b000: 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f  dashdash || !ISO
b010: 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20  PT(argv[i]) ){. 
b020: 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20         if( n==0 
b030: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20  ) return i;.    
b040: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
b050: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
b060: 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d  p(argv[i],"--")=
b070: 3d 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20  =0 ) dashdash = 
b080: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
b090: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61  eturn -1;.}..sta
b0a0: 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b 5d 20  tic char emsg[] 
b0b0: 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  = "Command line 
b0c0: 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20 22 3b  syntax error: ";
b0d0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
b0e0: 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64 20 6c  a flag command l
b0f0: 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ine argument..*/
b100: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64  .static int hand
b110: 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 0a 69  leflags(i,err).i
b120: 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b  nt i;.FILE *err;
b130: 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e  .{.  int v;.  in
b140: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
b150: 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30  int j;.  for(j=0
b160: 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a  ; op[j].label; j
b170: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
b180: 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c  cmp(&argv[i][1],
b190: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20  op[j].label)==0 
b1a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 76  ) break;.  }.  v
b1b0: 20 3d 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27   = argv[i][0]=='
b1c0: 2d 27 20 3f 20 31 20 3a 20 30 3b 0a 20 20 69 66  -' ? 1 : 0;.  if
b1d0: 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30  ( op[j].label==0
b1e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20   ){.    if( err 
b1f0: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
b200: 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65  (err,"%sundefine
b210: 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73  d option.\n",ems
b220: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
b230: 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,1,err);.    
b240: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
b250: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
b260: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47  ].type==OPT_FLAG
b270: 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29   ){.    *((int*)
b280: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a  op[j].arg) = v;.
b290: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
b2a0: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41  ].type==OPT_FFLA
b2b0: 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64  G ){.    (*(void
b2c0: 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  (*)())(op[j].arg
b2d0: 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ))(v);.  }else{.
b2e0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
b2f0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
b300: 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75  ,"%smissing argu
b310: 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c  ment on switch.\
b320: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
b330: 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29  errline(i,1,err)
b340: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63  ;.    }.    errc
b350: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nt++;.  }.  retu
b360: 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a  rn errcnt;.}../*
b370: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f  .** Process a co
b380: 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63  mmand line switc
b390: 68 20 77 68 69 63 68 20 68 61 73 20 61 6e 20 61  h which has an a
b3a0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
b3b0: 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69  ic int handleswi
b3c0: 74 63 68 28 69 2c 65 72 72 29 0a 69 6e 74 20 69  tch(i,err).int i
b3d0: 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20  ;.FILE *err;.{. 
b3e0: 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20 20 64   int lv = 0;.  d
b3f0: 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30 3b 0a  ouble dv = 0.0;.
b400: 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30 2c 20    char *sv = 0, 
b410: 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a 63 70  *end;.  char *cp
b420: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74  ;.  int j;.  int
b430: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 63   errcnt = 0;.  c
b440: 70 20 3d 20 73 74 72 63 68 72 28 61 72 67 76 5b  p = strchr(argv[
b450: 69 5d 2c 27 3d 27 29 3b 0a 20 20 2a 63 70 20 3d  i],'=');.  *cp =
b460: 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f   0;.  for(j=0; o
b470: 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29  p[j].label; j++)
b480: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
b490: 28 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c  (argv[i],op[j].l
b4a0: 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b  abel)==0 ) break
b4b0: 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20 27 3d  ;.  }.  *cp = '=
b4c0: 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c  ';.  if( op[j].l
b4d0: 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  abel==0 ){.    i
b4e0: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
b4f0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75  fprintf(err,"%su
b500: 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e  ndefined option.
b510: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
b520: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
b530: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  );.    }.    err
b540: 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  cnt++;.  }else{.
b550: 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 73 77      cp++;.    sw
b560: 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  itch( op[j].type
b570: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
b580: 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63  PT_FLAG:.      c
b590: 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20  ase OPT_FFLAG:. 
b5a0: 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29         if( err )
b5b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
b5c0: 6e 74 66 28 65 72 72 2c 22 25 73 6f 70 74 69 6f  ntf(err,"%soptio
b5d0: 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
b5e0: 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29  gument.\n",emsg)
b5f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 6c  ;.          errl
b600: 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20  ine(i,0,err);.  
b610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b620: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  errcnt++;.      
b630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b640: 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20  ase OPT_DBL:.   
b650: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c     case OPT_FDBL
b660: 3a 0a 20 20 20 20 20 20 20 20 64 76 20 3d 20 73  :.        dv = s
b670: 74 72 74 6f 64 28 63 70 2c 26 65 6e 64 29 3b 0a  trtod(cp,&end);.
b680: 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64          if( *end
b690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
b6a0: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20  ( err ){.       
b6b0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
b6c0: 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72  ,"%sillegal char
b6d0: 61 63 74 65 72 20 69 6e 20 66 6c 6f 61 74 69 6e  acter in floatin
b6e0: 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65 6e 74  g-point argument
b6f0: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
b700: 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28          errline(
b710: 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  i,((unsigned lon
b720: 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64  g)end)-(unsigned
b730: 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72   long)argv[i],er
b740: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
b750: 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74            errcnt
b760: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
b770: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b780: 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a     case OPT_INT:
b790: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
b7a0: 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76  FINT:.        lv
b7b0: 20 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e   = strtol(cp,&en
b7c0: 64 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d,0);.        if
b7d0: 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( *end ){.      
b7e0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
b7f0: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
b800: 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61  tf(err,"%sillega
b810: 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 69  l character in i
b820: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e  nteger argument.
b830: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
b840: 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69         errline(i
b850: 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ,((unsigned long
b860: 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20  )end)-(unsigned 
b870: 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72  long)argv[i],err
b880: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
b890: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
b8a0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
b8b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b8c0: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
b8d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
b8e0: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20  STR:.        sv 
b8f0: 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72  = cp;.        br
b900: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eak;.    }.    s
b910: 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70  witch( op[j].typ
b920: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
b930: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
b940: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
b950: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b960: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
b970: 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75  L:.        *(dou
b980: 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  ble*)(op[j].arg)
b990: 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62   = dv;.        b
b9a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b9b0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
b9c0: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29     (*(void(*)())
b9d0: 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64 76 29  (op[j].arg))(dv)
b9e0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
b9f0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
ba00: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a 28 69  INT:.        *(i
ba10: 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  nt*)(op[j].arg) 
ba20: 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = lv;.        br
ba30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ba40: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
ba50: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28    (*(void(*)())(
ba60: 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74  op[j].arg))((int
ba70: 29 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )lv);.        br
ba80: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ba90: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 20  OPT_STR:.       
baa0: 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d   *(char**)(op[j]
bab0: 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20 20 20 20  .arg) = sv;.    
bac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bad0: 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
bae0: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
baf0: 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  *)())(op[j].arg)
bb00: 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(sv);.        b
bb10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
bb20: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b    return errcnt;
bb30: 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28  .}..int OptInit(
bb40: 61 2c 6f 2c 65 72 72 29 0a 63 68 61 72 20 2a 2a  a,o,err).char **
bb50: 61 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69  a;.struct s_opti
bb60: 6f 6e 73 20 2a 6f 3b 0a 46 49 4c 45 20 2a 65 72  ons *o;.FILE *er
bb70: 72 3b 0a 7b 0a 20 20 69 6e 74 20 65 72 72 63 6e  r;.{.  int errcn
bb80: 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20 3d 20  t = 0;.  argv = 
bb90: 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20 20 65  a;.  op = o;.  e
bba0: 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72 3b 0a  rrstream = err;.
bbb0: 20 20 69 66 28 20 61 72 67 76 20 26 26 20 2a 61    if( argv && *a
bbc0: 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20 20 20  rgv && op ){.   
bbd0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
bbe0: 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  i=1; argv[i]; i+
bbf0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72  +){.      if( ar
bc00: 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c 7c  gv[i][0]=='+' ||
bc10: 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27   argv[i][0]=='-'
bc20: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63   ){.        errc
bc30: 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c 61 67  nt += handleflag
bc40: 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  s(i,err);.      
bc50: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 68 72  }else if( strchr
bc60: 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20 29 7b  (argv[i],'=') ){
bc70: 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 20  .        errcnt 
bc80: 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28  += handleswitch(
bc90: 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a  i,err);.      }.
bca0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
bcb0: 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20  errcnt>0 ){.    
bcc0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56 61 6c  fprintf(err,"Val
bcd0: 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  id command line 
bce0: 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22 25 73  options for \"%s
bcf0: 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29 3b 0a  \" are:\n",*a);.
bd00: 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29 3b 0a      OptPrint();.
bd10: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
bd20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
bd30: 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 29 7b 0a  int OptNArgs(){.
bd40: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
bd50: 20 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20   int dashdash = 
bd60: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  0;.  int i;.  if
bd70: 28 20 61 72 67 76 21 3d 30 20 26 26 20 61 72 67  ( argv!=0 && arg
bd80: 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66  v[0]!=0 ){.    f
bd90: 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b  or(i=1; argv[i];
bda0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
bdb0: 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53   dashdash || !IS
bdc0: 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63  OPT(argv[i]) ) c
bdd0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
bde0: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
bdf0: 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61  --")==0 ) dashda
be00: 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  sh = 1;.    }.  
be10: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a  }.  return cnt;.
be20: 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28  }..char *OptArg(
be30: 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e  n).int n;.{.  in
be40: 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e  t i;.  i = argin
be50: 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75 72 6e  dex(n);.  return
be60: 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69 5d 20   i>=0 ? argv[i] 
be70: 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74  : 0;.}..void Opt
be80: 45 72 72 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a  Err(n).int n;.{.
be90: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61    int i;.  i = a
bea0: 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66  rgindex(n);.  if
beb0: 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65  ( i>=0 ) errline
bec0: 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d 29 3b  (i,0,errstream);
bed0: 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e  .}..void OptPrin
bee0: 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t(){.  int i;.  
bef0: 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20  int max, len;.  
bf00: 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  max = 0;.  for(i
bf10: 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b  =0; op[i].label;
bf20: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20 3d   i++){.    len =
bf30: 20 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61   strlen(op[i].la
bf40: 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73 77  bel) + 1;.    sw
bf50: 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65  itch( op[i].type
bf60: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
bf70: 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63  PT_FLAG:.      c
bf80: 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20  ase OPT_FFLAG:. 
bf90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bfa0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54      case OPT_INT
bfb0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
bfc0: 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c  _FINT:.        l
bfd0: 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20 20 2f  en += 9;       /
bfe0: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69 6e  * length of "<in
bff0: 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20 20  teger>" */.     
c000: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c010: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
c020: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
c030: 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b  L:.        len +
c040: 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65  = 6;       /* le
c050: 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e 22  ngth of "<real>"
c060: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
c070: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
c080: 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73  T_STR:.      cas
c090: 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20  e OPT_FSTR:.    
c0a0: 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20 20      len += 8;   
c0b0: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
c0c0: 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a 20   "<string>" */. 
c0d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c0e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e    }.    if( len>
c0f0: 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e 3b  max ) max = len;
c100: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
c110: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b  op[i].label; i++
c120: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  ){.    switch( o
c130: 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[i].type ){.   
c140: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
c150: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
c160: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
c170: 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61  fprintf(errstrea
c180: 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c 6e  m,"  -%-*s  %s\n
c190: 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62 65  ",max,op[i].labe
c1a0: 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29  l,op[i].message)
c1b0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
c1c0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
c1d0: 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  INT:.      case 
c1e0: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
c1f0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
c200: 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e 74 65 67  eam,"  %s=<integ
c210: 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70  er>%*s  %s\n",op
c220: 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20  [i].label,.     
c230: 20 20 20 20 20 6d 61 78 2d 73 74 72 6c 65 6e 28       max-strlen(
c240: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 2c 22  op[i].label)-9,"
c250: 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29  ",op[i].message)
c260: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
c270: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
c280: 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  DBL:.      case 
c290: 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20  OPT_FDBL:.      
c2a0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
c2b0: 65 61 6d 2c 22 20 20 25 73 3d 3c 72 65 61 6c 3e  eam,"  %s=<real>
c2c0: 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d  %*s  %s\n",op[i]
c2d0: 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  .label,.        
c2e0: 20 20 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b    max-strlen(op[
c2f0: 69 5d 2e 6c 61 62 65 6c 29 2d 36 2c 22 22 2c 6f  i].label)-6,"",o
c300: 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
c310: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c320: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
c330: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
c340: 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66  _FSTR:.        f
c350: 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
c360: 2c 22 20 20 25 73 3d 3c 73 74 72 69 6e 67 3e 25  ,"  %s=<string>%
c370: 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
c380: 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
c390: 20 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69   max-strlen(op[i
c3a0: 5d 2e 6c 61 62 65 6c 29 2d 38 2c 22 22 2c 6f 70  ].label)-8,"",op
c3b0: 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20  [i].message);.  
c3c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c3d0: 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a   }.  }.}./******
c3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3f0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
c400: 22 70 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a  "parse.c" ******
c410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c420: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e  ******/./*.** In
c430: 70 75 74 20 66 69 6c 65 20 70 61 72 73 65 72 20  put file parser 
c440: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
c450: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
c460: 2a 2f 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65  */../* The state
c470: 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a   of the parser *
c480: 2f 0a 73 74 72 75 63 74 20 70 73 74 61 74 65 20  /.struct pstate 
c490: 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  {.  char *filena
c4a0: 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  me;       /* Nam
c4b0: 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
c4c0: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b  ile */.  int tok
c4d0: 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f  enlineno;      /
c4e0: 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20  * Linenumber at 
c4f0: 77 68 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f  which current to
c500: 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20  ken starts */.  
c510: 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20  int errorcnt;   
c520: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c530: 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72  of errors so far
c540: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65   */.  char *toke
c550: 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54  nstart;     /* T
c560: 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74  ext of current t
c570: 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  oken */.  struct
c580: 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20   lemon *gp;     
c590: 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20  /* Global state 
c5a0: 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d  vector */.  enum
c5b0: 20 65 5f 73 74 61 74 65 20 7b 0a 20 20 20 20 49   e_state {.    I
c5c0: 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20 20 20 57  NITIALIZE,.    W
c5d0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
c5e0: 4f 52 5f 52 55 4c 45 2c 0a 20 20 20 20 57 41 49  OR_RULE,.    WAI
c5f0: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45  TING_FOR_DECL_KE
c600: 59 57 4f 52 44 2c 0a 20 20 20 20 57 41 49 54 49  YWORD,.    WAITI
c610: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c  NG_FOR_DECL_ARG,
c620: 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  .    WAITING_FOR
c630: 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
c640: 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f  OL,.    WAITING_
c650: 46 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 20 20 49  FOR_ARROW,.    I
c660: 4e 5f 52 48 53 2c 0a 20 20 20 20 4c 48 53 5f 41  N_RHS,.    LHS_A
c670: 4c 49 41 53 5f 31 2c 0a 20 20 20 20 4c 48 53 5f  LIAS_1,.    LHS_
c680: 41 4c 49 41 53 5f 32 2c 0a 20 20 20 20 4c 48 53  ALIAS_2,.    LHS
c690: 5f 41 4c 49 41 53 5f 33 2c 0a 20 20 20 20 52 48  _ALIAS_3,.    RH
c6a0: 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 20 20 52  S_ALIAS_1,.    R
c6b0: 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 20 20  HS_ALIAS_2,.    
c6c0: 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
c6d0: 31 2c 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43  1,.    PRECEDENC
c6e0: 45 5f 4d 41 52 4b 5f 32 2c 0a 20 20 20 20 52 45  E_MARK_2,.    RE
c6f0: 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
c700: 45 52 52 4f 52 2c 0a 20 20 20 20 52 45 53 59 4e  ERROR,.    RESYN
c710: 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
c720: 4f 52 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f  OR,.    WAITING_
c730: 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53  FOR_DESTRUCTOR_S
c740: 59 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49  YMBOL,.    WAITI
c750: 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f  NG_FOR_DATATYPE_
c760: 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54  SYMBOL,.    WAIT
c770: 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b  ING_FOR_FALLBACK
c780: 5f 49 44 0a 20 20 7d 20 73 74 61 74 65 3b 20 20  _ID.  } state;  
c790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7a0: 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66   /* The state of
c7b0: 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20   the parser */. 
c7c0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
c7d0: 66 61 6c 6c 62 61 63 6b 3b 20 20 20 2f 2a 20 54  fallback;   /* T
c7e0: 68 65 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  he fallback toke
c7f0: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  n */.  struct sy
c800: 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20  mbol *lhs;      
c810: 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73    /* Left-hand s
c820: 69 64 65 20 6f 66 20 63 75 72 72 65 6e 74 20 72  ide of current r
c830: 75 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ule */.  char *l
c840: 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20 20 20  hsalias;        
c850: 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72      /* Alias for
c860: 20 74 68 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e   the LHS */.  in
c870: 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20  t nrhs;         
c880: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c890: 65 72 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  er of right-hand
c8a0: 20 73 69 64 65 20 73 79 6d 62 6f 6c 73 20 73 65   side symbols se
c8b0: 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  en */.  struct s
c8c0: 79 6d 62 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48  ymbol *rhs[MAXRH
c8d0: 53 5d 3b 20 20 2f 2a 20 52 48 53 20 73 79 6d 62  S];  /* RHS symb
c8e0: 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61  ols */.  char *a
c8f0: 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b 20 20 20  lias[MAXRHS];   
c900: 20 20 20 20 2f 2a 20 41 6c 69 61 73 65 73 20 66      /* Aliases f
c910: 6f 72 20 65 61 63 68 20 52 48 53 20 73 79 6d 62  or each RHS symb
c920: 6f 6c 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  ol (or NULL) */.
c930: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70    struct rule *p
c940: 72 65 76 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20  revrule;     /* 
c950: 50 72 65 76 69 6f 75 73 20 72 75 6c 65 20 70 61  Previous rule pa
c960: 72 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rsed */.  char *
c970: 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20 20  declkeyword;    
c980: 20 20 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20       /* Keyword 
c990: 6f 66 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e  of a declaration
c9a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 64 65 63   */.  char **dec
c9b0: 6c 61 72 67 73 6c 6f 74 3b 20 20 20 20 20 20 20  largslot;       
c9c0: 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 64 65   /* Where the de
c9d0: 63 6c 61 72 61 74 69 6f 6e 20 61 72 67 75 6d 65  claration argume
c9e0: 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 70 75 74  nt should be put
c9f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c 6c   */.  int *decll
ca00: 6e 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nslot;          
ca10: 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20 64 65   /* Where the de
ca20: 63 6c 61 72 61 74 69 6f 6e 20 6c 69 6e 65 6e 75  claration linenu
ca30: 6d 62 65 72 20 69 73 20 70 75 74 20 2a 2f 0a 20  mber is put */. 
ca40: 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64 65   enum e_assoc de
ca50: 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41  classoc;    /* A
ca60: 73 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f 63  ssign this assoc
ca70: 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61  iation to decl a
ca80: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  rguments */.  in
ca90: 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20 20  t preccounter;  
caa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 69           /* Assi
cab0: 67 6e 20 74 68 69 73 20 70 72 65 63 65 64 65 6e  gn this preceden
cac0: 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d  ce to decl argum
cad0: 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ents */.  struct
cae0: 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c 65   rule *firstrule
caf0: 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
cb00: 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69 6e  to first rule in
cb10: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a   the grammar */.
cb20: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6c    struct rule *l
cb30: 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20  astrule;     /* 
cb40: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d  Pointer to the m
cb50: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
cb60: 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a  sed rule */.};..
cb70: 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c  /* Parse a singl
cb80: 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69  e token */.stati
cb90: 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65 74  c void parseonet
cba0: 6f 6b 65 6e 28 70 73 70 29 0a 73 74 72 75 63 74  oken(psp).struct
cbb0: 20 70 73 74 61 74 65 20 2a 70 73 70 3b 0a 7b 0a   pstate *psp;.{.
cbc0: 20 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d    char *x;.  x =
cbd0: 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74 6f   Strsafe(psp->to
cbe0: 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20 2f  kenstart);     /
cbf0: 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65 6e  * Save the token
cc00: 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a   permanently */.
cc10: 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22  #if 0.  printf("
cc20: 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73  %s:%d: Token=[%s
cc30: 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73  ] state=%d\n",ps
cc40: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
cc50: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
cc60: 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b    x,psp->state);
cc70: 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68  .#endif.  switch
cc80: 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a  ( psp->state ){.
cc90: 20 20 20 20 63 61 73 65 20 49 4e 49 54 49 41 4c      case INITIAL
cca0: 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e  IZE:.      psp->
ccb0: 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20  prevrule = 0;.  
ccc0: 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75      psp->preccou
ccd0: 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  nter = 0;.      
cce0: 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d  psp->firstrule =
ccf0: 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
cd00: 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 67   0;.      psp->g
cd10: 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20  p->nrule = 0;.  
cd20: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
cd30: 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a 2f   to next case */
cd40: 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
cd50: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
cd60: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  LE:.      if( x[
cd70: 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20  0]=='%' ){.     
cd80: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
cd90: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
cda0: 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20  _KEYWORD;.      
cdb0: 7d 65 6c 73 65 20 69 66 28 20 69 73 6c 6f 77 65  }else if( islowe
cdc0: 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  r(x[0]) ){.     
cdd0: 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79     psp->lhs = Sy
cde0: 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
cdf0: 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d       psp->nrhs =
ce00: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
ce10: 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20  >lhsalias = 0;. 
ce20: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
ce30: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
ce40: 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c  ARROW;.      }el
ce50: 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27  se if( x[0]=='{'
ce60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
ce70: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30  psp->prevrule==0
ce80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
ce90: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
cea0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
ceb0: 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73  ineno,."There is
cec0: 20 6e 6f 74 20 70 72 69 6f 72 20 72 75 6c 65 20   not prior rule 
ced0: 6f 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74  opon which to at
cee0: 74 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a  tach the code \.
cef0: 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62  fragment which b
cf00: 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69  egins on this li
cf10: 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ne.");.         
cf20: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
cf30: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 70 73 70  ;..}else if( psp
cf40: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65  ->prevrule->code
cf50: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
cf60: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
cf70: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
cf80: 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20  enlineno,."Code 
cf90: 66 72 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e 69  fragment beginni
cfa0: 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  ng on this line 
cfb0: 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  is not the first
cfc0: 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65   \.to follow the
cfd0: 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22   previous rule."
cfe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
cff0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
d000: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d010: 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
d020: 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73 70  rule->line = psp
d030: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20  ->tokenlineno;. 
d040: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
d050: 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20 26  evrule->code = &
d060: 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d  x[1];..}.      }
d070: 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
d080: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  [' ){.        ps
d090: 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
d0a0: 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20  DENCE_MARK_1;.  
d0b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d0c0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
d0d0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
d0e0: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
d0f0: 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25        "Token \"%
d100: 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69  s\" should be ei
d110: 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61  ther \"%%\" or a
d120: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d   nonterminal nam
d130: 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  e.",.          x
d140: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
d150: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
d160: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d170: 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44  .    case PRECED
d180: 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20  ENCE_MARK_1:.   
d190: 20 20 20 69 66 28 20 21 69 73 75 70 70 65 72 28     if( !isupper(
d1a0: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
d1b0: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
d1c0: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
d1d0: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
d1e0: 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64 65      "The precede
d1f0: 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20  nce symbol must 
d200: 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29  be a terminal.")
d210: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
d220: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
d230: 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
d240: 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  prevrule==0 ){. 
d250: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
d260: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
d270: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
d280: 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72 65            "There
d290: 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c   is no prior rul
d2a0: 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63  e to assign prec
d2b0: 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e  edence \"[%s]\".
d2c0: 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
d2d0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
d2e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
d2f0: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72  sp->prevrule->pr
d300: 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20  ecsym!=0 ){.    
d310: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
d320: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
d330: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72  tokenlineno,."Pr
d340: 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e  ecedence mark on
d350: 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
d360: 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f  t the first \.to
d370: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76   follow the prev
d380: 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  ious rule.");.  
d390: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
d3a0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
d3b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  se{.        psp-
d3c0: 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73  >prevrule->precs
d3d0: 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  ym = Symbol_new(
d3e0: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
d3f0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
d400: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
d410: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d420: 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e     case PRECEDEN
d430: 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20  CE_MARK_2:.     
d440: 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29   if( x[0]!=']' )
d450: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
d460: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
d470: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
d480: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
d490: 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70  ssing \"]\" on p
d4a0: 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22  recedence mark."
d4b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
d4c0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
d4d0: 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73    }.      psp->s
d4e0: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
d4f0: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
d500: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d510: 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
d520: 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20  OR_ARROW:.      
d530: 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26  if( x[0]==':' &&
d540: 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[1]==':' && x[
d550: 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20  2]=='=' ){.     
d560: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
d570: 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65  IN_RHS;.      }e
d580: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28  lse if( x[0]=='(
d590: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
d5a0: 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
d5b0: 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_1;.      }el
d5c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
d5d0: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
d5e0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
d5f0: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
d600: 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65 20  Expected to see 
d610: 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e  a \":\" followin
d620: 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  g the LHS symbol
d630: 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20   \"%s\".",.     
d640: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
d650: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
d660: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
d670: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
d680: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
d690: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
d6a0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
d6b0: 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
d6c0: 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66  LIAS_1:.      if
d6d0: 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
d6e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
d6f0: 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20  lhsalias = x;.  
d700: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
d710: 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a   = LHS_ALIAS_2;.
d720: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d730: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
d740: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
d750: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
d760: 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20          "\"%s\" 
d770: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61  is not a valid a
d780: 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
d790: 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
d7a0: 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73        x,psp->lhs
d7b0: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
d7c0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
d7d0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
d7e0: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
d7f0: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
d800: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
d810: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
d820: 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20  S_ALIAS_2:.     
d830: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29   if( x[0]==')' )
d840: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
d850: 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
d860: 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _3;.      }else{
d870: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
d880: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
d890: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
d8a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
d8b0: 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
d8c0: 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
d8d0: 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
d8e0: 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
d8f0: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
d900: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
d910: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
d920: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
d930: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
d940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
d950: 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20  e LHS_ALIAS_3:. 
d960: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
d970: 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20  :' && x[1]==':' 
d980: 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a  && x[2]=='=' ){.
d990: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
d9a0: 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20  te = IN_RHS;.   
d9b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d9c0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
d9d0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
d9e0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
d9f0: 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
da00: 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20  ->\" following: 
da10: 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20  \"%s(%s)\".",.  
da20: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
da30: 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73  s->name,psp->lhs
da40: 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20  alias);.        
da50: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
da60: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
da70: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
da80: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
da90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
daa0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f  ak;.    case IN_
dab0: 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78  RHS:.      if( x
dac0: 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
dad0: 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20      struct rule 
dae0: 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20  *rp;.        rp 
daf0: 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  = (struct rule *
db00: 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
db10: 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a  struct rule) + .
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
db30: 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
db40: 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20  l*)*psp->nrhs + 
db50: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73  sizeof(char*)*ps
db60: 70 2d 3e 6e 72 68 73 20 29 3b 0a 20 20 20 20 20  p->nrhs );.     
db70: 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a     if( rp==0 ){.
db80: 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
db90: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
dba0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
dbb0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
dbc0: 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 65  Can't allocate e
dbd0: 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72  nough memory for
dbe0: 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20   this rule.");. 
dbf0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
dc00: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
dc10: 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
dc20: 65 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b 0a 20  e = 0;..}else{. 
dc30: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
dc40: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 75            rp->ru
dc50: 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f  leline = psp->to
dc60: 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  kenlineno;.     
dc70: 20 20 20 20 20 72 70 2d 3e 72 68 73 20 3d 20 28       rp->rhs = (
dc80: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29  struct symbol**)
dc90: 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  &rp[1];.        
dca0: 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d    rp->rhsalias =
dcb0: 20 28 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72   (char**)&(rp->r
dcc0: 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a  hs[psp->nrhs]);.
dcd0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
dce0: 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20  0; i<psp->nrhs; 
dcf0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
dd00: 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70    rp->rhs[i] = p
dd10: 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  sp->rhs[i];.    
dd20: 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61          rp->rhsa
dd30: 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61  lias[i] = psp->a
dd40: 6c 69 61 73 5b 69 5d 3b 0a 09 20 20 7d 0a 20 20  lias[i];..  }.  
dd50: 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 20          rp->lhs 
dd60: 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20 20 20 20  = psp->lhs;.    
dd70: 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69        rp->lhsali
dd80: 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73 61 6c 69  as = psp->lhsali
dd90: 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  as;.          rp
dda0: 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d 3e 6e 72  ->nrhs = psp->nr
ddb0: 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  hs;.          rp
ddc0: 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  ->code = 0;.    
ddd0: 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79        rp->precsy
dde0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  m = 0;.         
ddf0: 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70 73 70   rp->index = psp
de00: 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20  ->gp->nrule++;. 
de10: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78           rp->nex
de20: 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e  tlhs = rp->lhs->
de30: 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  rule;.          
de40: 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20 3d 20  rp->lhs->rule = 
de50: 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  rp;.          rp
de60: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
de70: 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66        if( psp->f
de80: 69 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  irstrule==0 ){. 
de90: 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e             psp->
dea0: 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d  firstrule = psp-
deb0: 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a  >lastrule = rp;.
dec0: 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20  .  }else{.      
ded0: 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72        psp->lastr
dee0: 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a  ule->next = rp;.
def0: 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d              psp-
df00: 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a  >lastrule = rp;.
df10: 09 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70  .  }.          p
df20: 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 72  sp->prevrule = r
df30: 70 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20 70 73  p;..}.        ps
df40: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
df50: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
df60: 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
df70: 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30   if( isalpha(x[0
df80: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
df90: 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58  ( psp->nrhs>=MAX
dfa0: 52 48 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RHS ){.         
dfb0: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
dfc0: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
dfd0: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
dfe0: 20 20 20 20 20 20 22 54 6f 6f 20 6d 61 6e 79 20        "Too many 
dff0: 73 79 6d 62 6f 6c 20 6f 6e 20 52 48 53 20 6f 72  symbol on RHS or
e000: 20 72 75 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20   rule beginning 
e010: 61 74 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20  at \"%s\".",.   
e020: 20 20 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20           x);.   
e030: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
e040: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
e050: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
e060: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
e070: 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a  _ERROR;..}else{.
e080: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72            psp->r
e090: 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20  hs[psp->nrhs] = 
e0a0: 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
e0b0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c           psp->al
e0c0: 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d  ias[psp->nrhs] =
e0d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73   0;.          ps
e0e0: 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d 0a 20 20  p->nrhs++;..}.  
e0f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
e100: 30 5d 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e  0]=='(' && psp->
e110: 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20  nrhs>0 ){.      
e120: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
e130: 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20  HS_ALIAS_1;.    
e140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e150: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
e160: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
e170: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
e180: 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 63 68 61      "Illegal cha
e190: 72 61 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66  racter on RHS of
e1a0: 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c   rule: \"%s\".",
e1b0: 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
e1c0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
e1d0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
e1e0: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
e1f0: 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
e200: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
e210: 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49      case RHS_ALI
e220: 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_1:.      if( 
e230: 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
e240: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c  .        psp->al
e250: 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  ias[psp->nrhs-1]
e260: 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73   = x;.        ps
e270: 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41  p->state = RHS_A
e280: 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65  LIAS_2;.      }e
e290: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
e2a0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
e2b0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
e2c0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
e2d0: 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61  "\"%s\" is not a
e2e0: 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72   valid alias for
e2f0: 20 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20   the RHS symbol 
e300: 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
e310: 20 20 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b       x,psp->rhs[
e320: 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61  psp->nrhs-1]->na
e330: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
e340: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
e350: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
e360: 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
e370: 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
e380: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e390: 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c  .    case RHS_AL
e3a0: 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  IAS_2:.      if(
e3b0: 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20   x[0]==')' ){.  
e3c0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
e3d0: 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
e3e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e3f0: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
e400: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
e410: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
e420: 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c     "Missing \")\
e430: 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20  " following LHS 
e440: 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c  alias name \"%s\
e450: 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ".",psp->lhsalia
e460: 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
e470: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
e480: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
e490: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
e4a0: 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
e4b0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
e4c0: 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
e4d0: 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
e4e0: 44 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61  D:.      if( isa
e4f0: 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20  lpha(x[0]) ){.  
e500: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b        psp->declk
e510: 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20  eyword = x;.    
e520: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
e530: 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  slot = 0;.      
e540: 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f    psp->decllnslo
e550: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
e560: 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
e570: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
e580: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  ;.        if( st
e590: 72 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d  rcmp(x,"name")==
e5a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
e5b0: 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
e5c0: 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d  = &(psp->gp->nam
e5d0: 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  e);..}else if( s
e5e0: 74 72 63 6d 70 28 78 2c 22 69 6e 63 6c 75 64 65  trcmp(x,"include
e5f0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e600: 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
e610: 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
e620: 3e 69 6e 63 6c 75 64 65 29 3b 0a 20 20 20 20 20  >include);.     
e630: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
e640: 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
e650: 3e 69 6e 63 6c 75 64 65 6c 6e 3b 0a 09 7d 65 6c  >includeln;..}el
e660: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
e670: 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "code")==0 ){.  
e680: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
e690: 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
e6a0: 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29  ->gp->extracode)
e6b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
e6c0: 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70  >decllnslot = &p
e6d0: 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64  sp->gp->extracod
e6e0: 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  eln;..}else if( 
e6f0: 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
e700: 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
e710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
e720: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
e730: 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64  &psp->gp->tokend
e740: 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  est;.          p
e750: 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d  sp->decllnslot =
e760: 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e   &psp->gp->token
e770: 64 65 73 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69  destln;..}else i
e780: 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66  f( strcmp(x,"def
e790: 61 75 6c 74 5f 64 65 73 74 72 75 63 74 6f 72 22  ault_destructor"
e7a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e7b0: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
e7c0: 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76  ot = &psp->gp->v
e7d0: 61 72 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20  ardest;.        
e7e0: 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f    psp->decllnslo
e7f0: 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61  t = &psp->gp->va
e800: 72 64 65 73 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20  rdestln;..}else 
e810: 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
e820: 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20  ken_prefix")==0 
e830: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
e840: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
e850: 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70  &psp->gp->tokenp
e860: 72 65 66 69 78 3b 0a 09 7d 65 6c 73 65 20 69 66  refix;..}else if
e870: 28 20 73 74 72 63 6d 70 28 78 2c 22 73 79 6e 74  ( strcmp(x,"synt
e880: 61 78 5f 65 72 72 6f 72 22 29 3d 3d 30 20 29 7b  ax_error")==0 ){
e890: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
e8a0: 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
e8b0: 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 29 3b  psp->gp->error);
e8c0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
e8d0: 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73  decllnslot = &ps
e8e0: 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 6c 6e 3b 0a  p->gp->errorln;.
e8f0: 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
e900: 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70  p(x,"parse_accep
e910: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
e920: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
e930: 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
e940: 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20 20 20  ->accept);.     
e950: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
e960: 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
e970: 3e 61 63 63 65 70 74 6c 6e 3b 0a 09 7d 65 6c 73  >acceptln;..}els
e980: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
e990: 70 61 72 73 65 5f 66 61 69 6c 75 72 65 22 29 3d  parse_failure")=
e9a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
e9b0: 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
e9c0: 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 66 61   = &(psp->gp->fa
e9d0: 69 6c 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20  ilure);.        
e9e0: 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f    psp->decllnslo
e9f0: 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 66 61  t = &psp->gp->fa
ea00: 69 6c 75 72 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20  ilureln;..}else 
ea10: 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74  if( strcmp(x,"st
ea20: 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d  ack_overflow")==
ea30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
ea40: 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
ea50: 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65  = &(psp->gp->ove
ea60: 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20  rflow);.        
ea70: 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f    psp->decllnslo
ea80: 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 6f 76  t = &psp->gp->ov
ea90: 65 72 66 6c 6f 77 6c 6e 3b 0a 20 20 20 20 20 20  erflowln;.      
eaa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
eab0: 6d 70 28 78 2c 22 65 78 74 72 61 5f 61 72 67 75  mp(x,"extra_argu
eac0: 6d 65 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ment")==0 ){.   
ead0: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
eae0: 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
eaf0: 3e 67 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20  >gp->arg);.     
eb00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
eb10: 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70  cmp(x,"token_typ
eb20: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
eb30: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
eb40: 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
eb50: 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20  ->tokentype);.  
eb60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
eb70: 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75 6c  strcmp(x,"defaul
eb80: 74 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20  t_type")==0 ){. 
eb90: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
eba0: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
ebb0: 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65 29 3b  p->gp->vartype);
ebc0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
ebd0: 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
ebe0: 63 6b 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  ck_size")==0 ){.
ebf0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
ec00: 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
ec10: 73 70 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a  sp->gp->stacksiz
ec20: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
ec30: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
ec40: 73 74 61 72 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d  start_symbol")==
ec50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
ec60: 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
ec70: 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61  = &(psp->gp->sta
ec80: 72 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  rt);.        }el
ec90: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
eca0: 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "left")==0 ){.  
ecb0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
ecc0: 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
ecd0: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
ece0: 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20  ssoc = LEFT;.   
ecf0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
ed00: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
ed10: 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
ed20: 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
ed30: 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72   if( strcmp(x,"r
ed40: 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ight")==0 ){.   
ed50: 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
ed60: 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
ed70: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
ed80: 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20  soc = RIGHT;.   
ed90: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
eda0: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
edb0: 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
edc0: 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
edd0: 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e   if( strcmp(x,"n
ede0: 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a  onassoc")==0 ){.
edf0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
ee00: 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
ee10: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
ee20: 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20  lassoc = NONE;. 
ee30: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
ee40: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
ee50: 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
ee60: 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  BOL;..}else if( 
ee70: 73 74 72 63 6d 70 28 78 2c 22 64 65 73 74 72 75  strcmp(x,"destru
ee80: 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ctor")==0 ){.   
ee90: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
eea0: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
eeb0: 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f  DESTRUCTOR_SYMBO
eec0: 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  L;..}else if( st
eed0: 72 63 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d  rcmp(x,"type")==
eee0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
eef0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
ef00: 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45  ING_FOR_DATATYPE
ef10: 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
ef20: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
ef30: 70 28 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d  p(x,"fallback")=
ef40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ef50: 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20  psp->fallback = 
ef60: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  0;.          psp
ef70: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
ef80: 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49  G_FOR_FALLBACK_I
ef90: 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  D;.        }else
efa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
efb0: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
efc0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
efd0: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
efe0: 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61 72   "Unknown declar
eff0: 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c  ation keyword: \
f000: 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20  "%%%s\".",x);.  
f010: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
f020: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
f030: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f040: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
f050: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
f060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f070: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f080: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f090: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f0a0: 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 64 65 63      "Illegal dec
f0b0: 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64  laration keyword
f0c0: 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  : \"%s\".",x);. 
f0d0: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f0e0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
f0f0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
f100: 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
f110: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
f120: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
f130: 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
f140: 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f  DESTRUCTOR_SYMBO
f150: 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  L:.      if( !is
f160: 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
f170: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f180: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f190: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f1a0: 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
f1b0: 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
f1c0: 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f 72  fter %destructor
f1d0: 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20   keyword");.    
f1e0: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f1f0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
f200: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
f210: 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
f220: 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
f230: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
f240: 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
f250: 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
f260: 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
f270: 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72  lot = &sp->destr
f280: 75 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  uctor;.        p
f290: 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d  sp->decllnslot =
f2a0: 20 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72   &sp->destructor
f2b0: 6c 6e 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ln;.        psp-
f2c0: 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
f2d0: 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20  _FOR_DECL_ARG;. 
f2e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f2f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
f300: 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50  TING_FOR_DATATYP
f310: 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20  E_SYMBOL:.      
f320: 69 66 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30  if( !isalpha(x[0
f330: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
f340: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
f350: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f360: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
f370: 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69   "Symbol name mi
f380: 73 73 69 6e 67 20 61 66 74 65 72 20 25 64 65 73  ssing after %des
f390: 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22  tructor keyword"
f3a0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f3b0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f3c0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f3d0: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
f3e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
f3f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
f400: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
f410: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
f420: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
f430: 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70  eclargslot = &sp
f440: 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20  ->datatype;.    
f450: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73      psp->decllns
f460: 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lot = 0;.       
f470: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
f480: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
f490: 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RG;.      }.    
f4a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f4b0: 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  e WAITING_FOR_PR
f4c0: 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a  ECEDENCE_SYMBOL:
f4d0: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
f4e0: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
f4f0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
f500: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
f510: 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
f520: 73 65 20 69 66 28 20 69 73 75 70 70 65 72 28 78  se if( isupper(x
f530: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
f540: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
f550: 70 3b 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20  p;.        sp = 
f560: 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
f570: 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70         if( sp->p
f580: 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rec>=0 ){.      
f590: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f5a0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f5b0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
f5c0: 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c           "Symbol
f5d0: 20 5c 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65   \"%s\" has alre
f5e0: 61 64 79 20 62 65 20 67 69 76 65 6e 20 61 20 70  ady be given a p
f5f0: 72 65 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a  recedence.",x);.
f600: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
f610: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73  rrorcnt++;..}els
f620: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  e{.          sp-
f630: 3e 70 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65  >prec = psp->pre
f640: 63 63 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20  ccounter;.      
f650: 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20      sp->assoc = 
f660: 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a  psp->declassoc;.
f670: 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .}.      }else{.
f680: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f690: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f6a0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f6b0: 0a 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 27  .          "Can'
f6c0: 74 20 61 73 73 69 67 6e 20 61 20 70 72 65 63 65  t assign a prece
f6d0: 64 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e  dence to \"%s\".
f6e0: 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
f6f0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f700: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f710: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
f720: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52  TING_FOR_DECL_AR
f730: 47 3a 0a 20 20 20 20 20 20 69 66 28 20 28 78 5b  G:.      if( (x[
f740: 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d  0]=='{' || x[0]=
f750: 3d 27 5c 22 27 20 7c 7c 20 69 73 61 6c 6e 75 6d  ='\"' || isalnum
f760: 28 78 5b 30 5d 29 29 20 29 7b 0a 20 20 20 20 20  (x[0])) ){.     
f770: 20 20 20 69 66 28 20 2a 28 70 73 70 2d 3e 64 65     if( *(psp->de
f780: 63 6c 61 72 67 73 6c 6f 74 29 21 3d 30 20 29 7b  clargslot)!=0 ){
f790: 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
f7a0: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f7b0: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f7c0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
f7d0: 22 54 68 65 20 61 72 67 75 6d 65 6e 74 20 5c 22  "The argument \"
f7e0: 25 73 5c 22 20 74 6f 20 64 65 63 6c 61 72 61 74  %s\" to declarat
f7f0: 69 6f 6e 20 5c 22 25 25 25 73 5c 22 20 69 73 20  ion \"%%%s\" is 
f800: 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2e 22 2c  not the first.",
f810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 5b 30  .            x[0
f820: 5d 3d 3d 27 5c 22 27 20 3f 20 26 78 5b 31 5d 20  ]=='\"' ? &x[1] 
f830: 3a 20 78 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79  : x,psp->declkey
f840: 77 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 20  word);.         
f850: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f860: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
f870: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
f880: 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
f890: 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20  ;..}else{.      
f8a0: 20 20 20 20 2a 28 70 73 70 2d 3e 64 65 63 6c 61      *(psp->decla
f8b0: 72 67 73 6c 6f 74 29 20 3d 20 28 78 5b 30 5d 3d  rgslot) = (x[0]=
f8c0: 3d 27 5c 22 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27  ='\"' || x[0]=='
f8d0: 7b 27 29 20 3f 20 26 78 5b 31 5d 20 3a 20 78 3b  {') ? &x[1] : x;
f8e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
f8f0: 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 29  sp->decllnslot )
f900: 20 2a 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f   *psp->decllnslo
f910: 74 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  t = psp->tokenli
f920: 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  neno;.          
f930: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
f940: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
f950: 5f 52 55 4c 45 3b 0a 09 7d 0a 20 20 20 20 20 20  _RULE;..}.      
f960: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
f970: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f980: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f990: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
f9a0: 20 20 22 49 6c 6c 65 67 61 6c 20 61 72 67 75 6d    "Illegal argum
f9b0: 65 6e 74 20 74 6f 20 25 25 25 73 3a 20 25 73 22  ent to %%%s: %s"
f9c0: 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72  ,psp->declkeywor
f9d0: 64 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  d,x);.        ps
f9e0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f9f0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
fa00: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
fa10: 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
fa20: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
fa30: 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
fa40: 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f  NG_FOR_FALLBACK_
fa50: 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  ID:.      if( x[
fa60: 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]=='.' ){.     
fa70: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
fa80: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
fa90: 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20  _OR_RULE;.      
faa0: 7d 65 6c 73 65 20 69 66 28 20 21 69 73 75 70 70  }else if( !isupp
fab0: 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  er(x[0]) ){.    
fac0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
fad0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
fae0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
faf0: 20 20 20 20 20 20 20 20 22 25 25 66 61 6c 6c 62          "%%fallb
fb00: 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 5c 22 25  ack argument \"%
fb10: 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20  s\" should be a 
fb20: 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20  token", x);.    
fb30: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
fb40: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
fb50: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
fb60: 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79   symbol *sp = Sy
fb70: 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
fb80: 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66 61       if( psp->fa
fb90: 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
fba0: 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c         psp->fall
fbb0: 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20 20 20 20  back = sp;.     
fbc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d     }else if( sp-
fbd0: 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  >fallback ){.   
fbe0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
fbf0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
fc00: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
fc10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4d 6f  .            "Mo
fc20: 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 61 6c 6c  re than one fall
fc30: 62 61 63 6b 20 61 73 73 69 67 6e 65 64 20 74 6f  back assigned to
fc40: 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78 29 3b 0a   token %s", x);.
fc50: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
fc60: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
fc70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc80: 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b      sp->fallback
fc90: 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b   = psp->fallback
fca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
fcb0: 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63  >gp->has_fallbac
fcc0: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  k = 1;.        }
fcd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
fce0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
fcf0: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
fd00: 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20  _ERROR:./*      
fd10: 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20  if( x[0]=='.' ) 
fd20: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
fd30: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
fd40: 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62  _RULE;.**      b
fd50: 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73  reak; */.    cas
fd60: 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  e RESYNC_AFTER_D
fd70: 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20  ECL_ERROR:.     
fd80: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
fd90: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
fda0: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
fdb0: 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69 66  R_RULE;.      if
fdc0: 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73  ( x[0]=='%' ) ps
fdd0: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
fde0: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
fdf0: 4f 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ORD;.      break
fe00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73  ;.  }.}../* In s
fe10: 70 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d 65  pite of its name
fe20: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
fe30: 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6e  is really a scan
fe40: 6e 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a  ner.  It read.**
fe50: 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69   in the entire i
fe60: 6e 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20 61  nput file (all a
fe70: 74 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b  t once) then tok
fe80: 65 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63 68  enizes it.  Each
fe90: 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61 73  .** token is pas
fea0: 73 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63 74  sed to the funct
feb0: 69 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b  ion "parseonetok
fec0: 65 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64 73  en" which builds
fed0: 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72   all.** the appr
fee0: 6f 70 72 69 61 74 65 20 64 61 74 61 20 73 74 72  opriate data str
fef0: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 67  uctures in the g
ff00: 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74  lobal state vect
ff10: 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64  or "gp"..*/.void
ff20: 20 50 61 72 73 65 28 67 70 29 0a 73 74 72 75 63   Parse(gp).struc
ff30: 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 0a 7b 0a 20  t lemon *gp;.{. 
ff40: 20 73 74 72 75 63 74 20 70 73 74 61 74 65 20 70   struct pstate p
ff50: 73 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20  s;.  FILE *fp;. 
ff60: 20 63 68 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a   char *filebuf;.
ff70: 20 20 69 6e 74 20 66 69 6c 65 73 69 7a 65 3b 0a    int filesize;.
ff80: 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20    int lineno;.  
ff90: 69 6e 74 20 63 3b 0a 20 20 63 68 61 72 20 2a 63  int c;.  char *c
ffa0: 70 2c 20 2a 6e 65 78 74 63 70 3b 0a 20 20 69 6e  p, *nextcp;.  in
ffb0: 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b  t startline = 0;
ffc0: 0a 0a 20 20 70 73 2e 67 70 20 3d 20 67 70 3b 0a  ..  ps.gp = gp;.
ffd0: 20 20 70 73 2e 66 69 6c 65 6e 61 6d 65 20 3d 20    ps.filename = 
ffe0: 67 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 0a 20 20  gp->filename;.  
fff0: 70 73 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b  ps.errorcnt = 0;
10000 0a 20 20 70 73 2e 73 74 61 74 65 20 3d 20 49 4e  .  ps.state = IN
10010 49 54 49 41 4c 49 5a 45 3b 0a 0a 20 20 2f 2a 20  ITIALIZE;..  /* 
10020 42 65 67 69 6e 20 62 79 20 72 65 61 64 69 6e 67  Begin by reading
10030 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
10040 2a 2f 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28  */.  fp = fopen(
10050 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 22 72 62 22  ps.filename,"rb"
10060 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29  );.  if( fp==0 )
10070 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70  {.    ErrorMsg(p
10080 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61  s.filename,0,"Ca
10090 6e 27 74 20 6f 70 65 6e 20 74 68 69 73 20 66 69  n't open this fi
100a0 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 22  le for reading."
100b0 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72  );.    gp->error
100c0 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
100d0 6e 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66  n;.  }.  fseek(f
100e0 70 2c 30 2c 32 29 3b 0a 20 20 66 69 6c 65 73 69  p,0,2);.  filesi
100f0 7a 65 20 3d 20 66 74 65 6c 6c 28 66 70 29 3b 0a  ze = ftell(fp);.
10100 20 20 72 65 77 69 6e 64 28 66 70 29 3b 0a 20 20    rewind(fp);.  
10110 66 69 6c 65 62 75 66 20 3d 20 28 63 68 61 72 20  filebuf = (char 
10120 2a 29 6d 61 6c 6c 6f 63 28 20 66 69 6c 65 73 69  *)malloc( filesi
10130 7a 65 2b 31 20 29 3b 0a 20 20 69 66 28 20 66 69  ze+1 );.  if( fi
10140 6c 65 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20  lebuf==0 ){.    
10150 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
10160 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 61 6c  name,0,"Can't al
10170 6c 6f 63 61 74 65 20 25 64 20 6f 66 20 6d 65 6d  locate %d of mem
10180 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 69 73  ory to hold this
10190 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66   file.",.      f
101a0 69 6c 65 73 69 7a 65 2b 31 29 3b 0a 20 20 20 20  ilesize+1);.    
101b0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
101c0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
101d0 20 20 69 66 28 20 66 72 65 61 64 28 66 69 6c 65    if( fread(file
101e0 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66  buf,1,filesize,f
101f0 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a  p)!=filesize ){.
10200 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
10210 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27  filename,0,"Can'
10220 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20 25 64  t read in all %d
10230 20 62 79 74 65 73 20 6f 66 20 74 68 69 73 20 66   bytes of this f
10240 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c  ile.",.      fil
10250 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72 65 65  esize);.    free
10260 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20 20 67  (filebuf);.    g
10270 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
10280 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
10290 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66   fclose(fp);.  f
102a0 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d  ilebuf[filesize]
102b0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20   = 0;..  /* Now 
102c0 73 63 61 6e 20 74 68 65 20 74 65 78 74 20 6f 66  scan the text of
102d0 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
102e0 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b  */.  lineno = 1;
102f0 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65 62 75  .  for(cp=filebu
10300 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20  f; (c= *cp)!=0; 
10310 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  ){.    if( c=='\
10320 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20  n' ) lineno++;  
10330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
10340 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
10350 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
10360 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
10370 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74  c) ){ cp++; cont
10380 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70  inue; }  /* Skip
10390 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61 63 65   all white space
103a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   */.    if( c=='
103b0 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27  /' && cp[1]=='/'
103c0 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
103d0 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
103e0 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
103f0 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68   cp+=2;.      wh
10400 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
10410 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70   && c!='\n' ) cp
10420 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ++;.      contin
10430 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
10440 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
10450 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20 20 20  ]=='*' ){       
10460 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73 74 79     /* Skip C sty
10470 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20  le comments */. 
10480 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20       cp+=2;.    
10490 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
104a0 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20  )!=0 && (c!='/' 
104b0 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20  || cp[-1]!='*') 
104c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
104d0 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
104e0 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b  +;.        cp++;
104f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10500 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20  f( c ) cp++;.   
10510 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
10520 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73   }.    ps.tokens
10530 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20 20 20  tart = cp;      
10540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72            /* Mar
10550 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  k the beginning 
10560 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  of the token */.
10570 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65      ps.tokenline
10580 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20  no = lineno;    
10590 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75         /* Linenu
105a0 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74 6f  mber on which to
105b0 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ken begins */.  
105c0 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b    if( c=='\"' ){
105d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105e0 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c       /* String l
105f0 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20  iterals */.     
10600 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69   cp++;.      whi
10610 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
10620 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20  && c!='\"' ){.  
10630 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
10640 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
10650 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
10660 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
10670 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
10680 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
10690 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53  me,startline,."S
106a0 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67 20 6f  tring starting o
106b0 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
106c0 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65  ot terminated be
106d0 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20  fore the end of 
106e0 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20  the file.");.   
106f0 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74       ps.errorcnt
10700 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  ++;.        next
10710 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d  cp = cp;.      }
10720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65  else{.        ne
10730 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20  xtcp = cp+1;.   
10740 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
10750 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20  f( c=='{' ){    
10760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
10770 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65 20  block of C code 
10780 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 76  */.      int lev
10790 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a  el;.      cp++;.
107a0 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d        for(level=
107b0 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  1; (c= *cp)!=0 &
107c0 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21  & (level>1 || c!
107d0 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20  ='}'); cp++){.  
107e0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
107f0 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
10800 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
10810 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b  =='{' ) level++;
10820 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
10830 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c  ( c=='}' ) level
10840 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  --;.        else
10850 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
10860 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a  p[1]=='*' ){  /*
10870 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a   Skip comments *
10880 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
10890 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20  prevc;.         
108a0 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20   cp = &cp[2];.  
108b0 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
108c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  0;.          whi
108d0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
108e0 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72  && (c!='/' || pr
108f0 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20  evc!='*') ){.   
10900 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
10910 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
10920 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65  .            pre
10930 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  vc = c;.        
10940 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d 0a 09      cp++;..  }..
10950 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27  }else if( c=='/'
10960 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29   && cp[1]=='/' )
10970 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73  {  /* Skip C++ s
10980 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74 6f  tyle comments to
10990 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63  o */.          c
109a0 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20  p = &cp[2];.    
109b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
109c0 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
109d0 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  \n' ) cp++;.    
109e0 20 20 20 20 20 20 69 66 28 20 63 20 29 20 6c 69        if( c ) li
109f0 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69  neno++;..}else i
10a00 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  f( c=='\'' || c=
10a10 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53  ='\"' ){    /* S
10a20 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74 65  tring a characte
10a30 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20  r literals */.  
10a40 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61 72          int star
10a50 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20  tchar, prevc;.  
10a60 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68 61          startcha
10a70 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  r = c;.         
10a80 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
10a90 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20        for(cp++; 
10aa0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
10ab0 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20  c!=startchar || 
10ac0 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70  prevc=='\\'); cp
10ad0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
10ae0 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
10af0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
10b00 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d       if( prevc==
10b10 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30  '\\' ) prevc = 0
10b20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ;.            el
10b30 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
10b40 70 72 65 76 63 20 3d 20 63 3b 0a 09 20 20 7d 0a  prevc = c;..  }.
10b50 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .}.      }.     
10b60 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
10b70 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10b80 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b  .filename,ps.tok
10b90 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64  enlineno,."C cod
10ba0 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68  e starting on th
10bb0 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
10bc0 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65  erminated before
10bd0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
10be0 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  file.");.       
10bf0 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a   ps.errorcnt++;.
10c00 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
10c10 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   cp;.      }else
10c20 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  {.        nextcp
10c30 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d   = cp+1;.      }
10c40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
10c50 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20 20 20  salnum(c) ){    
10c60 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66        /* Identif
10c70 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68  iers */.      wh
10c80 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
10c90 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63 29 20   && (isalnum(c) 
10ca0 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b  || c=='_') ) cp+
10cb0 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
10cc0 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = cp;.    }else 
10cd0 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70  if( c==':' && cp
10ce0 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32  [1]==':' && cp[2
10cf0 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65  ]=='=' ){ /* The
10d00 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20   operator "::=" 
10d10 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33  */.      cp += 3
10d20 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
10d30 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20   cp;.    }else{ 
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
10d60 6f 74 68 65 72 20 28 6f 6e 65 20 63 68 61 72 61  other (one chara
10d70 63 74 65 72 29 20 6f 70 65 72 61 74 6f 72 73 20  cter) operators 
10d80 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  */.      cp++;. 
10d90 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
10da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20  ;.    }.    c = 
10db0 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30  *cp;.    *cp = 0
10dc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c           /* Null
10de0 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74   terminate the t
10df0 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73  oken */.    pars
10e00 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20  eonetoken(&ps); 
10e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
10e20 61 72 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a  arse the token *
10e30 2f 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 20 20  /.    *cp = c;  
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65        /* Restore
10e60 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20   the buffer */. 
10e70 20 20 20 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a     cp = nextcp;.
10e80 20 20 7d 0a 20 20 66 72 65 65 28 66 69 6c 65 62    }.  free(fileb
10e90 75 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  uf);            
10ea0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61          /* Relea
10eb0 73 65 20 74 68 65 20 62 75 66 66 65 72 20 61 66  se the buffer af
10ec0 74 65 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20  ter parsing */. 
10ed0 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66   gp->rule = ps.f
10ee0 69 72 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e  irstrule;.  gp->
10ef0 65 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72  errorcnt = ps.er
10f00 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  rorcnt;.}./*****
10f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f20 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
10f30 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a  file "plink.c" *
10f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f50 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
10f60 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20  ines processing 
10f70 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f  configuration fo
10f80 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
10f90 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e  tion links.** in
10fa0 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
10fb0 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
10fc0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 70 6c  static struct pl
10fd0 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c  ink *plink_freel
10fe0 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c  ist = 0;../* All
10ff0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 6c 69 6e  ocate a new plin
11000 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e  k */.struct plin
11010 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 29 7b 0a  k *Plink_new(){.
11020 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
11030 6e 65 77 3b 0a 0a 20 20 69 66 28 20 70 6c 69 6e  new;..  if( plin
11040 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  k_freelist==0 ){
11050 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
11060 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20  int amt = 100;. 
11070 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
11080 74 20 3d 20 28 73 74 72 75 63 74 20 70 6c 69 6e  t = (struct plin
11090 6b 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  k *)malloc( size
110a0 6f 66 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 29  of(struct plink)
110b0 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69 66 28 20  *amt );.    if( 
110c0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d  plink_freelist==
110d0 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
110e0 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
110f0 20 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f   "Unable to allo
11100 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
11110 61 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d 73 65 74  a new follow-set
11120 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
11130 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  k.\n");.      ex
11140 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
11150 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d   for(i=0; i<amt-
11160 31 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72  1; i++) plink_fr
11170 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d  eelist[i].next =
11180 20 26 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74   &plink_freelist
11190 5b 69 2b 31 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b  [i+1];.    plink
111a0 5f 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d  _freelist[amt-1]
111b0 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  .next = 0;.  }. 
111c0 20 6e 65 77 20 3d 20 70 6c 69 6e 6b 5f 66 72 65   new = plink_fre
111d0 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66  elist;.  plink_f
111e0 72 65 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f  reelist = plink_
111f0 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
11200 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a    return new;.}.
11210 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b 20  ./* Add a plink 
11220 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74 20  to a plink list 
11230 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64  */.void Plink_ad
11240 64 28 70 6c 70 70 2c 63 66 70 29 0a 73 74 72 75  d(plpp,cfp).stru
11250 63 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c 70 70 3b  ct plink **plpp;
11260 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
11270 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  cfp;.{.  struct 
11280 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 20 20 6e 65  plink *new;.  ne
11290 77 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b  w = Plink_new();
112a0 0a 20 20 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 2a  .  new->next = *
112b0 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70 20 3d 20  plpp;.  *plpp = 
112c0 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e 63 66 70 20  new;.  new->cfp 
112d0 3d 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61  = cfp;.}../* Tra
112e0 6e 73 66 65 72 20 65 76 65 72 79 20 70 6c 69 6e  nsfer every plin
112f0 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 22 66  k on the list "f
11300 72 6f 6d 22 20 74 6f 20 74 68 65 20 6c 69 73 74  rom" to the list
11310 20 22 74 6f 22 20 2a 2f 0a 76 6f 69 64 20 50 6c   "to" */.void Pl
11320 69 6e 6b 5f 63 6f 70 79 28 74 6f 2c 66 72 6f 6d  ink_copy(to,from
11330 29 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  ).struct plink *
11340 2a 74 6f 3b 0a 73 74 72 75 63 74 20 70 6c 69 6e  *to;.struct plin
11350 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a 20 20 73 74 72  k *from;.{.  str
11360 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70  uct plink *nextp
11370 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66 72 6f 6d  l;.  while( from
11380 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d   ){.    nextpl =
11390 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20   from->next;.   
113a0 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74   from->next = *t
113b0 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66 72 6f  o;.    *to = fro
113c0 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20 6e 65  m;.    from = ne
113d0 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  xtpl;.  }.}../* 
113e0 44 65 6c 65 74 65 20 65 76 65 72 79 20 70 6c 69  Delete every pli
113f0 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a  nk on the list *
11400 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c  /.void Plink_del
11410 65 74 65 28 70 6c 70 29 0a 73 74 72 75 63 74 20  ete(plp).struct 
11420 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 7b 0a 20 20  plink *plp;.{.  
11430 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
11440 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20  xtpl;..  while( 
11450 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  plp ){.    nextp
11460 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  l = plp->next;. 
11470 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70     plp->next = p
11480 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20  link_freelist;. 
11490 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
114a0 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70  t = plp;.    plp
114b0 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
114c0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
114d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
114e0 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e  he file "report.
114f0 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
11500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
11510 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20  *.** Procedures 
11520 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72  for generating r
11530 65 70 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65  eports and table
11540 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
11550 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
11560 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .*/../* Generate
11570 20 61 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68   a filename with
11580 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69   the given suffi
11590 78 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  x.  Space to hol
115a0 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f  d the.** name co
115b0 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  mes from malloc(
115c0 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
115d0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
115e0 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
115f0 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20  */.PRIVATE char 
11600 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c  *file_makename(l
11610 65 6d 70 2c 73 75 66 66 69 78 29 0a 73 74 72 75  emp,suffix).stru
11620 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
11630 63 68 61 72 20 2a 73 75 66 66 69 78 3b 0a 7b 0a  char *suffix;.{.
11640 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20    char *name;.  
11650 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 6e 61 6d  char *cp;..  nam
11660 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 74 72 6c  e = malloc( strl
11670 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  en(lemp->filenam
11680 65 29 20 2b 20 73 74 72 6c 65 6e 28 73 75 66 66  e) + strlen(suff
11690 69 78 29 20 2b 20 35 20 29 3b 0a 20 20 69 66 28  ix) + 5 );.  if(
116a0 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20   name==0 ){.    
116b0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
116c0 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 73  Can't allocate s
116d0 70 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65 6e  pace for a filen
116e0 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  ame.\n");.    ex
116f0 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74 72  it(1);.  }.  str
11700 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66  cpy(name,lemp->f
11710 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20 3d  ilename);.  cp =
11720 20 73 74 72 72 63 68 72 28 6e 61 6d 65 2c 27 2e   strrchr(name,'.
11730 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 20 2a  ');.  if( cp ) *
11740 63 70 20 3d 20 30 3b 0a 20 20 73 74 72 63 61 74  cp = 0;.  strcat
11750 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a 20  (name,suffix);. 
11760 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a   return name;.}.
11770 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  ./* Open a file 
11780 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73 65  with a name base
11790 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  d on the name of
117a0 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 2c   the input file,
117b0 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20 64  .** but with a d
117c0 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69 66  ifferent (specif
117d0 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e 64  ied) suffix, and
117e0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
117f0 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72 65  r.** to the stre
11800 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49  am */.PRIVATE FI
11810 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  LE *file_open(le
11820 6d 70 2c 73 75 66 66 69 78 2c 6d 6f 64 65 29 0a  mp,suffix,mode).
11830 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
11840 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69 78  mp;.char *suffix
11850 3b 0a 63 68 61 72 20 2a 6d 6f 64 65 3b 0a 7b 0a  ;.char *mode;.{.
11860 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 69    FILE *fp;..  i
11870 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  f( lemp->outname
11880 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f 75   ) free(lemp->ou
11890 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d 3e  tname);.  lemp->
118a0 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d  outname = file_m
118b0 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73 75  akename(lemp, su
118c0 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66 6f  ffix);.  fp = fo
118d0 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  pen(lemp->outnam
118e0 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20 66  e,mode);.  if( f
118f0 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d 27  p==0 && *mode=='
11900 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  w' ){.    fprint
11910 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
11920 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c 22  open file \"%s\"
11930 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  .\n",lemp->outna
11940 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  me);.    lemp->e
11950 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
11960 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
11970 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20  eturn fp;.}../* 
11980 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 69 6e  Duplicate the in
11990 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f 75 74  put file without
119a0 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77 69   comments and wi
119b0 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20 0a 2a  thout actions .*
119c0 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76 6f  * on rules */.vo
119d0 69 64 20 52 65 70 72 69 6e 74 28 6c 65 6d 70 29  id Reprint(lemp)
119e0 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
119f0 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp;.{.  struct 
11a00 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75  rule *rp;.  stru
11a10 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
11a20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65   int i, j, maxle
11a30 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73  n, len, ncolumns
11a40 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66  , skip;.  printf
11a50 28 22 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66 20  ("// Reprint of 
11a60 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73 5c  input file \"%s\
11a70 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c  ".\n// Symbols:\
11a80 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  n",lemp->filenam
11a90 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31  e);.  maxlen = 1
11aa0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
11ab0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
11ac0 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  ++){.    sp = le
11ad0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
11ae0 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
11af0 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  (sp->name);.    
11b00 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29  if( len>maxlen )
11b10 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20   maxlen = len;. 
11b20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20   }.  ncolumns = 
11b30 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20  76/(maxlen+5);. 
11b40 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20   if( ncolumns<1 
11b50 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a  ) ncolumns = 1;.
11b60 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d 3e    skip = (lemp->
11b70 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d  nsymbol + ncolum
11b80 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73  ns - 1)/ncolumns
11b90 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
11ba0 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  kip; i++){.    p
11bb0 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20 20  rintf("//");.   
11bc0 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70   for(j=i; j<lemp
11bd0 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b  ->nsymbol; j+=sk
11be0 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d 20  ip){.      sp = 
11bf0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
11c00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11c10 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a  sp->index==j );.
11c20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25        printf(" %
11c30 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78  3d %-*.*s",j,max
11c40 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e  len,maxlen,sp->n
11c50 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
11c60 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  printf("\n");.  
11c70 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  }.  for(rp=lemp-
11c80 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
11c90 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72 69  ->next){.    pri
11ca0 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68 73  ntf("%s",rp->lhs
11cb0 2d 3e 6e 61 6d 65 29 3b 0a 2f 2a 20 20 20 20 69  ->name);./*    i
11cc0 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20  f( rp->lhsalias 
11cd0 29 20 70 72 69 6e 74 66 28 22 28 25 73 29 22 2c  ) printf("(%s)",
11ce0 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 20 2a  rp->lhsalias); *
11cf0 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 3a  /.    printf(" :
11d00 3a 3d 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  :=");.    for(i=
11d10 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
11d20 2b 2b 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74  ++){.      print
11d30 66 28 22 20 25 73 22 2c 72 70 2d 3e 72 68 73 5b  f(" %s",rp->rhs[
11d40 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 2f 2a 20 20 20  i]->name);./*   
11d50 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c     if( rp->rhsal
11d60 69 61 73 5b 69 5d 20 29 20 70 72 69 6e 74 66 28  ias[i] ) printf(
11d70 22 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c  "(%s)",rp->rhsal
11d80 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20  ias[i]); */.    
11d90 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e 22  }.    printf("."
11da0 29 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70  );.    if( rp->p
11db0 72 65 63 73 79 6d 20 29 20 70 72 69 6e 74 66 28  recsym ) printf(
11dc0 22 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63  " [%s]",rp->prec
11dd0 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 2f 2a 20 20  sym->name);./*  
11de0 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29    if( rp->code )
11df0 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25   printf("\n    %
11e00 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f  s",rp->code); */
11e10 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
11e20 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 43  );.  }.}..void C
11e30 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66  onfigPrint(fp,cf
11e40 70 29 0a 46 49 4c 45 20 2a 66 70 3b 0a 73 74 72  p).FILE *fp;.str
11e50 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
11e60 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
11e70 20 2a 72 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   *rp;.  int i;. 
11e80 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20   rp = cfp->rp;. 
11e90 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20   fprintf(fp,"%s 
11ea0 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  ::=",rp->lhs->na
11eb0 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  me);.  for(i=0; 
11ec0 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b  i<=rp->nrhs; i++
11ed0 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66  ){.    if( i==cf
11ee0 70 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66  p->dot ) fprintf
11ef0 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69  (fp," *");.    i
11f00 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29  f( i==rp->nrhs )
11f10 20 62 72 65 61 6b 3b 0a 20 20 20 20 66 70 72 69   break;.    fpri
11f20 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 72 70 2d  ntf(fp," %s",rp-
11f30 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a  >rhs[i]->name);.
11f40 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e    }.}../* #defin
11f50 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 64 65 66  e TEST */.#ifdef
11f60 20 54 45 53 54 0a 2f 2a 20 50 72 69 6e 74 20 61   TEST./* Print a
11f70 20 73 65 74 20 2a 2f 0a 50 52 49 56 41 54 45 20   set */.PRIVATE 
11f80 76 6f 69 64 20 53 65 74 50 72 69 6e 74 28 6f 75  void SetPrint(ou
11f90 74 2c 73 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45  t,set,lemp).FILE
11fa0 20 2a 6f 75 74 3b 0a 63 68 61 72 20 2a 73 65 74   *out;.char *set
11fb0 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ;.struct lemon *
11fc0 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp;.{.  int i;
11fd0 0a 20 20 63 68 61 72 20 2a 73 70 61 63 65 72 3b  .  char *spacer;
11fe0 0a 20 20 73 70 61 63 65 72 20 3d 20 22 22 3b 0a  .  spacer = "";.
11ff0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
12000 31 32 73 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72  12s[","");.  for
12010 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=0; i<lemp->nt
12020 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20  erminal; i++){. 
12030 20 20 20 69 66 28 20 53 65 74 46 69 6e 64 28 73     if( SetFind(s
12040 65 74 2c 69 29 20 29 7b 0a 20 20 20 20 20 20 66  et,i) ){.      f
12050 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 25 73  printf(out,"%s%s
12060 22 2c 73 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73  ",spacer,lemp->s
12070 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29  ymbols[i]->name)
12080 3b 0a 20 20 20 20 20 20 73 70 61 63 65 72 20 3d  ;.      spacer =
12090 20 22 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   " ";.    }.  }.
120a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d    fprintf(out,"]
120b0 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  \n");.}../* Prin
120c0 74 20 61 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20  t a plink chain 
120d0 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
120e0 50 6c 69 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70  PlinkPrint(out,p
120f0 6c 70 2c 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75  lp,tag).FILE *ou
12100 74 3b 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  t;.struct plink 
12110 2a 70 6c 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b  *plp;.char *tag;
12120 0a 7b 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20  .{.  while( plp 
12130 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
12140 75 74 2c 22 25 31 32 73 25 73 20 28 73 74 61 74  ut,"%12s%s (stat
12150 65 20 25 32 64 29 20 22 2c 22 22 2c 74 61 67 2c  e %2d) ","",tag,
12160 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 69  plp->cfp->stp->i
12170 6e 64 65 78 29 3b 0a 20 20 20 20 43 6f 6e 66 69  ndex);.    Confi
12180 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e  gPrint(out,plp->
12190 63 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  cfp);.    fprint
121a0 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20  f(out,"\n");.   
121b0 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74   plp = plp->next
121c0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
121d0 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69  /* Print an acti
121e0 6f 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  on to the given 
121f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
12200 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
12210 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73  f.** nothing was
12220 20 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65   actually printe
12230 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41  d..*/.int PrintA
12240 63 74 69 6f 6e 28 73 74 72 75 63 74 20 61 63 74  ction(struct act
12250 69 6f 6e 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66  ion *ap, FILE *f
12260 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a  p, int indent){.
12270 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 31    int result = 1
12280 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e  ;.  switch( ap->
12290 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
122a0 20 53 48 49 46 54 3a 0a 20 20 20 20 20 20 66 70   SHIFT:.      fp
122b0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68  rintf(fp,"%*s sh
122c0 69 66 74 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c  ift  %d",indent,
122d0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
122e0 3e 78 2e 73 74 70 2d 3e 69 6e 64 65 78 29 3b 0a  >x.stp->index);.
122f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12300 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20 20   case REDUCE:.  
12310 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
12320 25 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c 69  %*s reduce %d",i
12330 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
12340 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64  me,ap->x.rp->ind
12350 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
12360 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50  ;.    case ACCEP
12370 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
12380 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74 22  (fp,"%*s accept"
12390 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
123a0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
123b0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52  ak;.    case ERR
123c0 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  OR:.      fprint
123d0 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72 22  f(fp,"%*s error"
123e0 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
123f0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
12400 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 43 4f 4e  ak;.    case CON
12410 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72  FLICT:.      fpr
12420 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64  intf(fp,"%*s red
12430 75 63 65 20 25 2d 33 64 20 2a 2a 20 50 61 72 73  uce %-3d ** Pars
12440 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22  ing conflict **"
12450 2c 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74  ,.        indent
12460 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
12470 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a  ->x.rp->index);.
12480 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12490 20 63 61 73 65 20 53 48 5f 52 45 53 4f 4c 56 45   case SH_RESOLVE
124a0 44 3a 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52  D:.    case RD_R
124b0 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73  ESOLVED:.    cas
124c0 65 20 4e 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20  e NOT_USED:.    
124d0 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20    result = 0;.  
124e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
124f0 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a   return result;.
12500 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  }../* Generate t
12510 68 65 20 22 79 2e 6f 75 74 70 75 74 22 20 6c 6f  he "y.output" lo
12520 67 20 66 69 6c 65 20 2a 2f 0a 76 6f 69 64 20 52  g file */.void R
12530 65 70 6f 72 74 4f 75 74 70 75 74 28 6c 65 6d 70  eportOutput(lemp
12540 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
12550 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp;.{.  int i;
12560 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
12570 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63  *stp;.  struct c
12580 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74  onfig *cfp;.  st
12590 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
125a0 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20  .  FILE *fp;..  
125b0 66 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  fp = file_open(l
125c0 65 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 22 29 3b  emp,".out","w");
125d0 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72  .  if( fp==0 ) r
125e0 65 74 75 72 6e 3b 0a 20 20 66 70 72 69 6e 74 66  eturn;.  fprintf
125f0 28 66 70 2c 22 20 5c 62 22 29 3b 0a 20 20 66 6f  (fp," \b");.  fo
12600 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
12610 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
12620 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
12630 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69  ted[i];.    fpri
12640 6e 74 66 28 66 70 2c 22 53 74 61 74 65 20 25 64  ntf(fp,"State %d
12650 3a 5c 6e 22 2c 73 74 70 2d 3e 69 6e 64 65 78 29  :\n",stp->index)
12660 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ;.    if( lemp->
12670 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d  basisflag ) cfp=
12680 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73  stp->bp;.    els
12690 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
126a0 20 20 20 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b     cfp=stp->cfp;
126b0 0a 20 20 20 20 77 68 69 6c 65 28 20 63 66 70 20  .    while( cfp 
126c0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 62 75  ){.      char bu
126d0 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69 66 28  f[20];.      if(
126e0 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e   cfp->dot==cfp->
126f0 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20  rp->nrhs ){.    
12700 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c      sprintf(buf,
12710 22 28 25 64 29 22 2c 63 66 70 2d 3e 72 70 2d 3e  "(%d)",cfp->rp->
12720 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
12730 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20  fprintf(fp,"    
12740 25 35 73 20 22 2c 62 75 66 29 3b 0a 20 20 20 20  %5s ",buf);.    
12750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12760 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20   fprintf(fp,"   
12770 20 20 20 20 20 20 20 22 29 3b 0a 20 20 20 20 20         ");.     
12780 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66 69 67 50   }.      ConfigP
12790 72 69 6e 74 28 66 70 2c 63 66 70 29 3b 0a 20 20  rint(fp,cfp);.  
127a0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
127b0 5c 6e 22 29 3b 0a 23 69 66 64 65 66 20 54 45 53  \n");.#ifdef TES
127c0 54 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e 74  T.      SetPrint
127d0 28 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d  (fp,cfp->fws,lem
127e0 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50  p);.      PlinkP
127f0 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c  rint(fp,cfp->fpl
12800 70 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20  p,"To  ");.     
12810 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63   PlinkPrint(fp,c
12820 66 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29  fp->bplp,"From")
12830 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
12840 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c  f( lemp->basisfl
12850 61 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70  ag ) cfp=cfp->bp
12860 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20 20  ;.      else    
12870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66                cf
12880 70 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  p=cfp->next;.   
12890 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
128a0 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  p,"\n");.    for
128b0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
128c0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
128d0 20 20 20 20 20 69 66 28 20 50 72 69 6e 74 41 63       if( PrintAc
128e0 74 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29  tion(ap,fp,30) )
128f0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
12900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
12910 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
12920 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b   }.  fclose(fp);
12930 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
12940 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
12950 66 69 6c 65 20 22 6e 61 6d 65 22 20 77 68 69 63  file "name" whic
12960 68 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65  h is in the same
12970 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a   directory as.**
12980 20 74 68 65 20 65 78 61 63 75 74 61 62 6c 65 20   the exacutable 
12990 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20  */.PRIVATE char 
129a0 2a 70 61 74 68 73 65 61 72 63 68 28 61 72 67 76  *pathsearch(argv
129b0 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d 61 73 6b 29  0,name,modemask)
129c0 0a 63 68 61 72 20 2a 61 72 67 76 30 3b 0a 63 68  .char *argv0;.ch
129d0 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e 74 20 6d 6f  ar *name;.int mo
129e0 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20 63 68 61 72  demask;.{.  char
129f0 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20 20 63 68   *pathlist;.  ch
12a00 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b 0a 20 20  ar *path,*cp;.  
12a10 63 68 61 72 20 63 3b 0a 20 20 65 78 74 65 72 6e  char c;.  extern
12a20 20 69 6e 74 20 61 63 63 65 73 73 28 29 3b 0a 0a   int access();..
12a30 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f  #ifdef __WIN32__
12a40 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
12a50 61 72 67 76 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c  argv0,'\\');.#el
12a60 73 65 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  se.  cp = strrch
12a70 72 28 61 72 67 76 30 2c 27 2f 27 29 3b 0a 23 65  r(argv0,'/');.#e
12a80 6e 64 69 66 0a 20 20 69 66 28 20 63 70 20 29 7b  ndif.  if( cp ){
12a90 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20  .    c = *cp;.  
12aa0 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 70    *cp = 0;.    p
12ab0 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  ath = (char *)ma
12ac0 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 61 72 67  lloc( strlen(arg
12ad0 76 30 29 20 2b 20 73 74 72 6c 65 6e 28 6e 61 6d  v0) + strlen(nam
12ae0 65 29 20 2b 20 32 20 29 3b 0a 20 20 20 20 69 66  e) + 2 );.    if
12af0 28 20 70 61 74 68 20 29 20 73 70 72 69 6e 74 66  ( path ) sprintf
12b00 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 61 72  (path,"%s/%s",ar
12b10 67 76 30 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 2a  gv0,name);.    *
12b20 63 70 20 3d 20 63 3b 0a 20 20 7d 65 6c 73 65 7b  cp = c;.  }else{
12b30 0a 20 20 20 20 65 78 74 65 72 6e 20 63 68 61 72  .    extern char
12b40 20 2a 67 65 74 65 6e 76 28 29 3b 0a 20 20 20 20   *getenv();.    
12b50 70 61 74 68 6c 69 73 74 20 3d 20 67 65 74 65 6e  pathlist = geten
12b60 76 28 22 50 41 54 48 22 29 3b 0a 20 20 20 20 69  v("PATH");.    i
12b70 66 28 20 70 61 74 68 6c 69 73 74 3d 3d 30 20 29  f( pathlist==0 )
12b80 20 70 61 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f   pathlist = ".:/
12b90 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20  bin:/usr/bin";. 
12ba0 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20     path = (char 
12bb0 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e  *)malloc( strlen
12bc0 28 70 61 74 68 6c 69 73 74 29 2b 73 74 72 6c 65  (pathlist)+strle
12bd0 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20 20  n(name)+2 );.   
12be0 20 69 66 28 20 70 61 74 68 21 3d 30 20 29 7b 0a   if( path!=0 ){.
12bf0 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70 61        while( *pa
12c00 74 68 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  thlist ){.      
12c10 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 70 61    cp = strchr(pa
12c20 74 68 6c 69 73 74 2c 27 3a 27 29 3b 0a 20 20 20  thlist,':');.   
12c30 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29       if( cp==0 )
12c40 20 63 70 20 3d 20 26 70 61 74 68 6c 69 73 74 5b   cp = &pathlist[
12c50 73 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29  strlen(pathlist)
12c60 5d 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 2a  ];.        c = *
12c70 63 70 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20  cp;.        *cp 
12c80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 70 72  = 0;.        spr
12c90 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73  intf(path,"%s/%s
12ca0 22 2c 70 61 74 68 6c 69 73 74 2c 6e 61 6d 65 29  ",pathlist,name)
12cb0 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20  ;.        *cp = 
12cc0 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  c;.        if( c
12cd0 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d  ==0 ) pathlist =
12ce0 20 22 22 3b 0a 20 20 20 20 20 20 20 20 65 6c 73   "";.        els
12cf0 65 20 70 61 74 68 6c 69 73 74 20 3d 20 26 63 70  e pathlist = &cp
12d00 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [1];.        if(
12d10 20 61 63 63 65 73 73 28 70 61 74 68 2c 6d 6f 64   access(path,mod
12d20 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62 72 65 61  emask)==0 ) brea
12d30 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
12d40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 61  .  }.  return pa
12d50 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20  th;.}../* Given 
12d60 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d 70 75  an action, compu
12d70 74 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  te the integer v
12d80 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20 61 63  alue for that ac
12d90 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 69 73  tion.** which is
12da0 20 74 6f 20 62 65 20 70 75 74 20 69 6e 20 74 68   to be put in th
12db0 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f  e action table o
12dc0 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
12dd0 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65 74 75  machine..** Retu
12de0 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20 6e  rn negative if n
12df0 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  o action should 
12e00 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f  be generated..*/
12e10 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6d  .PRIVATE int com
12e20 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
12e30 2c 61 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  ,ap).struct lemo
12e40 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72 75 63 74 20  n *lemp;.struct 
12e50 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20  action *ap;.{.  
12e60 69 6e 74 20 61 63 74 3b 0a 20 20 73 77 69 74 63  int act;.  switc
12e70 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20  h( ap->type ){. 
12e80 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 20 20     case SHIFT:  
12e90 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74 70 2d  act = ap->x.stp-
12ea0 3e 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  >index;         
12eb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12ec0 20 63 61 73 65 20 52 45 44 55 43 45 3a 20 61 63   case REDUCE: ac
12ed0 74 20 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e  t = ap->x.rp->in
12ee0 64 65 78 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61  dex + lemp->nsta
12ef0 74 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  te; break;.    c
12f00 61 73 65 20 45 52 52 4f 52 3a 20 20 61 63 74 20  ase ERROR:  act 
12f10 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b  = lemp->nstate +
12f20 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20 20   lemp->nrule;   
12f30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12f40 65 20 41 43 43 45 50 54 3a 20 61 63 74 20 3d 20  e ACCEPT: act = 
12f50 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c  lemp->nstate + l
12f60 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 31 3b 20  emp->nrule + 1; 
12f70 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
12f80 6c 74 3a 20 20 20 20 20 61 63 74 20 3d 20 2d 31  lt:     act = -1
12f90 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ; break;.  }.  r
12fa0 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64  eturn act;.}..#d
12fb0 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a 45 20 31  efine LINESIZE 1
12fc0 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20  000./* The next 
12fd0 63 6c 75 73 74 65 72 20 6f 66 20 72 6f 75 74 69  cluster of routi
12fe0 6e 65 73 20 61 72 65 20 66 6f 72 20 72 65 61 64  nes are for read
12ff0 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65  ing the template
13000 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 77 72 69   file.** and wri
13010 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ting the results
13020 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65   to the generate
13030 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f 2a 20 54  d parser */./* T
13040 68 65 20 66 69 72 73 74 20 66 75 6e 63 74 69 6f  he first functio
13050 6e 20 74 72 61 6e 73 66 65 72 73 20 64 61 74 61  n transfers data
13060 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f 20 22 6f   from "in" to "o
13070 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c  ut" until.** a l
13080 69 6e 65 20 69 73 20 73 65 65 6e 20 77 68 69 63  ine is seen whic
13090 68 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 25  h begins with "%
130a0 25 22 2e 20 20 54 68 65 20 6c 69 6e 65 20 6e 75  %".  The line nu
130b0 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72 61 63 6b  mber is.** track
130c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d  ed..**.** if nam
130d0 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e 79 20 77  e!=0, then any w
130e0 6f 72 64 20 74 68 61 74 20 62 65 67 69 6e 20 77  ord that begin w
130f0 69 74 68 20 22 50 61 72 73 65 22 20 69 73 20 63  ith "Parse" is c
13100 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20 62 65 67  hanged to.** beg
13110 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65 20 69 6e  in with *name in
13120 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49 56 41 54  stead..*/.PRIVAT
13130 45 20 76 6f 69 64 20 74 70 6c 74 5f 78 66 65 72  E void tplt_xfer
13140 28 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 6c 69 6e  (name,in,out,lin
13150 65 6e 6f 29 0a 63 68 61 72 20 2a 6e 61 6d 65 3b  eno).char *name;
13160 0a 46 49 4c 45 20 2a 69 6e 3b 0a 46 49 4c 45 20  .FILE *in;.FILE 
13170 2a 6f 75 74 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e  *out;.int *linen
13180 6f 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53  o;.{.  int i, iS
13190 74 61 72 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e  tart;.  char lin
131a0 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77  e[LINESIZE];.  w
131b0 68 69 6c 65 28 20 66 67 65 74 73 28 6c 69 6e 65  hile( fgets(line
131c0 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26  ,LINESIZE,in) &&
131d0 20 28 6c 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c   (line[0]!='%' |
131e0 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20  | line[1]!='%') 
131f0 29 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29  ){.    (*lineno)
13200 2b 2b 3b 0a 20 20 20 20 69 53 74 61 72 74 20 3d  ++;.    iStart =
13210 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d 65   0;.    if( name
13220 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
13230 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29  0; line[i]; i++)
13240 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 69  {.        if( li
13250 6e 65 5b 69 5d 3d 3d 27 50 27 20 26 26 20 73 74  ne[i]=='P' && st
13260 72 6e 63 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22  rncmp(&line[i],"
13270 50 61 72 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20  Parse",5)==0.   
13280 20 20 20 20 20 20 20 26 26 20 28 69 3d 3d 30 20         && (i==0 
13290 7c 7c 20 21 69 73 61 6c 70 68 61 28 6c 69 6e 65  || !isalpha(line
132a0 5b 69 2d 31 5d 29 29 0a 20 20 20 20 20 20 20 20  [i-1])).        
132b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
132c0 20 69 3e 69 53 74 61 72 74 20 29 20 66 70 72 69   i>iStart ) fpri
132d0 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69  ntf(out,"%.*s",i
132e0 2d 69 53 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53  -iStart,&line[iS
132f0 74 61 72 74 5d 29 3b 0a 20 20 20 20 20 20 20 20  tart]);.        
13300 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
13310 73 22 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s",name);.      
13320 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
13330 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
13340 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
13350 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13360 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22  fprintf(out,"%s"
13370 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b  ,&line[iStart]);
13380 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e  .  }.}../* The n
13390 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  ext function fin
133a0 64 73 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  ds the template 
133b0 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 73 20 69  file and opens i
133c0 74 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  t, returning.** 
133d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
133e0 20 6f 70 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f   opened file. */
133f0 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 74  .PRIVATE FILE *t
13400 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 0a 73  plt_open(lemp).s
13410 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
13420 70 3b 0a 7b 0a 20 20 73 74 61 74 69 63 20 63 68  p;.{.  static ch
13430 61 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 5b  ar templatename[
13440 5d 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22 3b 0a  ] = "lempar.c";.
13450 20 20 63 68 61 72 20 62 75 66 5b 31 30 30 30 5d    char buf[1000]
13460 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  ;.  FILE *in;.  
13470 63 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a  char *tpltname;.
13480 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 63    char *cp;..  c
13490 70 20 3d 20 73 74 72 72 63 68 72 28 6c 65 6d 70  p = strrchr(lemp
134a0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b  ->filename,'.');
134b0 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20  .  if( cp ){.   
134c0 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25 2e   sprintf(buf,"%.
134d0 2a 73 2e 6c 74 22 2c 28 75 6e 73 69 67 6e 65 64  *s.lt",(unsigned
134e0 20 6c 6f 6e 67 29 63 70 2d 28 75 6e 73 69 67 6e   long)cp-(unsign
134f0 65 64 20 6c 6f 6e 67 29 6c 65 6d 70 2d 3e 66 69  ed long)lemp->fi
13500 6c 65 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c  lename,lemp->fil
13510 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
13520 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66  .    sprintf(buf
13530 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66  ,"%s.lt",lemp->f
13540 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ilename);.  }.  
13550 69 66 28 20 61 63 63 65 73 73 28 62 75 66 2c 30  if( access(buf,0
13560 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70  04)==0 ){.    tp
13570 6c 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20  ltname = buf;.  
13580 7d 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73  }else if( access
13590 28 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30  (templatename,00
135a0 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c  4)==0 ){.    tpl
135b0 74 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65  tname = template
135c0 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  name;.  }else{. 
135d0 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61     tpltname = pa
135e0 74 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61  thsearch(lemp->a
135f0 72 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d  rgv0,templatenam
13600 65 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e,0);.  }.  if( 
13610 74 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  tpltname==0 ){. 
13620 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
13630 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68  r,"Can't find th
13640 65 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20  e parser driver 
13650 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22  template file \"
13660 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65  %s\".\n",.    te
13670 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20  mplatename);.   
13680 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
13690 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  +;.    return 0;
136a0 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65  .  }.  in = fope
136b0 6e 28 74 70 6c 74 6e 61 6d 65 2c 22 72 22 29 3b  n(tpltname,"r");
136c0 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
136d0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
136e0 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
136f0 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
13700 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70   \"%s\".\n",temp
13710 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
13720 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
13730 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13740 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a   }.  return in;.
13750 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74  }../* Print a st
13760 72 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65  ring to the file
13770 20 61 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69   and keep the li
13780 6e 65 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64  nenumber up to d
13790 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ate */.PRIVATE v
137a0 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  oid tplt_print(o
137b0 75 74 2c 6c 65 6d 70 2c 73 74 72 2c 73 74 72 6c  ut,lemp,str,strl
137c0 6e 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a  n,lineno).FILE *
137d0 6f 75 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  out;.struct lemo
137e0 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73  n *lemp;.char *s
137f0 74 72 3b 0a 69 6e 74 20 73 74 72 6c 6e 3b 0a 69  tr;.int strln;.i
13800 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20  nt *lineno;.{.  
13810 69 66 28 20 73 74 72 3d 3d 30 20 29 20 72 65 74  if( str==0 ) ret
13820 75 72 6e 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  urn;.  fprintf(o
13830 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25  ut,"#line %d \"%
13840 73 5c 22 5c 6e 22 2c 73 74 72 6c 6e 2c 6c 65 6d  s\"\n",strln,lem
13850 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 28 2a  p->filename); (*
13860 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 77 68 69  lineno)++;.  whi
13870 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20 20 20  le( *str ){.    
13880 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29  if( *str=='\n' )
13890 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
138a0 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29    putc(*str,out)
138b0 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d  ;.    str++;.  }
138c0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
138d0 5c 6e 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c  \n#line %d \"%s\
138e0 22 5c 6e 22 2c 2a 6c 69 6e 65 6e 6f 2b 32 2c 6c  "\n",*lineno+2,l
138f0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 28  emp->outname); (
13900 2a 6c 69 6e 65 6e 6f 29 2b 3d 32 3b 0a 20 20 72  *lineno)+=2;.  r
13910 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
13920 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
13930 75 74 69 6e 65 20 65 6d 69 74 73 20 63 6f 64 65  utine emits code
13940 20 66 6f 72 20 74 68 65 20 64 65 73 74 72 75 63   for the destruc
13950 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  tor for the.** s
13960 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64  ymbol sp.*/.void
13970 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
13980 5f 63 6f 64 65 28 6f 75 74 2c 73 70 2c 6c 65 6d  _code(out,sp,lem
13990 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a  p,lineno).FILE *
139a0 6f 75 74 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  out;.struct symb
139b0 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c  ol *sp;.struct l
139c0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20  emon *lemp;.int 
139d0 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72  *lineno;.{. char
139e0 20 2a 63 70 3b 0a 0a 20 69 6e 74 20 6c 69 6e 65   *cp;.. int line
139f0 63 6e 74 20 3d 20 30 3b 0a 20 69 66 28 20 73 70  cnt = 0;. if( sp
13a00 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
13a10 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70   ){.   cp = lemp
13a20 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20  ->tokendest;.   
13a30 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75  if( cp==0 ) retu
13a40 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  rn;.   fprintf(o
13a50 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25  ut,"#line %d \"%
13a60 73 5c 22 5c 6e 7b 22 2c 6c 65 6d 70 2d 3e 74 6f  s\"\n{",lemp->to
13a70 6b 65 6e 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e  kendestln,lemp->
13a80 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73  filename);. }els
13a90 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75  e if( sp->destru
13aa0 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20  ctor ){.   cp = 
13ab0 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
13ac0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
13ad0 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
13ae0 6e 7b 22 2c 73 70 2d 3e 64 65 73 74 72 75 63 74  n{",sp->destruct
13af0 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  orln,lemp->filen
13b00 61 6d 65 29 3b 0a 20 7d 65 6c 73 65 20 69 66 28  ame);. }else if(
13b10 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
13b20 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  {.   cp = lemp->
13b30 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20  vardest;.   if( 
13b40 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
13b50 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
13b60 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
13b70 6e 7b 22 2c 6c 65 6d 70 2d 3e 76 61 72 64 65 73  n{",lemp->vardes
13b80 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  tln,lemp->filena
13b90 6d 65 29 3b 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a  me);. }. for(; *
13ba0 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66  cp; cp++){.   if
13bb0 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70  ( *cp=='$' && cp
13bc0 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20  [1]=='$' ){.    
13bd0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79   fprintf(out,"(y
13be0 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c  ypminor->yy%d)",
13bf0 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20  sp->dtnum);.    
13c00 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74   cp++;.     cont
13c10 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66  inue;.   }.   if
13c20 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69  ( *cp=='\n' ) li
13c30 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 66 70 75 74  necnt++;.   fput
13c40 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20  c(*cp,out);. }. 
13c50 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b  (*lineno) += 3 +
13c60 20 6c 69 6e 65 63 6e 74 3b 0a 20 66 70 72 69 6e   linecnt;. fprin
13c70 74 66 28 6f 75 74 2c 22 7d 5c 6e 23 6c 69 6e 65  tf(out,"}\n#line
13c80 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c   %d \"%s\"\n",*l
13c90 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ineno,lemp->outn
13ca0 61 6d 65 29 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d  ame);. return;.}
13cb0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
13cc0 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  RUE (non-zero) i
13cd0 66 20 74 68 65 20 67 69 76 65 6e 20 73 79 6d 62  f the given symb
13ce0 6f 6c 20 68 61 73 20 61 20 64 65 73 74 72 75 63  ol has a destruc
13cf0 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f  tor..*/.int has_
13d00 64 65 73 74 72 75 63 74 6f 72 28 73 70 2c 20 6c  destructor(sp, l
13d10 65 6d 70 29 0a 73 74 72 75 63 74 20 73 79 6d 62  emp).struct symb
13d20 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c  ol *sp;.struct l
13d30 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
13d40 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20 73  int ret;.  if( s
13d50 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
13d60 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c  L ){.    ret = l
13d70 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d  emp->tokendest!=
13d80 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
13d90 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64  ret = lemp->vard
13da0 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65  est!=0 || sp->de
13db0 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d  structor!=0;.  }
13dc0 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
13dd0 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74  ../* .** Generat
13de0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
13df0 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72  cutes when the r
13e00 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75  ule "rp" is redu
13e10 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74  ced.  Write.** t
13e20 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22  he code to "out"
13e30 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e  .  Make sure lin
13e40 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d  eno stays up-to-
13e50 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  date..*/.PRIVATE
13e60 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28   void emit_code(
13e70 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65  out,rp,lemp,line
13e80 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73  no).FILE *out;.s
13e90 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
13ea0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
13eb0 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b  mp;.int *lineno;
13ec0 0a 7b 0a 20 63 68 61 72 20 2a 63 70 2c 20 2a 78  .{. char *cp, *x
13ed0 70 3b 0a 20 69 6e 74 20 6c 69 6e 65 63 6e 74 20  p;. int linecnt 
13ee0 3d 20 30 3b 0a 20 69 6e 74 20 69 3b 0a 20 63 68  = 0;. int i;. ch
13ef0 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20  ar lhsused = 0; 
13f00 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
13f10 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61  e LHS element ha
13f20 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
13f30 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53  char used[MAXRHS
13f40 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72  ];   /* True for
13f50 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e   each RHS elemen
13f60 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20  t which is used 
13f70 2a 2f 0a 0a 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.. for(i=0; i<
13f80 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75  rp->nrhs; i++) u
13f90 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 6c 68 73  sed[i] = 0;. lhs
13fa0 75 73 65 64 20 3d 20 30 3b 0a 0a 20 2f 2a 20 47  used = 0;.. /* G
13fb0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13fc0 64 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63  do the reduce ac
13fd0 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d  tion */. if( rp-
13fe0 3e 63 6f 64 65 20 29 7b 0a 20 20 20 66 70 72 69  >code ){.   fpri
13ff0 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25  ntf(out,"#line %
14000 64 20 5c 22 25 73 5c 22 5c 6e 7b 22 2c 72 70 2d  d \"%s\"\n{",rp-
14010 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65  >line,lemp->file
14020 6e 61 6d 65 29 3b 0a 20 20 20 66 6f 72 28 63 70  name);.   for(cp
14030 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20  =rp->code; *cp; 
14040 63 70 2b 2b 29 7b 0a 20 20 20 20 20 69 66 28 20  cp++){.     if( 
14050 69 73 61 6c 70 68 61 28 2a 63 70 29 20 26 26 20  isalpha(*cp) && 
14060 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c  (cp==rp->code ||
14070 20 28 21 69 73 61 6c 6e 75 6d 28 63 70 5b 2d 31   (!isalnum(cp[-1
14080 5d 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f  ]) && cp[-1]!='_
14090 27 29 29 20 29 7b 0a 20 20 20 20 20 20 20 63 68  ')) ){.       ch
140a0 61 72 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  ar saved;.      
140b0 20 66 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b   for(xp= &cp[1];
140c0 20 69 73 61 6c 6e 75 6d 28 2a 78 70 29 20 7c 7c   isalnum(*xp) ||
140d0 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29   *xp=='_'; xp++)
140e0 3b 0a 20 20 20 20 20 20 20 73 61 76 65 64 20 3d  ;.       saved =
140f0 20 2a 78 70 3b 0a 20 20 20 20 20 20 20 2a 78 70   *xp;.       *xp
14100 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 69 66 28   = 0;.       if(
14110 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26   rp->lhsalias &&
14120 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c   strcmp(cp,rp->l
14130 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20  hsalias)==0 ){. 
14140 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
14150 6f 75 74 2c 22 79 79 67 6f 74 6f 6d 69 6e 6f 72  out,"yygotominor
14160 2e 79 79 25 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e  .yy%d",rp->lhs->
14170 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  dtnum);.        
14180 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20   cp = xp;.      
14190 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a     lhsused = 1;.
141a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
141b0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
141c0 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
141d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 69 66 28  {.           if(
141e0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
141f0 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
14200 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d  ->rhsalias[i])==
14210 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
14220 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 79    fprintf(out,"y
14230 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79  ymsp[%d].minor.y
14240 79 25 64 22 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b  y%d",i-rp->nrhs+
14250 31 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 64 74  1,rp->rhs[i]->dt
14260 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  num);.          
14270 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20     cp = xp;.    
14280 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d           used[i]
14290 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
142a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
142b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
142c0 7d 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  }.       }.     
142d0 20 20 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a 20    *xp = saved;. 
142e0 20 20 20 20 7d 0a 20 20 20 20 20 69 66 28 20 2a      }.     if( *
142f0 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 63  cp=='\n' ) linec
14300 6e 74 2b 2b 3b 0a 20 20 20 20 20 66 70 75 74 63  nt++;.     fputc
14310 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 20 20 7d 20  (*cp,out);.   } 
14320 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 20  /* End loop */. 
14330 20 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33    (*lineno) += 3
14340 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20 20 20 66   + linecnt;.   f
14350 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 23  printf(out,"}\n#
14360 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e  line %d \"%s\"\n
14370 22 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e  ",*lineno,lemp->
14380 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d 20 2f 2a 20  outname);. } /* 
14390 45 6e 64 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  End if( rp->code
143a0 20 29 20 2a 2f 0a 0a 20 2f 2a 20 43 68 65 63 6b   ) */.. /* Check
143b0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
143c0 65 20 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75  e LHS has been u
143d0 73 65 64 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  sed */. if( rp->
143e0 6c 68 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73  lhsalias && !lhs
143f0 75 73 65 64 20 29 7b 0a 20 20 20 45 72 72 6f 72  used ){.   Error
14400 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
14410 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
14420 0a 20 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25  .     "Label \"%
14430 73 5c 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29  s\" for \"%s(%s)
14440 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  \" is never used
14450 2e 22 2c 0a 20 20 20 20 20 20 20 72 70 2d 3e 6c  .",.       rp->l
14460 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d  hsalias,rp->lhs-
14470 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69  >name,rp->lhsali
14480 61 73 29 3b 0a 20 20 20 6c 65 6d 70 2d 3e 65 72  as);.   lemp->er
14490 72 6f 72 63 6e 74 2b 2b 3b 0a 20 7d 0a 0a 20 2f  rorcnt++;. }.. /
144a0 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73 74 72  * Generate destr
144b0 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52  uctor code for R
144c0 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  HS symbols which
144d0 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
144e0 20 74 68 65 0a 20 2a 2a 20 72 65 64 75 63 65 20   the. ** reduce 
144f0 63 6f 64 65 20 2a 2f 0a 20 66 6f 72 28 69 3d 30  code */. for(i=0
14500 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
14510 2b 29 7b 0a 20 20 20 69 66 28 20 72 70 2d 3e 72  +){.   if( rp->r
14520 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 21 75  hsalias[i] && !u
14530 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 45  sed[i] ){.     E
14540 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
14550 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
14560 69 6e 65 2c 0a 20 20 20 20 20 20 20 22 4c 61 62  ine,.       "Lab
14570 65 6c 20 25 73 20 66 6f 72 20 5c 22 25 73 28 25  el %s for \"%s(%
14580 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73  s)\" is never us
14590 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 72 70 2d  ed.",.       rp-
145a0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d  >rhsalias[i],rp-
145b0 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70  >rhs[i]->name,rp
145c0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a  ->rhsalias[i]);.
145d0 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
145e0 63 6e 74 2b 2b 3b 0a 20 20 20 7d 65 6c 73 65 20  cnt++;.   }else 
145f0 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
14600 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 69  [i]==0 ){.     i
14610 66 28 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f  f( has_destructo
14620 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d  r(rp->rhs[i],lem
14630 70 29 20 29 7b 0a 20 20 20 20 20 20 20 66 70 72  p) ){.       fpr
14640 69 6e 74 66 28 6f 75 74 2c 22 20 20 79 79 5f 64  intf(out,"  yy_d
14650 65 73 74 72 75 63 74 6f 72 28 25 64 2c 26 79 79  estructor(%d,&yy
14660 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c  msp[%d].minor);\
14670 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 72 70  n",.          rp
14680 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c  ->rhs[i]->index,
14690 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29 3b 20 28  i-rp->nrhs+1); (
146a0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
146b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 66   }else{.       f
146c0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
146d0 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73 74 72 75      /* No destru
146e0 63 74 6f 72 20 64 65 66 69 6e 65 64 20 66 6f 72  ctor defined for
146f0 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
14700 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e     rp->rhs[i]->n
14710 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 28 2a  ame);.        (*
14720 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  lineno)++;.     
14730 7d 0a 20 20 20 7d 0a 20 7d 0a 20 72 65 74 75 72  }.   }. }. retur
14740 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  n;.}../*.** Prin
14750 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  t the definition
14760 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75 73   of the union us
14770 65 64 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ed for the parse
14780 72 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e 0a  r's data stack..
14790 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f  ** This union co
147a0 6e 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66 6f  ntains fields fo
147b0 72 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65  r every possible
147c0 20 64 61 74 61 20 74 79 70 65 20 66 6f 72 20 74   data type for t
147d0 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e  okens.** and non
147e0 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74  terminals.  In t
147f0 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63 6f  he process of co
14800 6d 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69 6e  mputing and prin
14810 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69  ting this.** uni
14820 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68 65  on, also set the
14830 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20   ".dtnum" field 
14840 6f 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e 61  of every termina
14850 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61  l and nontermina
14860 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a  l.** symbol..*/.
14870 76 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63 6b  void print_stack
14880 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c  _union(out,lemp,
14890 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 0a  plineno,mhflag).
148a0 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20  FILE *out;      
148b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
148c0 68 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d  he output stream
148d0 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e   */.struct lemon
148e0 20 2a 6c 65 6d 70 3b 20 20 20 20 20 20 20 20 20   *lemp;         
148f0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f  /* The main info
14900 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
14910 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 69 6e  his parser */.in
14920 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 20  t *plineno;     
14930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
14940 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e 65  nter to the line
14950 20 6e 75 6d 62 65 72 20 2a 2f 0a 69 6e 74 20 6d   number */.int m
14960 68 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20  hflag;          
14970 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14980 66 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b  f generating mak
14990 65 68 65 61 64 65 72 73 20 6f 75 74 70 75 74 20  eheaders output 
149a0 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  */.{.  int linen
149b0 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20  o = *plineno;   
149c0 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d   /* The line num
149d0 62 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ber of the outpu
149e0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79  t */.  char **ty
149f0 70 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  pes;            
14a00 20 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65   /* A hash table
14a10 20 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f   of datatypes */
14a20 0a 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65  .  int arraysize
14a30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
14a40 53 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70  Size of the "typ
14a50 65 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  es" array */.  i
14a60 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20  nt maxdtlength; 
14a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
14a80 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e  mum length of an
14a90 79 20 22 2e 64 61 74 61 74 79 70 65 22 20 66 69  y ".datatype" fi
14aa0 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  eld. */.  char *
14ab0 73 74 64 64 74 3b 20 20 20 20 20 20 20 20 20 20  stddt;          
14ac0 20 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69      /* Standardi
14ad0 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64  zed name for a d
14ae0 61 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74  atatype */.  int
14af0 20 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20   i,j;           
14b00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
14b10 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
14b20 20 68 61 73 68 3b 20 20 20 20 20 20 20 20 20 20   hash;          
14b30 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61         /* For ha
14b40 73 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  shing the name o
14b50 66 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  f a type */.  ch
14b60 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
14b70 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
14b80 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
14b90 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14ba0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
14bb0 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63  ypes[] and alloc
14bc0 61 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20  ate stddt[] */. 
14bd0 20 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d   arraysize = lem
14be0 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a  p->nsymbol * 2;.
14bf0 20 20 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a    types = (char*
14c00 2a 29 6d 61 6c 6c 6f 63 28 20 61 72 72 61 79 73  *)malloc( arrays
14c10 69 7a 65 20 2a 20 73 69 7a 65 6f 66 28 63 68 61  ize * sizeof(cha
14c20 72 2a 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  r*) );.  for(i=0
14c30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
14c40 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30  ++) types[i] = 0
14c50 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  ;.  maxdtlength 
14c60 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  = 0;.  if( lemp-
14c70 3e 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20  >vartype ){.    
14c80 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 73 74  maxdtlength = st
14c90 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79  rlen(lemp->varty
14ca0 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  pe);.  }.  for(i
14cb0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
14cc0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  bol; i++){.    i
14cd0 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75  nt len;.    stru
14ce0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
14cf0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
14d00 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64 61  ;.    if( sp->da
14d10 74 61 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74  tatype==0 ) cont
14d20 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  inue;.    len = 
14d30 73 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74  strlen(sp->datat
14d40 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  ype);.    if( le
14d50 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29 20  n>maxdtlength ) 
14d60 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65  maxdtlength = le
14d70 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20 3d  n;.  }.  stddt =
14d80 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20   (char*)malloc( 
14d90 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20  maxdtlength*2 + 
14da0 31 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73  1 );.  if( types
14db0 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30 20  ==0 || stddt==0 
14dc0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
14dd0 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
14de0 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  mory.\n");.    e
14df0 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  xit(1);.  }..  /
14e00 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68 20 74  * Build a hash t
14e10 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65  able of datatype
14e20 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20  s. The ".dtnum" 
14e30 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79  field of each sy
14e40 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c  mbol.  ** is fil
14e50 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 20  led in with the 
14e60 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20  hash index plus 
14e70 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76  1.  A ".dtnum" v
14e80 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a  alue of 0 is.  *
14e90 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69  * used for termi
14ea0 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66  nal symbols.  If
14eb0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65   there is no %de
14ec0 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e  fault_type defin
14ed0 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69  ed then.  ** 0 i
14ee0 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74  s also used as t
14ef0 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20  he .dtnum value 
14f00 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  for nonterminals
14f10 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70   which do not sp
14f20 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74  ecify.  ** a dat
14f30 61 74 79 70 65 20 75 73 69 6e 67 20 74 68 65 20  atype using the 
14f40 25 74 79 70 65 20 64 69 72 65 63 74 69 76 65 2e  %type directive.
14f50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
14f60 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
14f70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
14f80 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
14f90 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
14fa0 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a  ;.    char *cp;.
14fb0 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70      if( sp==lemp
14fc0 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20  ->errsym ){.    
14fd0 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72    sp->dtnum = ar
14fe0 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20  raysize+1;.     
14ff0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
15000 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
15010 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c  e!=NONTERMINAL |
15020 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d  | (sp->datatype=
15030 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74  =0 && lemp->vart
15040 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  ype==0) ){.     
15050 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a   sp->dtnum = 0;.
15060 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
15070 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73      }.    cp = s
15080 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20  p->datatype;.   
15090 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20   if( cp==0 ) cp 
150a0 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b  = lemp->vartype;
150b0 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
150c0 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
150d0 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  cp) ) cp++;.    
150e0 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64  while( *cp ) std
150f0 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b  dt[j++] = *cp++;
15100 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20  .    while( j>0 
15110 26 26 20 69 73 73 70 61 63 65 28 73 74 64 64 74  && isspace(stddt
15120 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20  [j-1]) ) j--;.  
15130 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a    stddt[j] = 0;.
15140 20 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20 20      hash = 0;.  
15150 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64 74    for(j=0; stddt
15160 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  [j]; j++){.     
15170 20 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33 20   hash = hash*53 
15180 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20 20  + stddt[j];.    
15190 7d 0a 20 20 20 20 69 66 28 20 68 61 73 68 3c 30  }.    if( hash<0
151a0 20 29 20 68 61 73 68 20 3d 20 2d 68 61 73 68 3b   ) hash = -hash;
151b0 0a 20 20 20 20 68 61 73 68 20 3d 20 68 61 73 68  .    hash = hash
151c0 25 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20 20  %arraysize;.    
151d0 77 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61 73  while( types[has
151e0 68 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  h] ){.      if( 
151f0 73 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61 73  strcmp(types[has
15200 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b 0a  h],stddt)==0 ){.
15210 20 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75          sp->dtnu
15220 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20  m = hash + 1;.  
15230 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15240 20 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68 2b     }.      hash+
15250 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  +;.      if( has
15260 68 3e 3d 61 72 72 61 79 73 69 7a 65 20 29 20 68  h>=arraysize ) h
15270 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ash = 0;.    }. 
15280 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73     if( types[has
15290 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h]==0 ){.      s
152a0 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20  p->dtnum = hash 
152b0 2b 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73  + 1;.      types
152c0 5b 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29  [hash] = (char*)
152d0 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 73  malloc( strlen(s
152e0 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20  tddt)+1 );.     
152f0 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d   if( types[hash]
15300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
15310 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
15320 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
15330 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28  );.        exit(
15340 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
15350 20 20 73 74 72 63 70 79 28 74 79 70 65 73 5b 68    strcpy(types[h
15360 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20  ash],stddt);.   
15370 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69   }.  }..  /* Pri
15380 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e  nt out the defin
15390 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e  ition of YYTOKEN
153a0 54 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52  TYPE and YYMINOR
153b0 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d  TYPE */.  name =
153c0 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65   lemp->name ? le
153d0 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73  mp->name : "Pars
153e0 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a  e";.  lineno = *
153f0 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d  plineno;.  if( m
15400 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66  hflag ){ fprintf
15410 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
15420 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
15430 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  +; }.  fprintf(o
15440 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f  ut,"#define %sTO
15450 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61  KENTYPE %s\n",na
15460 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f  me,.    lemp->to
15470 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f  kentype?lemp->to
15480 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29  kentype:"void*")
15490 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ;  lineno++;.  i
154a0 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72  f( mhflag ){ fpr
154b0 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66  intf(out,"#endif
154c0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
154d0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
154e0 22 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b  "typedef union {
154f0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
15500 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
15510 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 79 79 30   %sTOKENTYPE yy0
15520 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  ;\n",name); line
15530 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  no++;.  for(i=0;
15540 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b   i<arraysize; i+
15550 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 79 70 65  +){.    if( type
15560 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  s[i]==0 ) contin
15570 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ue;.    fprintf(
15580 6f 75 74 2c 22 20 20 25 73 20 79 79 25 64 3b 5c  out,"  %s yy%d;\
15590 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29  n",types[i],i+1)
155a0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
155b0 66 72 65 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a  free(types[i]);.
155c0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
155d0 74 2c 22 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e  t,"  int yy%d;\n
155e0 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ",lemp->errsym->
155f0 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  dtnum); lineno++
15600 3b 0a 20 20 66 72 65 65 28 73 74 64 64 74 29 3b  ;.  free(stddt);
15610 0a 20 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a  .  free(types);.
15620 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d    fprintf(out,"}
15630 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22   YYMINORTYPE;\n"
15640 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a  ); lineno++;.  *
15650 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f  plineno = lineno
15660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15670 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
15680 43 20 64 61 74 61 74 79 70 65 20 61 62 6c 65 20  C datatype able 
15690 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c  to represent val
156a0 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 30  ues between.** 0
156b0 20 61 6e 64 20 4e 2c 20 69 6e 63 6c 75 73 69 76   and N, inclusiv
156c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
156d0 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75 6d  st char *minimum
156e0 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74 20 4e  _size_type(int N
156f0 29 7b 0a 20 20 69 66 28 20 4e 3c 3d 32 35 35 20  ){.  if( N<=255 
15700 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 75  ){.    return "u
15710 6e 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20  nsigned char";. 
15720 20 7d 65 6c 73 65 20 69 66 28 20 4e 3c 36 35 35   }else if( N<655
15730 33 35 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  35 ){.    return
15740 20 22 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74   "unsigned short
15750 20 69 6e 74 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a   int";.  }else{.
15760 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69      return "unsi
15770 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 7d 0a 7d  gned int";.  }.}
15780 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 43 20  ../* Generate C 
15790 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20  source code for 
157a0 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f  the parser */.vo
157b0 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28 6c  id ReportTable(l
157c0 65 6d 70 2c 20 6d 68 66 6c 61 67 29 0a 73 74 72  emp, mhflag).str
157d0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
157e0 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20  .int mhflag;    
157f0 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d 61   /* Output in ma
15800 6b 65 68 65 61 64 65 72 73 20 66 6f 72 6d 61 74  keheaders format
15810 20 69 66 20 74 72 75 65 20 2a 2f 0a 7b 0a 20 20   if true */.{.  
15820 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a  FILE *out, *in;.
15830 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45    char line[LINE
15840 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69  SIZE];.  int  li
15850 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  neno;.  struct s
15860 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
15870 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
15880 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
15890 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  p;.  int i, j;. 
158a0 20 69 6e 74 20 74 61 62 6c 65 63 6e 74 3b 0a 20   int tablecnt;. 
158b0 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 0a 20 20   char *name;..  
158c0 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c  in = tplt_open(l
158d0 65 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  emp);.  if( in==
158e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75  0 ) return;.  ou
158f0 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  t = file_open(le
15900 6d 70 2c 22 2e 63 22 2c 22 77 22 29 3b 0a 20 20  mp,".c","w");.  
15910 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20  if( out==0 ){.  
15920 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
15930 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
15940 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70  lineno = 1;.  tp
15950 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
15960 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
15970 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
15980 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63  te the include c
15990 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20  ode, if any */. 
159a0 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
159b0 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75  lemp,lemp->inclu
159c0 64 65 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65  de,lemp->include
159d0 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69  ln,&lineno);.  i
159e0 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
159f0 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 66 69   char *name = fi
15a00 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
15a10 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72  , ".h");.    fpr
15a20 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75  intf(out,"#inclu
15a30 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 6e 61  de \"%s\"\n", na
15a40 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
15a50 20 20 20 66 72 65 65 28 6e 61 6d 65 29 3b 0a 20     free(name);. 
15a60 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
15a70 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
15a80 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
15a90 20 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e   Generate #defin
15aa0 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e  es for all token
15ab0 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61  s */.  if( mhfla
15ac0 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  g ){.    char *p
15ad0 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69 6e  refix;.    fprin
15ae0 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45  tf(out,"#if INTE
15af0 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e  RFACE\n"); linen
15b00 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d  o++;.    if( lem
15b10 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29  p->tokenprefix )
15b20 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e   prefix = lemp->
15b30 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20  tokenprefix;.   
15b40 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
15b50 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20           prefix 
15b60 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = "";.    for(i=
15b70 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
15b80 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
15b90 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
15ba0 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
15bb0 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  2d\n",prefix,lem
15bc0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
15bd0 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69  ame,i);.      li
15be0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
15bf0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
15c00 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
15c10 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
15c20 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
15c30 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
15c40 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
15c50 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20  the defines */. 
15c60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 2f 2a   fprintf(out,"/*
15c70 20 5c 30 30 31 20 2a 2f 5c 6e 22 29 3b 0a 20 20   \001 */\n");.  
15c80 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
15c90 66 69 6e 65 20 59 59 43 4f 44 45 54 59 50 45 20  fine YYCODETYPE 
15ca0 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d  %s\n",.    minim
15cb0 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6c 65 6d  um_size_type(lem
15cc0 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 35 29 29 3b 20  p->nsymbol+5)); 
15cd0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
15ce0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
15cf0 20 59 59 4e 4f 43 4f 44 45 20 25 64 5c 6e 22 2c   YYNOCODE %d\n",
15d00 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29  lemp->nsymbol+1)
15d10 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ;  lineno++;.  f
15d20 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
15d30 69 6e 65 20 59 59 41 43 54 49 4f 4e 54 59 50 45  ine YYACTIONTYPE
15d40 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69   %s\n",.    mini
15d50 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6c 65  mum_size_type(le
15d60 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d  mp->nstate+lemp-
15d70 3e 6e 72 75 6c 65 2b 35 29 29 3b 20 20 6c 69 6e  >nrule+5));  lin
15d80 65 6e 6f 2b 2b 3b 0a 20 20 70 72 69 6e 74 5f 73  eno++;.  print_s
15d90 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c  tack_union(out,l
15da0 65 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c  emp,&lineno,mhfl
15db0 61 67 29 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  ag);.  if( lemp-
15dc0 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20  >stacksize ){.  
15dd0 20 20 69 66 28 20 61 74 6f 69 28 6c 65 6d 70 2d    if( atoi(lemp-
15de0 3e 73 74 61 63 6b 73 69 7a 65 29 3c 3d 30 20 29  >stacksize)<=0 )
15df0 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67  {.      ErrorMsg
15e00 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
15e10 30 2c 0a 22 49 6c 6c 65 67 61 6c 20 73 74 61 63  0,."Illegal stac
15e20 6b 20 73 69 7a 65 3a 20 5b 25 73 5d 2e 20 20 54  k size: [%s].  T
15e30 68 65 20 73 74 61 63 6b 20 73 69 7a 65 20 73 68  he stack size sh
15e40 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
15e50 65 72 20 63 6f 6e 73 74 61 6e 74 2e 22 2c 0a 20  er constant.",. 
15e60 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 73 74 61         lemp->sta
15e70 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 6c  cksize);.      l
15e80 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
15e90 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 73 74 61  .      lemp->sta
15ea0 63 6b 73 69 7a 65 20 3d 20 22 31 30 30 22 3b 0a  cksize = "100";.
15eb0 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
15ec0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
15ed0 59 53 54 41 43 4b 44 45 50 54 48 20 25 73 5c 6e  YSTACKDEPTH %s\n
15ee0 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a  ",lemp->stacksiz
15ef0 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
15f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
15f10 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
15f20 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 31 30   YYSTACKDEPTH 10
15f30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  0\n");  lineno++
15f40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c  ;.  }.  if( mhfl
15f50 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ag ){.    fprint
15f60 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52  f(out,"#if INTER
15f70 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  FACE\n"); lineno
15f80 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d  ++;.  }.  name =
15f90 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65   lemp->name ? le
15fa0 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73  mp->name : "Pars
15fb0 65 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  e";.  if( lemp->
15fc0 61 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67  arg && lemp->arg
15fd0 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  [0] ){.    int i
15fe0 3b 0a 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e  ;.    i = strlen
15ff0 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20  (lemp->arg);.   
16000 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20   while( i>=1 && 
16010 69 73 73 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72  isspace(lemp->ar
16020 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20  g[i-1]) ) i--;. 
16030 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26     while( i>=1 &
16040 26 20 28 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d  & (isalnum(lemp-
16050 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65  >arg[i-1]) || le
16060 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f  mp->arg[i-1]=='_
16070 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70  ') ) i--;.    fp
16080 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
16090 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c 20 25  ne %sARG_SDECL %
160a0 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d  s;\n",name,lemp-
160b0 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  >arg);  lineno++
160c0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
160d0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
160e0 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61  _PDECL ,%s\n",na
160f0 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20  me,lemp->arg);  
16100 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
16110 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
16120 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48 20 25  ne %sARG_FETCH %
16130 73 20 3d 20 79 79 70 50 61 72 73 65 72 2d 3e 25  s = yypParser->%
16140 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
16150 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70         name,lemp
16160 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67  ->arg,&lemp->arg
16170 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  [i]);  lineno++;
16180 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
16190 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
161a0 53 54 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d  STORE yypParser-
161b0 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20  >%s = %s\n",.   
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
161d0 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  me,&lemp->arg[i]
161e0 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b  ,&lemp->arg[i]);
161f0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65    lineno++;.  }e
16200 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
16210 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
16220 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d  ARG_SDECL\n",nam
16230 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
16240 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
16250 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44  #define %sARG_PD
16260 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c  ECL\n",name);  l
16270 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
16280 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
16290 65 20 25 73 41 52 47 5f 46 45 54 43 48 5c 6e 22  e %sARG_FETCH\n"
162a0 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
162b0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
162c0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
162d0 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b  _STORE\n",name);
162e0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
162f0 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
16300 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
16310 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
16320 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69  no++;.  }.  fpri
16330 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
16340 20 59 59 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c   YYNSTATE %d\n",
16350 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20  lemp->nstate);  
16360 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
16370 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
16380 20 59 59 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c   YYNRULE %d\n",l
16390 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69  emp->nrule);  li
163a0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
163b0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
163c0 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c  YERRORSYMBOL %d\
163d0 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  n",lemp->errsym-
163e0 3e 69 6e 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f  >index);  lineno
163f0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
16400 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52  t,"#define YYERR
16410 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65  SYMDT yy%d\n",le
16420 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75  mp->errsym->dtnu
16430 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  m);  lineno++;. 
16440 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66   if( lemp->has_f
16450 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66  allback ){.    f
16460 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
16470 69 6e 65 20 59 59 46 41 4c 4c 42 41 43 4b 20 31  ine YYFALLBACK 1
16480 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  \n");  lineno++;
16490 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
164a0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
164b0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
164c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
164d0 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 0a 20 20  action table..  
164e0 2a 2a 0a 20 20 2a 2a 20 45 61 63 68 20 65 6e 74  **.  ** Each ent
164f0 72 79 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e  ry in the action
16500 20 74 61 62 6c 65 20 69 73 20 61 6e 20 65 6c 65   table is an ele
16510 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ment of the foll
16520 6f 77 69 6e 67 20 0a 20 20 2a 2a 20 73 74 72 75  owing .  ** stru
16530 63 74 75 72 65 3a 0a 20 20 2a 2a 20 20 20 73 74  cture:.  **   st
16540 72 75 63 74 20 79 79 41 63 74 69 6f 6e 45 6e 74  ruct yyActionEnt
16550 72 79 20 7b 0a 20 20 2a 2a 20 20 20 20 20 20 20  ry {.  **       
16560 59 59 43 4f 44 45 54 59 50 45 20 20 20 20 20 20  YYCODETYPE      
16570 20 20 20 20 20 20 6c 6f 6f 6b 61 68 65 61 64 3b        lookahead;
16580 0a 20 20 2a 2a 20 20 20 20 20 20 20 59 59 43 4f  .  **       YYCO
16590 44 45 54 59 50 45 20 20 20 20 20 20 20 20 20 20  DETYPE          
165a0 20 20 6e 65 78 74 3b 0a 20 20 2a 2a 20 20 20 20    next;.  **    
165b0 20 20 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20     YYACTIONTYPE 
165c0 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 3b           action;
165d0 0a 20 20 2a 2a 20 20 20 7d 0a 20 20 2a 2a 0a 20  .  **   }.  **. 
165e0 20 2a 2a 20 54 68 65 20 65 6e 74 72 69 65 73 20   ** The entries 
165f0 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f  are grouped into
16600 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 6f 6e   hash tables, on
16610 65 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72  e hash table for
16620 20 65 61 63 68 0a 20 20 2a 2a 20 70 61 72 73 65   each.  ** parse
16630 72 20 73 74 61 74 65 2e 20 20 54 68 65 20 68 61  r state.  The ha
16640 73 68 20 74 61 62 6c 65 20 68 61 73 20 61 20 73  sh table has a s
16650 69 7a 65 20 77 68 69 63 68 20 69 73 20 74 68 65  ize which is the
16660 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
16670 65 6e 74 72 69 65 73 20 69 6e 20 74 68 61 74 20  entries in that 
16680 74 61 62 6c 65 2e 20 20 49 6e 20 63 61 73 65 20  table.  In case 
16690 6f 66 20 61 20 63 6f 6c 6c 69 73 69 6f 6e 2c 20  of a collision, 
166a0 74 68 65 20 22 6e 65 78 74 22 20 76 61 6c 75 65  the "next" value
166b0 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6f  .  ** contains o
166c0 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  ne more than the
166d0 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   index into the 
166e0 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20 74 68  hash table of th
166f0 65 20 6e 65 78 74 0a 20 20 2a 2a 20 65 6e 74 72  e next.  ** entr
16700 79 20 69 6e 20 74 68 65 20 63 6f 6c 6c 69 73 69  y in the collisi
16710 6f 6e 20 63 68 61 69 6e 2e 20 20 41 20 22 6e 65  on chain.  A "ne
16720 78 74 22 20 76 61 6c 75 65 20 6f 66 20 30 20 6d  xt" value of 0 m
16730 65 61 6e 73 20 74 68 65 20 65 6e 64 0a 20 20 2a  eans the end.  *
16740 2a 20 6f 66 20 74 68 65 20 63 68 61 69 6e 20 68  * of the chain h
16750 61 73 20 62 65 65 6e 20 72 65 61 63 68 65 64 2e  as been reached.
16760 0a 20 20 2a 2f 0a 20 20 74 61 62 6c 65 63 6e 74  .  */.  tablecnt
16770 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70   = 0;..  /* Loop
16780 20 6f 76 65 72 20 70 61 72 73 65 72 20 73 74 61   over parser sta
16790 74 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  tes */.  for(i=0
167a0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
167b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
167c0 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20  tablesize;      
167d0 20 20 20 20 20 20 20 20 2f 2a 20 73 69 7a 65 20          /* size 
167e0 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  of the hash tabl
167f0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 2c 6b  e */.    int j,k
16800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16810 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
16820 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nter */.    int 
16830 63 6f 6c 6c 69 64 65 5b 32 30 34 38 5d 3b 20 20  collide[2048];  
16840 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
16850 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
16860 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
16870 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f      struct actio
16880 6e 20 2a 74 61 62 6c 65 5b 32 30 34 38 5d 3b 20  n *table[2048]; 
16890 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 68 61 73  /* Build the has
168a0 68 20 74 61 62 6c 65 20 68 65 72 65 20 2a 2f 0a  h table here */.
168b0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  .    /* Find the
168c0 20 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f   number of actio
168d0 6e 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ns and initializ
168e0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
168f0 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65   */.    stp = le
16900 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
16910 20 20 20 73 74 70 2d 3e 74 61 62 73 74 61 72 74     stp->tabstart
16920 20 3d 20 74 61 62 6c 65 63 6e 74 3b 0a 20 20 20   = tablecnt;.   
16930 20 73 74 70 2d 3e 6e 61 63 74 69 6f 6e 20 3d 20   stp->naction = 
16940 30 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  0;.    for(ap=st
16950 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
16960 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
16970 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
16980 21 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  !=lemp->nsymbol 
16990 26 26 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f  && compute_actio
169a0 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d 30 20 29 7b  n(lemp,ap)>=0 ){
169b0 0a 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 61  .        stp->na
169c0 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  ction++;.      }
169d0 0a 20 20 20 20 7d 0a 20 20 20 20 74 61 62 6c 65  .    }.    table
169e0 73 69 7a 65 20 3d 20 73 74 70 2d 3e 6e 61 63 74  size = stp->nact
169f0 69 6f 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ion;.    assert(
16a00 20 74 61 62 6c 65 73 69 7a 65 3c 3d 20 73 69 7a   tablesize<= siz
16a10 65 6f 66 28 74 61 62 6c 65 29 2f 73 69 7a 65 6f  eof(table)/sizeo
16a20 66 28 74 61 62 6c 65 5b 30 5d 29 20 29 3b 0a 20  f(table[0]) );. 
16a30 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 74 61     for(j=0; j<ta
16a40 62 6c 65 73 69 7a 65 3b 20 6a 2b 2b 29 7b 0a 20  blesize; j++){. 
16a50 20 20 20 20 20 74 61 62 6c 65 5b 6a 5d 20 3d 20       table[j] = 
16a60 30 3b 0a 20 20 20 20 20 20 63 6f 6c 6c 69 64 65  0;.      collide
16a70 5b 6a 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  [j] = -1;.    }.
16a80 0a 20 20 20 20 2f 2a 20 48 61 73 68 20 74 68 65  .    /* Hash the
16a90 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 74 68   actions into th
16aa0 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
16ab0 20 20 20 20 73 74 70 2d 3e 74 61 62 64 66 6c 74      stp->tabdflt
16ac0 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
16ad0 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
16ae0 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
16af0 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
16b00 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  >next){.      in
16b10 74 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75  t action = compu
16b20 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61  te_action(lemp,a
16b30 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 68 3b  p);.      int h;
16b40 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73  .      if( ap->s
16b50 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e  p->index==lemp->
16b60 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20  nsymbol ){.     
16b70 20 20 20 73 74 70 2d 3e 74 61 62 64 66 6c 74 61     stp->tabdflta
16b80 63 74 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20  ct = action;.   
16b90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63 74     }else if( act
16ba0 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion>=0 ){.      
16bb0 20 20 68 20 3d 20 61 70 2d 3e 73 70 2d 3e 69 6e    h = ap->sp->in
16bc0 64 65 78 20 25 20 74 61 62 6c 65 73 69 7a 65 3b  dex % tablesize;
16bd0 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 63 6f 6c  .        ap->col
16be0 6c 69 64 65 20 3d 20 74 61 62 6c 65 5b 68 5d 3b  lide = table[h];
16bf0 0a 20 20 20 20 20 20 20 20 74 61 62 6c 65 5b 68  .        table[h
16c00 5d 20 3d 20 61 70 3b 0a 20 20 20 20 20 20 7d 0a  ] = ap;.      }.
16c10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
16c20 73 6f 6c 76 65 20 63 6f 6c 6c 69 73 69 6f 6e 73  solve collisions
16c30 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 6b 3d   */.    for(j=k=
16c40 30 3b 20 6a 3c 74 61 62 6c 65 73 69 7a 65 3b 20  0; j<tablesize; 
16c50 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
16c60 74 61 62 6c 65 5b 6a 5d 20 26 26 20 74 61 62 6c  table[j] && tabl
16c70 65 5b 6a 5d 2d 3e 63 6f 6c 6c 69 64 65 20 29 7b  e[j]->collide ){
16c80 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
16c90 74 61 62 6c 65 5b 6b 5d 20 29 20 6b 2b 2b 3b 0a  table[k] ) k++;.
16ca0 20 20 20 20 20 20 20 20 74 61 62 6c 65 5b 6b 5d          table[k]
16cb0 20 3d 20 74 61 62 6c 65 5b 6a 5d 2d 3e 63 6f 6c   = table[j]->col
16cc0 6c 69 64 65 3b 0a 20 20 20 20 20 20 20 20 63 6f  lide;.        co
16cd0 6c 6c 69 64 65 5b 6a 5d 20 3d 20 6b 3b 0a 20 20  llide[j] = k;.  
16ce0 20 20 20 20 20 20 74 61 62 6c 65 5b 6a 5d 2d 3e        table[j]->
16cf0 63 6f 6c 6c 69 64 65 20 3d 20 30 3b 0a 20 20 20  collide = 0;.   
16d00 20 20 20 20 20 69 66 28 20 6b 3c 6a 20 29 20 6a       if( k<j ) j
16d10 20 3d 20 6b 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   = k-1;.      }.
16d20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72      }..    /* Pr
16d30 69 6e 74 20 74 68 65 20 68 61 73 68 20 74 61 62  int the hash tab
16d40 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 74 61  le */.    if( ta
16d50 62 6c 65 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20  blesize>0 ){.   
16d60 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
16d70 2f 2a 20 53 74 61 74 65 20 25 64 20 2a 2f 5c 6e  /* State %d */\n
16d80 22 2c 73 74 70 2d 3e 69 6e 64 65 78 29 3b 20 6c  ",stp->index); l
16d90 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
16da0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 74 61     for(j=0; j<ta
16db0 62 6c 65 73 69 7a 65 3b 20 6a 2b 2b 29 7b 0a 20  blesize; j++){. 
16dc0 20 20 20 20 20 61 73 73 65 72 74 28 20 74 61 62       assert( tab
16dd0 6c 65 5b 6a 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[j]!=0 );.    
16de0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
16df0 20 7b 25 34 64 2c 25 34 64 2c 25 34 64 7d 2c 20   {%4d,%4d,%4d}, 
16e00 2f 2a 20 25 32 64 3a 20 22 2c 0a 20 20 20 20 20  /* %2d: ",.     
16e10 20 20 20 20 20 74 61 62 6c 65 5b 6a 5d 2d 3e 73       table[j]->s
16e20 70 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20 20  p->index,.      
16e30 20 20 20 20 63 6f 6c 6c 69 64 65 5b 6a 5d 2b 31      collide[j]+1
16e40 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70  ,.          comp
16e50 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
16e60 74 61 62 6c 65 5b 6a 5d 29 2c 0a 20 20 20 20 20  table[j]),.     
16e70 20 20 20 20 20 6a 2b 31 29 3b 0a 20 20 20 20 20       j+1);.     
16e80 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 74 61 62   PrintAction(tab
16e90 6c 65 5b 6a 5d 2c 6f 75 74 2c 32 32 29 3b 0a 20  le[j],out,22);. 
16ea0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
16eb0 2c 22 20 2a 2f 5c 6e 22 29 3b 20 0a 20 20 20 20  ," */\n"); .    
16ec0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
16ed0 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  }..    /* Update
16ee0 20 74 68 65 20 74 61 62 6c 65 20 63 6f 75 6e 74   the table count
16ef0 20 2a 2f 0a 20 20 20 20 74 61 62 6c 65 63 6e 74   */.    tablecnt
16f00 20 2b 3d 20 74 61 62 6c 65 73 69 7a 65 3b 0a 20   += tablesize;. 
16f10 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
16f20 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
16f30 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 6c 65 6d  ,&lineno);.  lem
16f40 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 3d 20 74  p->tablesize = t
16f50 61 62 6c 65 63 6e 74 3b 0a 0a 20 20 2f 2a 20 47  ablecnt;..  /* G
16f60 65 6e 65 72 61 74 65 20 74 68 65 20 73 74 61 74  enerate the stat
16f70 65 20 74 61 62 6c 65 0a 20 20 2a 2a 0a 20 20 2a  e table.  **.  *
16f80 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 73 20  * Each entry is 
16f90 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  an element of th
16fa0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
16fb0 63 74 75 72 65 3a 0a 20 20 2a 2a 20 20 20 20 73  cture:.  **    s
16fc0 74 72 75 63 74 20 79 79 53 74 61 74 65 45 6e 74  truct yyStateEnt
16fd0 72 79 20 7b 0a 20 20 2a 2a 20 20 20 20 20 20 73  ry {.  **      s
16fe0 74 72 75 63 74 20 79 79 41 63 74 69 6f 6e 45 6e  truct yyActionEn
16ff0 74 72 79 20 2a 68 61 73 68 74 62 6c 3b 0a 20 20  try *hashtbl;.  
17000 2a 2a 20 20 20 20 20 20 59 59 43 4f 44 45 54 59  **      YYCODETY
17010 50 45 20 6e 45 6e 74 72 79 3b 0a 20 20 2a 2a 20  PE nEntry;.  ** 
17020 20 20 20 20 20 59 59 41 43 54 49 4f 4e 54 59 50       YYACTIONTYP
17030 45 20 61 63 74 69 6f 6e 44 65 66 61 75 6c 74 3b  E actionDefault;
17040 0a 20 20 2a 2a 20 20 20 20 7d 0a 20 20 2a 2f 0a  .  **    }.  */.
17050 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
17060 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
17070 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
17080 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
17090 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b  fprintf(out,"  {
170a0 20 26 79 79 41 63 74 69 6f 6e 54 61 62 6c 65 5b   &yyActionTable[
170b0 25 64 5d 2c 25 34 64 2c 25 34 64 20 7d 2c 5c 6e  %d],%4d,%4d },\n
170c0 22 2c 0a 20 20 20 20 20 20 73 74 70 2d 3e 74 61  ",.      stp->ta
170d0 62 73 74 61 72 74 2c 0a 20 20 20 20 20 20 73 74  bstart,.      st
170e0 70 2d 3e 6e 61 63 74 69 6f 6e 2c 0a 20 20 20 20  p->naction,.    
170f0 20 20 73 74 70 2d 3e 74 61 62 64 66 6c 74 61 63    stp->tabdfltac
17100 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  t); lineno++;.  
17110 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
17120 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
17130 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
17140 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61 62  Generate the tab
17150 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74  le of fallback t
17160 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  okens..  */.  if
17170 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c  ( lemp->has_fall
17180 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28  back ){.    for(
17190 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=0; i<lemp->nte
171a0 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
171b0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
171c0 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d  l *p = lemp->sym
171d0 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
171e0 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d  f( p->fallback==
171f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
17200 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30  intf(out, "    0
17210 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f  ,  /* %10s => no
17220 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  thing */\n", p->
17230 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
17240 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  se{.        fpri
17250 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c  ntf(out, "  %3d,
17260 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20    /* %10s => %s 
17270 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61  */\n", p->fallba
17280 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20  ck->index,.     
17290 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d       p->name, p-
172a0 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29  >fallback->name)
172b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
172c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
172d0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
172e0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20  lemp->name, in, 
172f0 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  out, &lineno);..
17300 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
17310 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
17320 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
17330 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62  me of every symb
17340 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ol.  */.  for(i=
17350 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
17360 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  ol; i++){.    sp
17370 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73  rintf(line,"\"%s
17380 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  \",",lemp->symbo
17390 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ls[i]->name);.  
173a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
173b0 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20   %-15s",line);. 
173c0 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20     if( (i&3)==3 
173d0 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
173e0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
173f0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33  }.  }.  if( (i&3
17400 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28  )!=0 ){ fprintf(
17410 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  out,"\n"); linen
17420 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66  o++; }.  tplt_xf
17430 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
17440 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
17450 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
17460 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
17470 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20 74   a text string t
17480 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65 76  hat describes ev
17490 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e  ery.  ** rule in
174a0 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66   the rule set of
174b0 20 74 68 65 20 67 72 61 6d 6d 65 72 2e 20 20 54   the grammer.  T
174c0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
174d0 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65  is used.  ** whe
174e0 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43 45  n tracing REDUCE
174f0 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20   actions..  */. 
17500 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d   for(i=0, rp=lem
17510 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
17520 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a  rp->next, i++){.
17530 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e      assert( rp->
17540 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20 20  index==i );.    
17550 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
17560 20 25 33 64 20 2a 2f 20 5c 22 25 73 20 3a 3a 3d   %3d */ \"%s ::=
17570 22 2c 20 69 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e  ", i, rp->lhs->n
17580 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  ame);.    for(j=
17590 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a  0; j<rp->nrhs; j
175a0 2b 2b 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ++) fprintf(out,
175b0 22 20 25 73 22 2c 72 70 2d 3e 72 68 73 5b 6a 5d  " %s",rp->rhs[j]
175c0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70 72  ->name);.    fpr
175d0 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22  intf(out,"\",\n"
175e0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
175f0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
17600 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
17610 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
17620 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
17630 63 68 20 65 78 65 63 75 74 65 73 20 65 76 65 72  ch executes ever
17640 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20  y time a symbol 
17650 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20  is popped from. 
17660 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68   ** the stack wh
17670 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65  ile processing e
17680 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64  rrors or while d
17690 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61  estroying the pa
176a0 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20  rser. .  ** (In 
176b0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e  other words, gen
176c0 65 72 61 74 65 20 74 68 65 20 25 64 65 73 74 72  erate the %destr
176d0 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20  uctor actions). 
176e0 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
176f0 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20  tokendest ){.   
17700 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
17710 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
17720 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
17730 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
17740 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
17750 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
17760 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  sp->type!=TERMIN
17770 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  AL ) continue;. 
17780 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
17790 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e  ,"    case %d:\n
177a0 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69  ",sp->index); li
177b0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
177c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
177d0 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c 65  p->nsymbol && le
177e0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
177f0 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b 20  type!=TERMINAL; 
17800 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 69 3c  i++);.    if( i<
17810 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b  lemp->nsymbol ){
17820 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74  .      emit_dest
17830 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c  ructor_code(out,
17840 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
17850 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
17860 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
17870 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
17880 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
17890 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
178a0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
178b0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
178c0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
178d0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
178e0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 3d  [i];.    if( sp=
178f0 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d  =0 || sp->type==
17900 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e  TERMINAL || sp->
17910 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20 29 20  destructor==0 ) 
17920 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70  continue;.    fp
17930 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
17940 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69  ase %d:\n",sp->i
17950 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ndex); lineno++;
17960 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75  .    emit_destru
17970 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65  ctor_code(out,le
17980 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c  mp->symbols[i],l
17990 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
179a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
179b0 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
179c0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
179d0 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65   if( lemp->varde
179e0 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  st ){.    struct
179f0 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73 70   symbol *dflt_sp
17a00 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
17a10 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
17a20 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
17a30 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
17a40 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
17a50 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  s[i];.      if( 
17a60 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70  sp==0 || sp->typ
17a70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20  e==TERMINAL ||. 
17a80 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e 64           sp->ind
17a90 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73  ex<=0 || sp->des
17aa0 74 72 75 63 74 6f 72 21 3d 30 20 29 20 63 6f 6e  tructor!=0 ) con
17ab0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 70 72  tinue;.      fpr
17ac0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
17ad0 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e  se %d:\n",sp->in
17ae0 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
17af0 20 20 20 20 20 20 64 66 6c 74 5f 73 70 20 3d 20        dflt_sp = 
17b00 73 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  sp;.    }.    if
17b10 28 20 64 66 6c 74 5f 73 70 21 3d 30 20 29 7b 0a  ( dflt_sp!=0 ){.
17b20 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72        emit_destr
17b30 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 64  uctor_code(out,d
17b40 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e  flt_sp,lemp,&lin
17b50 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72 69  eno);.      fpri
17b60 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
17b70 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
17b80 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  o++;.    }.  }. 
17b90 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
17ba0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
17bb0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
17bc0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
17bd0 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65 76   executes whenev
17be0 65 72 20 74 68 65 20 70 61 72 73 65 72 20 73 74  er the parser st
17bf0 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f  ack overflows */
17c00 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
17c10 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65  t,lemp,lemp->ove
17c20 72 66 6c 6f 77 2c 6c 65 6d 70 2d 3e 6f 76 65 72  rflow,lemp->over
17c30 66 6c 6f 77 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b  flowln,&lineno);
17c40 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
17c50 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
17c60 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
17c70 65 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c  enerate the tabl
17c80 65 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72 6d  e of rule inform
17c90 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ation .  **.  **
17ca0 20 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f 64 65   Note: This code
17cb0 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
17cc0 66 61 63 74 20 74 68 61 74 20 72 75 6c 65 73 20  fact that rules 
17cd0 61 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  are number.  ** 
17ce0 73 65 71 75 65 6e 74 75 61 6c 6c 79 20 62 65 67  sequentually beg
17cf0 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e 0a 20  inning with 0.. 
17d00 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
17d10 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
17d20 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66  rp->next){.    f
17d30 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b 20  printf(out,"  { 
17d40 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d  %d, %d },\n",rp-
17d50 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e  >lhs->index,rp->
17d60 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  nrhs); lineno++;
17d70 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
17d80 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
17d90 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
17da0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17db0 20 77 68 69 63 68 20 65 78 65 63 75 74 69 6f 6e   which execution
17dc0 20 64 75 72 69 6e 67 20 65 61 63 68 20 52 45 44   during each RED
17dd0 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  UCE action */.  
17de0 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
17df0 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
17e00 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  xt){.    fprintf
17e10 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73 65  (out,"      case
17e20 20 25 64 3a 5c 6e 22 2c 72 70 2d 3e 69 6e 64 65   %d:\n",rp->inde
17e30 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
17e40 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c    emit_code(out,
17e50 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  rp,lemp,&lineno)
17e60 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
17e70 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
17e80 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
17e90 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
17ea0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
17eb0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
17ec0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17ed0 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
17ee0 69 66 20 61 20 70 61 72 73 65 20 66 61 69 6c 73  if a parse fails
17ef0 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
17f00 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
17f10 66 61 69 6c 75 72 65 2c 6c 65 6d 70 2d 3e 66 61  failure,lemp->fa
17f20 69 6c 75 72 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29  ilureln,&lineno)
17f30 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
17f40 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
17f50 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
17f60 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
17f70 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
17f80 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72  n a syntax error
17f90 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c   occurs */.  tpl
17fa0 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
17fb0 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 6c 65 6d  ,lemp->error,lem
17fc0 70 2d 3e 65 72 72 6f 72 6c 6e 2c 26 6c 69 6e 65  p->errorln,&line
17fd0 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
17fe0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
17ff0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
18000 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
18010 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
18020 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20  when the parser 
18030 61 63 63 65 70 74 73 20 69 74 73 20 69 6e 70 75  accepts its inpu
18040 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  t */.  tplt_prin
18050 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
18060 3e 61 63 63 65 70 74 2c 6c 65 6d 70 2d 3e 61 63  >accept,lemp->ac
18070 63 65 70 74 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b  ceptln,&lineno);
18080 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
18090 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
180a0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41  lineno);..  /* A
180b0 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69  ppend any additi
180c0 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73 65 72  on code the user
180d0 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70   desires */.  tp
180e0 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
180f0 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64  p,lemp->extracod
18100 65 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64  e,lemp->extracod
18110 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  eln,&lineno);.. 
18120 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66   fclose(in);.  f
18130 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72 65  close(out);.  re
18140 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  turn;.}../* Gene
18150 72 61 74 65 20 61 20 68 65 61 64 65 72 20 66 69  rate a header fi
18160 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  le for the parse
18170 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74  r */.void Report
18180 48 65 61 64 65 72 28 6c 65 6d 70 29 0a 73 74 72  Header(lemp).str
18190 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
181a0 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20  .{.  FILE *out, 
181b0 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 70 72 65  *in;.  char *pre
181c0 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65  fix;.  char line
181d0 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68  [LINESIZE];.  ch
181e0 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53  ar pattern[LINES
181f0 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  IZE];.  int i;..
18200 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
18210 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78  nprefix ) prefix
18220 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72   = lemp->tokenpr
18230 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20 20 20  efix;.  else    
18240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18250 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 69  prefix = "";.  i
18260 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  n = file_open(le
18270 6d 70 2c 22 2e 68 22 2c 22 72 22 29 3b 0a 20 20  mp,".h","r");.  
18280 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 66 6f  if( in ){.    fo
18290 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
182a0 74 65 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74  terminal && fget
182b0 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c  s(line,LINESIZE,
182c0 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  in); i++){.     
182d0 20 73 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e   sprintf(pattern
182e0 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30  ,"#define %s%-30
182f0 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c  s %2d\n",prefix,
18300 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
18310 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20  ->name,i);.     
18320 20 69 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65   if( strcmp(line
18330 2c 70 61 74 74 65 72 6e 29 20 29 20 62 72 65 61  ,pattern) ) brea
18340 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c  k;.    }.    fcl
18350 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28  ose(in);.    if(
18360 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69   i==lemp->ntermi
18370 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
18380 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65  No change in the
18390 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65   file.  Don't re
183a0 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20  write it. */.   
183b0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
183c0 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c  .  }.  out = fil
183d0 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22  e_open(lemp,".h"
183e0 2c 22 77 22 29 3b 0a 20 20 69 66 28 20 6f 75 74  ,"w");.  if( out
183f0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
18400 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
18410 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
18420 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
18430 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64  fine %s%-30s %2d
18440 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d  \n",prefix,lemp-
18450 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
18460 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e,i);.    }.    
18470 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20 0a 20  fclose(out);  . 
18480 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
18490 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20 73 69  /* Reduce the si
184a0 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e  ze of the action
184b0 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73   tables, if poss
184c0 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20  ible, by making 
184d0 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c  use.** of defaul
184e0 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ts..**.** In thi
184f0 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61  s version, we ta
18500 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71  ke the most freq
18510 75 65 6e 74 20 52 45 44 55 43 45 20 61 63 74 69  uent REDUCE acti
18520 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69  on and make.** i
18530 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  t the default.  
18540 4f 6e 6c 79 20 64 65 66 61 75 6c 74 20 61 20 72  Only default a r
18550 65 64 75 63 65 20 69 66 20 74 68 65 72 65 20 61  educe if there a
18560 72 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  re more than one
18570 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65  ..*/.void Compre
18580 73 73 54 61 62 6c 65 73 28 6c 65 6d 70 29 0a 73  ssTables(lemp).s
18590 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
185a0 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74  p;.{.  struct st
185b0 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
185c0 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a  ct action *ap, *
185d0 61 70 32 3b 0a 20 20 73 74 72 75 63 74 20 72 75  ap2;.  struct ru
185e0 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20 2a 72  le *rp, *rp2, *r
185f0 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62 65 73  best;.  int nbes
18600 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  t, n;.  int i;. 
18610 20 69 6e 74 20 63 6e 74 3b 0a 0a 20 20 66 6f 72   int cnt;..  for
18620 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
18630 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
18640 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
18650 65 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74  ed[i];.    nbest
18660 20 3d 20 30 3b 0a 20 20 20 20 72 62 65 73 74 20   = 0;.    rbest 
18670 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70  = 0;..    for(ap
18680 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
18690 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
186a0 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21 3d    if( ap->type!=
186b0 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75  REDUCE ) continu
186c0 65 3b 0a 20 20 20 20 20 20 72 70 20 3d 20 61 70  e;.      rp = ap
186d0 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 69 66  ->x.rp;.      if
186e0 28 20 72 70 3d 3d 72 62 65 73 74 20 29 20 63 6f  ( rp==rbest ) co
186f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20  ntinue;.      n 
18700 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 61  = 1;.      for(a
18710 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32  p2=ap->next; ap2
18720 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29  ; ap2=ap2->next)
18730 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  {.        if( ap
18740 32 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20  2->type!=REDUCE 
18750 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
18760 20 20 20 20 72 70 32 20 3d 20 61 70 32 2d 3e 78      rp2 = ap2->x
18770 2e 72 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  .rp;.        if(
18780 20 72 70 32 3d 3d 72 62 65 73 74 20 29 20 63 6f   rp2==rbest ) co
18790 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
187a0 69 66 28 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b  if( rp2==rp ) n+
187b0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
187c0 20 69 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a   if( n>nbest ){.
187d0 20 20 20 20 20 20 20 20 6e 62 65 73 74 20 3d 20          nbest = 
187e0 6e 3b 0a 20 20 20 20 20 20 20 20 72 62 65 73 74  n;.        rbest
187f0 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20   = rp;.      }. 
18800 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f     }. .    /* Do
18810 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65 66 61   not make a defa
18820 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65  ult if the numbe
18830 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20 64 65  r of rules to de
18840 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20  fault.    ** is 
18850 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 32 20 2a  not at least 2 *
18860 2f 0a 20 20 20 20 69 66 28 20 6e 62 65 73 74 3c  /.    if( nbest<
18870 32 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a  2 ) continue;...
18880 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d      /* Combine m
18890 61 74 63 68 69 6e 67 20 52 45 44 55 43 45 20 61  atching REDUCE a
188a0 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69  ctions into a si
188b0 6e 67 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a  ngle default */.
188c0 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
188d0 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
188e0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
188f0 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  ap->type==REDUCE
18900 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62   && ap->x.rp==rb
18910 65 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  est ) break;.   
18920 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 61   }.    assert( a
18930 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20  p );.    ap->sp 
18940 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64  = Symbol_new("{d
18950 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66  efault}");.    f
18960 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20  or(ap=ap->next; 
18970 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
18980 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
18990 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20  type==REDUCE && 
189a0 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20  ap->x.rp==rbest 
189b0 29 20 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54  ) ap->type = NOT
189c0 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  _USED;.    }.   
189d0 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f   stp->ap = Actio
189e0 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b  n_sort(stp->ap);
189f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  .  }.}../*******
18a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
18a10 74 68 65 20 66 69 6c 65 20 22 73 65 74 2e 63 22  the file "set.c"
18a20 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
18a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a40 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74  *****/./*.** Set
18a50 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f   manipulation ro
18a60 75 74 69 6e 65 73 20 66 6f 72 20 74 68 65 20 4c  utines for the L
18a70 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
18a80 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69  rator..*/..stati
18a90 63 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a  c int size = 0;.
18aa0 0a 2f 2a 20 53 65 74 20 74 68 65 20 73 65 74 20  ./* Set the set 
18ab0 73 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74  size */.void Set
18ac0 53 69 7a 65 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  Size(n).int n;.{
18ad0 0a 20 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d  .  size = n+1;.}
18ae0 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
18af0 6e 65 77 20 73 65 74 20 2a 2f 0a 63 68 61 72 20  new set */.char 
18b00 2a 53 65 74 4e 65 77 28 29 7b 0a 20 20 63 68 61  *SetNew(){.  cha
18b10 72 20 2a 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  r *s;.  int i;. 
18b20 20 73 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c   s = (char*)mall
18b30 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 69 66  oc( size );.  if
18b40 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78  ( s==0 ){.    ex
18b50 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79  tern void memory
18b60 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65  _error();.    me
18b70 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20  mory_error();.  
18b80 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  }.  for(i=0; i<s
18b90 69 7a 65 3b 20 69 2b 2b 29 20 73 5b 69 5d 20 3d  ize; i++) s[i] =
18ba0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a   0;.  return s;.
18bb0 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65  }../* Deallocate
18bc0 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53   a set */.void S
18bd0 65 74 46 72 65 65 28 73 29 0a 63 68 61 72 20 2a  etFree(s).char *
18be0 73 3b 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a  s;.{.  free(s);.
18bf0 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20  }../* Add a new 
18c00 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73  element to the s
18c10 65 74 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  et.  Return TRUE
18c20 20 69 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20   if the element 
18c30 77 61 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64  was added.** and
18c40 20 46 41 4c 53 45 20 69 66 20 69 74 20 77 61 73   FALSE if it was
18c50 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20   already there. 
18c60 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 73 2c  */.int SetAdd(s,
18c70 65 29 0a 63 68 61 72 20 2a 73 3b 0a 69 6e 74 20  e).char *s;.int 
18c80 65 3b 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20  e;.{.  int rv;. 
18c90 20 72 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b   rv = s[e];.  s[
18ca0 65 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  e] = 1;.  return
18cb0 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20   !rv;.}../* Add 
18cc0 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66  every element of
18cd0 20 73 32 20 74 6f 20 73 31 2e 20 20 52 65 74 75   s2 to s1.  Retu
18ce0 72 6e 20 54 52 55 45 20 69 66 20 73 31 20 63 68  rn TRUE if s1 ch
18cf0 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65  anges. */.int Se
18d00 74 55 6e 69 6f 6e 28 73 31 2c 73 32 29 0a 63 68  tUnion(s1,s2).ch
18d10 61 72 20 2a 73 31 3b 0a 63 68 61 72 20 2a 73 32  ar *s1;.char *s2
18d20 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f  ;.{.  int i, pro
18d30 67 72 65 73 73 3b 0a 20 20 70 72 6f 67 72 65 73  gress;.  progres
18d40 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  s = 0;.  for(i=0
18d50 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a  ; i<size; i++){.
18d60 20 20 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30      if( s2[i]==0
18d70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
18d80 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b   if( s1[i]==0 ){
18d90 0a 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20  .      progress 
18da0 3d 20 31 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d  = 1;.      s1[i]
18db0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
18dc0 20 20 72 65 74 75 72 6e 20 70 72 6f 67 72 65 73    return progres
18dd0 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s;.}./**********
18de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
18df0 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c  m the file "tabl
18e00 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.c" ***********
18e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e20 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64  */./*.** All cod
18e30 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  e in this file h
18e40 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69  as been automati
18e50 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a  cally generated.
18e60 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66  ** from a specif
18e70 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66  ication in the f
18e80 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ile.**          
18e90 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a      "table.q".**
18ea0 20 62 79 20 74 68 65 20 61 73 73 6f 63 69 61 74   by the associat
18eb0 69 76 65 20 61 72 72 61 79 20 63 6f 64 65 20 62  ive array code b
18ec0 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20  uilding program 
18ed0 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e  "aagen"..** Do n
18ee0 6f 74 20 65 64 69 74 20 74 68 69 73 20 66 69 6c  ot edit this fil
18ef0 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69  e!  Instead, edi
18f00 74 20 74 68 65 20 73 70 65 63 69 66 69 63 61 74  t the specificat
18f10 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  ion.** file, the
18f20 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a  n rerun aagen..*
18f30 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72  /./*.** Code for
18f40 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c   processing tabl
18f50 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  es in the LEMON 
18f60 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
18f70 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20 69 6e  ..*/..PRIVATE in
18f80 74 20 73 74 72 68 61 73 68 28 78 29 0a 63 68 61  t strhash(x).cha
18f90 72 20 2a 78 3b 0a 7b 0a 20 20 69 6e 74 20 68 20  r *x;.{.  int h 
18fa0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 78  = 0;.  while( *x
18fb0 29 20 68 20 3d 20 68 2a 31 33 20 2b 20 2a 28 78  ) h = h*13 + *(x
18fc0 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b  ++);.  return h;
18fd0 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b  .}../* Works lik
18fe0 65 20 73 74 72 64 75 70 2c 20 73 6f 72 74 20 6f  e strdup, sort o
18ff0 66 2e 20 20 53 61 76 65 20 61 20 73 74 72 69 6e  f.  Save a strin
19000 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d 65  g in malloced me
19010 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20 6b 65 65  mory, but.** kee
19020 70 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 74  p strings in a t
19030 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  able so that the
19040 20 73 61 6d 65 20 73 74 72 69 6e 67 20 69 73 20   same string is 
19050 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74  not in more.** t
19060 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a  han one place..*
19070 2f 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 28  /.char *Strsafe(
19080 79 29 0a 63 68 61 72 20 2a 79 3b 0a 7b 0a 20 20  y).char *y;.{.  
19090 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 7a 20 3d 20  char *z;..  z = 
190a0 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b  Strsafe_find(y);
190b0 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28  .  if( z==0 && (
190c0 7a 3d 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e  z=malloc( strlen
190d0 28 79 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20  (y)+1 ))!=0 ){. 
190e0 20 20 20 73 74 72 63 70 79 28 7a 2c 79 29 3b 0a     strcpy(z,y);.
190f0 20 20 20 20 53 74 72 73 61 66 65 5f 69 6e 73 65      Strsafe_inse
19100 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d  rt(z);.  }.  Mem
19110 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72  oryCheck(z);.  r
19120 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54  eturn z;.}../* T
19130 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
19140 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
19150 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
19160 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f  for each.** asso
19170 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
19180 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73   type "x1"..*/.s
19190 74 72 75 63 74 20 73 5f 78 31 20 7b 0a 20 20 69  truct s_x1 {.  i
191a0 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
191b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
191c0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
191d0 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20  e slots. */.    
191e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191f0 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20        /*   Must 
19200 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
19210 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
19220 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
19230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19240 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a    equal to 1 */.
19250 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20    int count;    
19260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19270 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79  ber of currently
19280 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f   slots filled */
19290 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
192a0 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65  de *tbl;  /* The
192b0 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72   data stored her
192c0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  e */.  struct s_
192d0 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a  x1node **ht;  /*
192e0 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   Hash table for 
192f0 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f  lookups */.};../
19300 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
19310 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
19320 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76  structure for ev
19330 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ery data element
19340 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69  .** in an associ
19350 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
19360 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70  ype "x1"..*/.typ
19370 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 31  edef struct s_x1
19380 6e 6f 64 65 20 7b 0a 20 20 63 68 61 72 20 2a 64  node {.  char *d
19390 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
193a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
193b0 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  a */.  struct s_
193c0 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x1node *next;   
193d0 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
193e0 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
193f0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
19400 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  1node **from;  /
19410 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
19420 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x1node;../*
19430 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
19440 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
19450 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
19460 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
19470 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
19480 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a  t s_x1 *x1a;../*
19490 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
194a0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
194b0 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66  y */.void Strsaf
194c0 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
194d0 78 31 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x1a ) return;.  
194e0 78 31 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x1a = (struct s_
194f0 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x1*)malloc( size
19500 6f 66 28 73 74 72 75 63 74 20 73 5f 78 31 29 20  of(struct s_x1) 
19510 29 3b 0a 20 20 69 66 28 20 78 31 61 20 29 7b 0a  );.  if( x1a ){.
19520 20 20 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20      x1a->size = 
19530 31 30 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63  1024;.    x1a->c
19540 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 31  ount = 0;.    x1
19550 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65  a->tbl = (x1node
19560 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20  *)malloc( .     
19570 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29   (sizeof(x1node)
19580 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
19590 2a 29 29 2a 31 30 32 34 20 29 3b 0a 20 20 20 20  *))*1024 );.    
195a0 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20  if( x1a->tbl==0 
195b0 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 31  ){.      free(x1
195c0 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20  a);.      x1a = 
195d0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
195e0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
195f0 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f   x1a->ht = (x1no
19600 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b  de**)&(x1a->tbl[
19610 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  1024]);.      fo
19620 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69  r(i=0; i<1024; i
19630 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x1a->ht[i] =
19640 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
19650 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
19660 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
19670 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
19680 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
19690 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
196a0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
196b0 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
196c0 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72  itten */.int Str
196d0 73 61 66 65 5f 69 6e 73 65 72 74 28 64 61 74 61  safe_insert(data
196e0 29 0a 63 68 61 72 20 2a 64 61 74 61 3b 0a 7b 0a  ).char *data;.{.
196f0 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x1node *np;.  
19700 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b  int h;.  int ph;
19710 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29  ..  if( x1a==0 )
19720 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20   return 0;.  ph 
19730 3d 20 73 74 72 68 61 73 68 28 64 61 74 61 29 3b  = strhash(data);
19740 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61  .  h = ph & (x1a
19750 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
19760 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x1a->ht[h];.  
19770 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
19780 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
19790 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b  data,data)==0 ){
197a0 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
197b0 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
197c0 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
197d0 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
197e0 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
197f0 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
19800 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
19810 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
19820 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
19830 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
19840 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d  x1a->count>=x1a-
19850 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
19860 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
19870 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
19880 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
19890 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
198a0 20 73 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20   s_x1 array;.   
198b0 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
198c0 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32  ze = x1a->size*2
198d0 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
198e0 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x1a->count;.
198f0 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
19900 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x1node*)malloc(
19910 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
19920 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
19930 78 31 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x1node*))*size )
19940 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
19950 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
19960 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
19970 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
19980 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
19990 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28  t = (x1node**)&(
199a0 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
199b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
199c0 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
199d0 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
199e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d   for(i=0; i<x1a-
199f0 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
19a00 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e      x1node *oldn
19a10 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
19a20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e   oldnp = &(x1a->
19a30 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
19a40 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
19a50 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d  ->data) & (size-
19a60 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20  1);.      newnp 
19a70 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d  = &(array.tbl[i]
19a80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72  );.      if( arr
19a90 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79  ay.ht[h] ) array
19aa0 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  .ht[h]->from = &
19ab0 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  (newnp->next);. 
19ac0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74       newnp->next
19ad0 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a   = array.ht[h];.
19ae0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
19af0 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
19b00 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
19b10 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
19b20 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
19b30 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
19b40 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
19b50 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  1a->tbl);.    *x
19b60 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  1a = array;.  }.
19b70 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
19b80 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
19b90 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a  = ph & (x1a->siz
19ba0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
19bb0 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75  1a->tbl[x1a->cou
19bc0 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61  nt++]);.  np->da
19bd0 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28  ta = data;.  if(
19be0 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31   x1a->ht[h] ) x1
19bf0 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  a->ht[h]->from =
19c00 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20   &(np->next);.  
19c10 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e  np->next = x1a->
19c20 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74  ht[h];.  x1a->ht
19c30 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e  [h] = np;.  np->
19c40 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74  from = &(x1a->ht
19c50 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  [h]);.  return 1
19c60 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
19c70 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
19c80 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
19c90 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74   given key.  Ret
19ca0 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e  urn NULL.** if n
19cb0 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63  o such key. */.c
19cc0 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e  har *Strsafe_fin
19cd0 64 28 6b 65 79 29 0a 63 68 61 72 20 2a 6b 65 79  d(key).char *key
19ce0 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ;.{.  int h;.  x
19cf0 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  1node *np;..  if
19d00 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
19d10 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61  n 0;.  h = strha
19d20 73 68 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e  sh(key) & (x1a->
19d30 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
19d40 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x1a->ht[h];.  wh
19d50 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
19d60 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61  f( strcmp(np->da
19d70 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  ta,key)==0 ) bre
19d80 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
19d90 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
19da0 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
19db0 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  a : 0;.}../* Ret
19dc0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
19dd0 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f   the (terminal o
19de0 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73  r nonterminal) s
19df0 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72  ymbol "x"..** Cr
19e00 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
19e10 6c 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  l if this is the
19e20 20 66 69 72 73 74 20 74 69 6d 65 20 22 78 22 20   first time "x" 
19e30 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a  has been seen..*
19e40 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
19e50 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 0a 63  *Symbol_new(x).c
19e60 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 73 74 72 75  har *x;.{.  stru
19e70 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a  ct symbol *sp;..
19e80 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69    sp = Symbol_fi
19e90 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70 3d  nd(x);.  if( sp=
19ea0 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28  =0 ){.    sp = (
19eb0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
19ec0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
19ed0 74 72 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b  truct symbol) );
19ee0 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b  .    MemoryCheck
19ef0 28 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61  (sp);.    sp->na
19f00 6d 65 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b  me = Strsafe(x);
19f10 0a 20 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20  .    sp->type = 
19f20 69 73 75 70 70 65 72 28 2a 78 29 20 3f 20 54 45  isupper(*x) ? TE
19f30 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d  RMINAL : NONTERM
19f40 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75  INAL;.    sp->ru
19f50 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  le = 0;.    sp->
19f60 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  fallback = 0;.  
19f70 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b    sp->prec = -1;
19f80 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d  .    sp->assoc =
19f90 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69   UNK;.    sp->fi
19fa0 72 73 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  rstset = 0;.    
19fb0 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 46 41 4c  sp->lambda = FAL
19fc0 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74  SE;.    sp->dest
19fd0 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20  ructor = 0;.    
19fe0 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d 20 30  sp->datatype = 0
19ff0 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73  ;.    Symbol_ins
1a000 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29  ert(sp,sp->name)
1a010 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
1a020 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  p;.}../* Compare
1a030 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a   two symbols */.
1a040 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 61  int Symbolcmpp(a
1a050 2c 62 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  ,b).struct symbo
1a060 6c 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73 79  l **a;.struct sy
1a070 6d 62 6f 6c 20 2a 2a 62 3b 0a 7b 0a 20 20 72 65  mbol **b;.{.  re
1a080 74 75 72 6e 20 73 74 72 63 6d 70 28 28 2a 2a 61  turn strcmp((**a
1a090 29 2e 6e 61 6d 65 2c 28 2a 2a 62 29 2e 6e 61 6d  ).name,(**b).nam
1a0a0 65 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  e);.}../* There 
1a0b0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
1a0c0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1a0d0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
1a0e0 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
1a0f0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
1a100 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x2"..*/.struct
1a110 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69   s_x2 {.  int si
1a120 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1a130 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1a140 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
1a150 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a170 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
1a180 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
1a190 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
1a1c0 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
1a1d0 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
1a1e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a1f0 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
1a200 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
1a210 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74  ruct s_x2node *t
1a220 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
1a230 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
1a240 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
1a250 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
1a260 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
1a270 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
1a280 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1a290 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
1a2a0 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
1a2b0 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
1a2c0 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
1a2d0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
1a2e0 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x2"..*/.typedef 
1a2f0 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
1a300 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
1a310 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  l *data;        
1a320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a330 20 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20   data */.  char 
1a340 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  *key;           
1a350 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
1a360 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ey */.  struct s
1a370 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x2node *next;  
1a380 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
1a390 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
1a3a0 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
1a3b0 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x2node **from;  
1a3c0 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
1a3d0 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f   */.} x2node;../
1a3e0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
1a3f0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
1a400 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
1a410 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
1a420 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
1a430 63 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f  ct s_x2 *x2a;../
1a440 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
1a450 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1a460 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f  ay */.void Symbo
1a470 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  l_init(){.  if( 
1a480 78 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x2a ) return;.  
1a490 78 32 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x2a = (struct s_
1a4a0 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x2*)malloc( size
1a4b0 6f 66 28 73 74 72 75 63 74 20 73 5f 78 32 29 20  of(struct s_x2) 
1a4c0 29 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a  );.  if( x2a ){.
1a4d0 20 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20      x2a->size = 
1a4e0 31 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f  128;.    x2a->co
1a4f0 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61  unt = 0;.    x2a
1a500 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a  ->tbl = (x2node*
1a510 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20  )malloc( .      
1a520 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20  (sizeof(x2node) 
1a530 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a  + sizeof(x2node*
1a540 29 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66  ))*128 );.    if
1a550 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x2a->tbl==0 ){
1a560 0a 20 20 20 20 20 20 66 72 65 65 28 78 32 61 29  .      free(x2a)
1a570 3b 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30 3b  ;.      x2a = 0;
1a580 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a590 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
1a5a0 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64 65  2a->ht = (x2node
1a5b0 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31 32  **)&(x2a->tbl[12
1a5c0 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  8]);.      for(i
1a5d0 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20  =0; i<128; i++) 
1a5e0 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x2a->ht[i] = 0;.
1a5f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49      }.  }.}./* I
1a600 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
1a610 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61  rd into the arra
1a620 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  y.  Return TRUE 
1a630 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
1a640 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74  * Prior data wit
1a650 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
1a660 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65  s NOT overwritte
1a670 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f  n */.int Symbol_
1a680 69 6e 73 65 72 74 28 64 61 74 61 2c 6b 65 79 29  insert(data,key)
1a690 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
1a6a0 64 61 74 61 3b 0a 63 68 61 72 20 2a 6b 65 79 3b  data;.char *key;
1a6b0 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b  .{.  x2node *np;
1a6c0 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
1a6d0 70 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d  ph;..  if( x2a==
1a6e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1a6f0 70 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79  ph = strhash(key
1a700 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
1a710 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  2a->size-1);.  n
1a720 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x2a->ht[h];.
1a730 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
1a740 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
1a750 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b  ->key,key)==0 ){
1a760 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
1a770 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
1a780 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
1a790 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
1a7a0 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
1a7b0 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
1a7c0 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
1a7d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1a7e0 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
1a7f0 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
1a800 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d  x2a->count>=x2a-
1a810 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
1a820 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
1a830 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
1a840 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
1a850 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
1a860 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20   s_x2 array;.   
1a870 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
1a880 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32  ze = x2a->size*2
1a890 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
1a8a0 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x2a->count;.
1a8b0 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
1a8c0 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x2node*)malloc(
1a8d0 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
1a8e0 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  2node) + sizeof(
1a8f0 78 32 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x2node*))*size )
1a900 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
1a910 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
1a920 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
1a930 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
1a940 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
1a950 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28  t = (x2node**)&(
1a960 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
1a970 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1a980 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
1a990 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
1a9a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d   for(i=0; i<x2a-
1a9b0 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
1a9c0 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e      x2node *oldn
1a9d0 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
1a9e0 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e   oldnp = &(x2a->
1a9f0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
1aa00 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
1aa10 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31  ->key) & (size-1
1aa20 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
1aa30 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
1aa40 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
1aa50 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
1aa60 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
1aa70 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
1aa80 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
1aa90 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
1aaa0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20       newnp->key 
1aab0 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20  = oldnp->key;.  
1aac0 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
1aad0 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
1aae0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
1aaf0 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
1ab00 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
1ab10 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
1ab20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61    }.    free(x2a
1ab30 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61  ->tbl);.    *x2a
1ab40 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
1ab50 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
1ab60 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
1ab70 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  ph & (x2a->size-
1ab80 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61  1);.  np = &(x2a
1ab90 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74  ->tbl[x2a->count
1aba0 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20  ++]);.  np->key 
1abb0 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74  = key;.  np->dat
1abc0 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
1abd0 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61  x2a->ht[h] ) x2a
1abe0 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
1abf0 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
1ac00 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68  p->next = x2a->h
1ac10 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b  t[h];.  x2a->ht[
1ac20 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
1ac30 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b  rom = &(x2a->ht[
1ac40 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
1ac50 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
1ac60 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
1ac70 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
1ac80 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
1ac90 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
1aca0 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
1acb0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
1acc0 62 6f 6c 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68  bol_find(key).ch
1acd0 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74  ar *key;.{.  int
1ace0 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70   h;.  x2node *np
1acf0 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20  ;..  if( x2a==0 
1ad00 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
1ad10 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26  = strhash(key) &
1ad20 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
1ad30 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68    np = x2a->ht[h
1ad40 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
1ad50 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
1ad60 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
1ad70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
1ad80 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
1ad90 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
1ada0 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
1adb0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d  /* Return the n-
1adc0 74 68 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e  th data.  Return
1add0 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75   NULL if n is ou
1ade0 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73  t of range. */.s
1adf0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
1ae00 6d 62 6f 6c 5f 4e 74 68 28 6e 29 0a 69 6e 74 20  mbol_Nth(n).int 
1ae10 6e 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  n;.{.  struct sy
1ae20 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66  mbol *data;.  if
1ae30 28 20 78 32 61 20 26 26 20 6e 3e 30 20 26 26 20  ( x2a && n>0 && 
1ae40 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b  n<=x2a->count ){
1ae50 0a 20 20 20 20 64 61 74 61 20 3d 20 78 32 61 2d  .    data = x2a-
1ae60 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a  >tbl[n-1].data;.
1ae70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74    }else{.    dat
1ae80 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  a = 0;.  }.  ret
1ae90 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20  urn data;.}../* 
1aea0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
1aeb0 6f 66 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  of the array */.
1aec0 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  int Symbol_count
1aed0 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78 32  ().{.  return x2
1aee0 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a  a ? x2a->count :
1aef0 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
1af00 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
1af10 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74  nters to all dat
1af20 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  a in the table..
1af30 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20  ** The array is 
1af40 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
1af50 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55  lloc.  Return NU
1af60 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c  LL if memory all
1af70 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c  ocation.** probl
1af80 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61  ems, or if the a
1af90 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a  rray is empty. *
1afa0 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
1afb0 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66  **Symbol_arrayof
1afc0 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  ().{.  struct sy
1afd0 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20  mbol **array;.  
1afe0 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66  int i,size;.  if
1aff0 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
1b000 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 32  n 0;.  size = x2
1b010 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61  a->count;.  arra
1b020 79 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  y = (struct symb
1b030 6f 6c 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  ol **)malloc( si
1b040 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
1b050 6f 6c 20 2a 29 2a 73 69 7a 65 20 29 3b 0a 20 20  ol *)*size );.  
1b060 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20  if( array ){.   
1b070 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1b080 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20  ; i++) array[i] 
1b090 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61  = x2a->tbl[i].da
1b0a0 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ta;.  }.  return
1b0b0 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f   array;.}../* Co
1b0c0 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69 67  mpare two config
1b0d0 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20  urations */.int 
1b0e0 43 6f 6e 66 69 67 63 6d 70 28 61 2c 62 29 0a 73  Configcmp(a,b).s
1b0f0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b  truct config *a;
1b100 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1b110 62 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b 0a 20 20  b;.{.  int x;.  
1b120 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  x = a->rp->index
1b130 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b   - b->rp->index;
1b140 0a 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20  .  if( x==0 ) x 
1b150 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f  = a->dot - b->do
1b160 74 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d  t;.  return x;.}
1b170 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
1b180 20 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41   states */.PRIVA
1b190 54 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28  TE int statecmp(
1b1a0 61 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  a,b).struct conf
1b1b0 69 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f  ig *a;.struct co
1b1c0 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74  nfig *b;.{.  int
1b1d0 20 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b   rc;.  for(rc=0;
1b1e0 20 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62   rc==0 && a && b
1b1f0 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d  ;  a=a->bp, b=b-
1b200 3e 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  >bp){.    rc = a
1b210 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d  ->rp->index - b-
1b220 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20  >rp->index;.    
1b230 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1b240 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74   a->dot - b->dot
1b250 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1b260 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29  0 ){.    if( a )
1b270 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28   rc = 1;.    if(
1b280 20 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20   b ) rc = -1;.  
1b290 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b2a0 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74  ../* Hash a stat
1b2b0 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  e */.PRIVATE int
1b2c0 20 73 74 61 74 65 68 61 73 68 28 61 29 0a 73 74   statehash(a).st
1b2d0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a  ruct config *a;.
1b2e0 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 77  {.  int h=0;.  w
1b2f0 68 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68  hile( a ){.    h
1b300 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70   = h*571 + a->rp
1b310 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e  ->index*37 + a->
1b320 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e  dot;.    a = a->
1b330 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  bp;.  }.  return
1b340 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61   h;.}../* Alloca
1b350 74 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73  te a new state s
1b360 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75  tructure */.stru
1b370 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
1b380 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74  new().{.  struct
1b390 20 73 74 61 74 65 20 2a 6e 65 77 3b 0a 20 20 6e   state *new;.  n
1b3a0 65 77 20 3d 20 28 73 74 72 75 63 74 20 73 74 61  ew = (struct sta
1b3b0 74 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  te *)malloc( siz
1b3c0 65 6f 66 28 73 74 72 75 63 74 20 73 74 61 74 65  eof(struct state
1b3d0 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65  ) );.  MemoryChe
1b3e0 63 6b 28 6e 65 77 29 3b 0a 20 20 72 65 74 75 72  ck(new);.  retur
1b3f0 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  n new;.}../* The
1b400 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1b410 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1b420 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
1b430 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
1b440 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
1b450 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72  ype "x3"..*/.str
1b460 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74  uct s_x3 {.  int
1b470 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
1b480 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1b490 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
1b4a0 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4c0 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
1b4d0 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
1b4e0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
1b4f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1b510 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
1b520 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
1b530 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b540 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
1b550 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
1b560 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
1b570 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
1b580 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
1b590 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
1b5a0 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
1b5b0 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
1b5c0 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
1b5d0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1b5e0 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
1b5f0 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
1b600 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
1b610 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
1b620 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
1b630 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x3"..*/.typed
1b640 65 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  ef struct s_x3no
1b650 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  de {.  struct st
1b660 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20 20  ate *data;      
1b670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b680 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72  he data */.  str
1b690 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b  uct config *key;
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
1b6c0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
1b6d0 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
1b6e0 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
1b6f0 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
1b700 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
1b710 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
1b720 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
1b730 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x3node;../* The
1b740 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
1b750 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
1b760 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
1b770 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
1b780 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
1b790 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c  x3 *x3a;../* All
1b7a0 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
1b7b0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
1b7c0 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74  .void State_init
1b7d0 28 29 7b 0a 20 20 69 66 28 20 78 33 61 20 29 20  (){.  if( x3a ) 
1b7e0 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20  return;.  x3a = 
1b7f0 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29 6d 61  (struct s_x3*)ma
1b800 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
1b810 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20 20 69  uct s_x3) );.  i
1b820 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20 78 33  f( x3a ){.    x3
1b830 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20  a->size = 128;. 
1b840 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20     x3a->count = 
1b850 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62 6c 20  0;.    x3a->tbl 
1b860 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f  = (x3node*)mallo
1b870 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f  c( .      (sizeo
1b880 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x3node) + size
1b890 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 31 32 38  of(x3node*))*128
1b8a0 20 29 3b 0a 20 20 20 20 69 66 28 20 78 33 61 2d   );.    if( x3a-
1b8b0 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
1b8c0 20 66 72 65 65 28 78 33 61 29 3b 0a 20 20 20 20   free(x3a);.    
1b8d0 20 20 78 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x3a = 0;.    }
1b8e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1b8f0 69 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e 68 74  i;.      x3a->ht
1b900 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78   = (x3node**)&(x
1b910 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20  3a->tbl[128]);. 
1b920 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1b930 31 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68  128; i++) x3a->h
1b940 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
1b950 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
1b960 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
1b970 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
1b980 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
1b990 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
1b9a0 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
1b9b0 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
1b9c0 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
1b9d0 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28  nt State_insert(
1b9e0 64 61 74 61 2c 6b 65 79 29 0a 73 74 72 75 63 74  data,key).struct
1b9f0 20 73 74 61 74 65 20 2a 64 61 74 61 3b 0a 73 74   state *data;.st
1ba00 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
1ba10 3b 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70  ;.{.  x3node *np
1ba20 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74  ;.  int h;.  int
1ba30 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d   ph;..  if( x3a=
1ba40 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1ba50 20 70 68 20 3d 20 73 74 61 74 65 68 61 73 68 28   ph = statehash(
1ba60 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26  key);.  h = ph &
1ba70 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x3a->size-1);.
1ba80 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68    np = x3a->ht[h
1ba90 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
1baa0 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63  {.    if( statec
1bab0 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d  mp(np->key,key)=
1bac0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
1bad0 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
1bae0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
1baf0 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
1bb00 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
1bb10 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
1bb20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
1bb30 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
1bb40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
1bb50 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
1bb60 20 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e   if( x3a->count>
1bb70 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x3a->size ){.  
1bb80 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
1bb90 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
1bba0 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
1bbb0 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73  nt i,size;.    s
1bbc0 74 72 75 63 74 20 73 5f 78 33 20 61 72 72 61 79  truct s_x3 array
1bbd0 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
1bbe0 20 3d 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 73   = size = x3a->s
1bbf0 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
1bc00 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f  .count = x3a->co
1bc10 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
1bc20 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61  bl = (x3node*)ma
1bc30 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a  lloc(.      (siz
1bc40 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69  eof(x3node) + si
1bc50 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 73  zeof(x3node*))*s
1bc60 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61  ize );.    if( a
1bc70 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
1bc80 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
1bc90 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
1bca0 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
1bcb0 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65  ray.ht = (x3node
1bcc0 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73  **)&(array.tbl[s
1bcd0 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
1bce0 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
1bcf0 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
1bd00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1bd10 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x3a->count; i++
1bd20 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65 20  ){.      x3node 
1bd30 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
1bd40 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
1bd50 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x3a->tbl[i]);.  
1bd60 20 20 20 20 68 20 3d 20 73 74 61 74 65 68 61 73      h = statehas
1bd70 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20  h(oldnp->key) & 
1bd80 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  (size-1);.      
1bd90 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
1bda0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
1bdb0 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
1bdc0 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
1bdd0 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
1bde0 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
1bdf0 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
1be00 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
1be10 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e  p->key = oldnp->
1be20 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  key;.      newnp
1be30 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e  ->data = oldnp->
1be40 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e  data;.      newn
1be50 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61  p->from = &(arra
1be60 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20  y.ht[h]);.      
1be70 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65  array.ht[h] = ne
1be80 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  wnp;.    }.    f
1be90 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20  ree(x3a->tbl);. 
1bea0 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79 3b     *x3a = array;
1beb0 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74  .  }.  /* Insert
1bec0 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f   the new data */
1bed0 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61  .  h = ph & (x3a
1bee0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
1bef0 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61  = &(x3a->tbl[x3a
1bf00 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e  ->count++]);.  n
1bf10 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20  p->key = key;.  
1bf20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
1bf30 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b 68  .  if( x3a->ht[h
1bf40 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x3a->ht[h]->
1bf50 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
1bf60 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
1bf70 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x3a->ht[h];.  x
1bf80 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  3a->ht[h] = np;.
1bf90 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
1bfa0 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  3a->ht[h]);.  re
1bfb0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
1bfc0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1bfd0 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
1bfe0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
1bff0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
1c000 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
1c010 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
1c020 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 6b 65  e *State_find(ke
1c030 79 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  y).struct config
1c040 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68   *key;.{.  int h
1c050 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a  ;.  x3node *np;.
1c060 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
1c070 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20  return 0;.  h = 
1c080 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 20 26  statehash(key) &
1c090 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x3a->size-1);.
1c0a0 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68    np = x3a->ht[h
1c0b0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
1c0c0 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63  {.    if( statec
1c0d0 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d  mp(np->key,key)=
1c0e0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1c0f0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
1c100 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f   }.  return np ?
1c110 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d   np->data : 0;.}
1c120 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  ../* Return an a
1c130 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
1c140 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20   to all data in 
1c150 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  the table..** Th
1c160 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
1c170 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
1c180 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
1c190 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1c1a0 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20  on.** problems, 
1c1b0 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20  or if the array 
1c1c0 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72  is empty. */.str
1c1d0 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74  uct state **Stat
1c1e0 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20  e_arrayof().{.  
1c1f0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 61  struct state **a
1c200 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69  rray;.  int i,si
1c210 7a 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30  ze;.  if( x3a==0
1c220 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
1c230 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74  ize = x3a->count
1c240 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72  ;.  array = (str
1c250 75 63 74 20 73 74 61 74 65 20 2a 2a 29 6d 61 6c  uct state **)mal
1c260 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
1c270 63 74 20 73 74 61 74 65 20 2a 29 2a 73 69 7a 65  ct state *)*size
1c280 20 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20   );.  if( array 
1c290 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
1c2a0 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  i<size; i++) arr
1c2b0 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c  ay[i] = x3a->tbl
1c2c0 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20  [i].data;.  }.  
1c2d0 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a  return array;.}.
1c2e0 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66 69  ./* Hash a confi
1c2f0 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56  guration */.PRIV
1c300 41 54 45 20 69 6e 74 20 63 6f 6e 66 69 67 68 61  ATE int configha
1c310 73 68 28 61 29 0a 73 74 72 75 63 74 20 63 6f 6e  sh(a).struct con
1c320 66 69 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20  fig *a;.{.  int 
1c330 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31  h=0;.  h = h*571
1c340 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a   + a->rp->index*
1c350 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72  37 + a->dot;.  r
1c360 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54  eturn h;.}../* T
1c370 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
1c380 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1c390 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1c3a0 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f  for each.** asso
1c3b0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
1c3c0 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73   type "x4"..*/.s
1c3d0 74 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20 69  truct s_x4 {.  i
1c3e0 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
1c3f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
1c400 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1c410 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20  e slots. */.    
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c430 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20        /*   Must 
1c440 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
1c450 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1c460 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c480 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a    equal to 1 */.
1c490 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20    int count;    
1c4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c4b0 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79  ber of currently
1c4c0 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f   slots filled */
1c4d0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
1c4e0 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65  de *tbl;  /* The
1c4f0 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72   data stored her
1c500 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  e */.  struct s_
1c510 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a  x4node **ht;  /*
1c520 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   Hash table for 
1c530 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f  lookups */.};../
1c540 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
1c550 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
1c560 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76  structure for ev
1c570 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ery data element
1c580 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69  .** in an associ
1c590 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
1c5a0 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70  ype "x4"..*/.typ
1c5b0 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 34  edef struct s_x4
1c5c0 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20  node {.  struct 
1c5d0 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20 20  config *data;   
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c5f0 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
1c600 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
1c610 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
1c620 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
1c630 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
1c640 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
1c650 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
1c660 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34  ous link */.} x4
1c670 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
1c680 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
1c690 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
1c6a0 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
1c6b0 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
1c6c0 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 34 20  tic struct s_x4 
1c6d0 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x4a;../* Alloca
1c6e0 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
1c6f0 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
1c700 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  id Configtable_i
1c710 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 34 61  nit(){.  if( x4a
1c720 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 34 61   ) return;.  x4a
1c730 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 34 2a   = (struct s_x4*
1c740 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
1c750 73 74 72 75 63 74 20 73 5f 78 34 29 20 29 3b 0a  struct s_x4) );.
1c760 20 20 69 66 28 20 78 34 61 20 29 7b 0a 20 20 20    if( x4a ){.   
1c770 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b   x4a->size = 64;
1c780 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20  .    x4a->count 
1c790 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62  = 0;.    x4a->tb
1c7a0 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c  l = (x4node*)mal
1c7b0 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a  loc( .      (siz
1c7c0 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69  eof(x4node) + si
1c7d0 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 36  zeof(x4node*))*6
1c7e0 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 34 61  4 );.    if( x4a
1c7f0 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
1c800 20 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20 20    free(x4a);.   
1c810 20 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20 20     x4a = 0;.    
1c820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1c830 20 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e 68   i;.      x4a->h
1c840 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28  t = (x4node**)&(
1c850 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20  x4a->tbl[64]);. 
1c860 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1c870 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74  64; i++) x4a->ht
1c880 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
1c890 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
1c8a0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
1c8b0 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
1c8c0 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
1c8d0 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
1c8e0 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
1c8f0 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
1c900 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
1c910 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  t Configtable_in
1c920 73 65 72 74 28 64 61 74 61 29 0a 73 74 72 75 63  sert(data).struc
1c930 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 0a  t config *data;.
1c940 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x4node *np;.
1c950 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70    int h;.  int p
1c960 68 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30  h;..  if( x4a==0
1c970 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1c980 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 64  h = confighash(d
1c990 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26  ata);.  h = ph &
1c9a0 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
1c9b0 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68    np = x4a->ht[h
1c9c0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
1c9d0 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67  {.    if( Config
1c9e0 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74  cmp(np->data,dat
1c9f0 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  a)==0 ){.      /
1ca00 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
1ca10 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
1ca20 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
1ca30 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
1ca40 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
1ca50 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
1ca60 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
1ca70 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
1ca80 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
1ca90 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f 75  }.  if( x4a->cou
1caa0 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x4a->size ){
1cab0 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
1cac0 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1cad0 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
1cae0 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
1caf0 20 20 73 74 72 75 63 74 20 73 5f 78 34 20 61 72    struct s_x4 ar
1cb00 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
1cb10 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 34 61  ize = size = x4a
1cb20 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
1cb30 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d  ray.count = x4a-
1cb40 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
1cb50 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a  y.tbl = (x4node*
1cb60 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28  )malloc(.      (
1cb70 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b  sizeof(x4node) +
1cb80 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29   sizeof(x4node*)
1cb90 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  )*size );.    if
1cba0 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
1cbb0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
1cbc0 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
1cbd0 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
1cbe0 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34 6e   array.ht = (x4n
1cbf0 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
1cc00 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  l[size]);.    fo
1cc10 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
1cc20 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
1cc30 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
1cc40 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x4a->count; 
1cc50 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e 6f  i++){.      x4no
1cc60 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
1cc70 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
1cc80 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x4a->tbl[i]);
1cc90 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66 69  .      h = confi
1cca0 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74  ghash(oldnp->dat
1ccb0 61 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20  a) & (size-1);. 
1ccc0 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
1ccd0 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
1cce0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
1ccf0 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
1cd00 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
1cd10 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
1cd20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
1cd30 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
1cd40 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f   newnp->data = o
1cd50 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20  ldnp->data;.    
1cd60 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20    newnp->from = 
1cd70 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a  &(array.ht[h]);.
1cd80 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68        array.ht[h
1cd90 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d  ] = newnp;.    }
1cda0 0a 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e 74  .    free(x4a->t
1cdb0 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20  bl);.    *x4a = 
1cdc0 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20  array;.  }.  /* 
1cdd0 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
1cde0 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20  ata */.  h = ph 
1cdf0 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x4a->size-1);
1ce00 0a 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74  .  np = &(x4a->t
1ce10 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d  bl[x4a->count++]
1ce20 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  );.  np->data = 
1ce30 64 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61 2d  data;.  if( x4a-
1ce40 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74  >ht[h] ) x4a->ht
1ce50 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
1ce60 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
1ce70 65 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d  ext = x4a->ht[h]
1ce80 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x4a->ht[h] =
1ce90 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
1cea0 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x4a->ht[h]);
1ceb0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1cec0 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
1ced0 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
1cee0 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
1cef0 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
1cf00 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
1cf10 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74  h key. */.struct
1cf20 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74   config *Configt
1cf30 61 62 6c 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73  able_find(key).s
1cf40 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
1cf50 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  y;.{.  int h;.  
1cf60 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69  x4node *np;..  i
1cf70 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75  f( x4a==0 ) retu
1cf80 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66  rn 0;.  h = conf
1cf90 69 67 68 61 73 68 28 6b 65 79 29 20 26 20 28 78  ighash(key) & (x
1cfa0 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
1cfb0 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x4a->ht[h];.
1cfc0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
1cfd0 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70     if( Configcmp
1cfe0 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d  (np->data,key)==
1cff0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
1d000 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
1d010 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
1d020 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
1d030 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64  ./* Remove all d
1d040 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62  ata from the tab
1d050 6c 65 2e 20 20 50 61 73 73 20 65 61 63 68 20 64  le.  Pass each d
1d060 61 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ata to the funct
1d070 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69 74  ion "f".** as it
1d080 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28 22   is removed.  ("
1d090 66 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74  f" may be null t
1d0a0 6f 20 61 76 6f 69 64 20 74 68 69 73 20 73 74 65  o avoid this ste
1d0b0 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  p.) */.void Conf
1d0c0 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 66 29  igtable_clear(f)
1d0d0 0a 69 6e 74 28 2a 66 29 28 2f 2a 20 73 74 72 75  .int(*f)(/* stru
1d0e0 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b  ct config * */);
1d0f0 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  .{.  int i;.  if
1d100 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d  ( x4a==0 || x4a-
1d110 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74 75  >count==0 ) retu
1d120 72 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66 6f  rn;.  if( f ) fo
1d130 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f  r(i=0; i<x4a->co
1d140 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78  unt; i++) (*f)(x
1d150 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29  4a->tbl[i].data)
1d160 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78  ;.  for(i=0; i<x
1d170 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78  4a->size; i++) x
1d180 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  4a->ht[i] = 0;. 
1d190 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x4a->count = 0;
1d1a0 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a           .  return;.}.