/ Hex Artifact Content
Login

Artifact 0bae9c6743cfe6597e8f35f50900949d6c0f056d:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 0a 23 69 66   <stdlib.h>..#if
0190: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
01a0: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
01b0: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
01c0: 28 57 49 4e 33 32 29 0a 23 09 64 65 66 69 6e 65  (WIN32).#.define
01d0: 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23 20 20 20 65   __WIN32__.#   e
01e0: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  ndif.#endif../* 
01f0: 23 64 65 66 69 6e 65 20 50 52 49 56 41 54 45 20  #define PRIVATE 
0200: 73 74 61 74 69 63 20 2a 2f 0a 23 64 65 66 69 6e  static */.#defin
0210: 65 20 50 52 49 56 41 54 45 0a 0a 23 69 66 64 65  e PRIVATE..#ifde
0220: 66 20 54 45 53 54 0a 23 64 65 66 69 6e 65 20 4d  f TEST.#define M
0230: 41 58 52 48 53 20 35 20 20 20 20 20 20 20 2f 2a  AXRHS 5       /*
0240: 20 53 65 74 20 6c 6f 77 20 74 6f 20 65 78 65 72   Set low to exer
0250: 63 69 73 65 20 65 78 63 65 70 74 69 6f 6e 20 63  cise exception c
0260: 6f 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65  ode */.#else.#de
0270: 66 69 6e 65 20 4d 41 58 52 48 53 20 31 30 30 30  fine MAXRHS 1000
0280: 0a 23 65 6e 64 69 66 0a 0a 63 68 61 72 20 2a 6d  .#endif..char *m
0290: 73 6f 72 74 28 29 3b 0a 65 78 74 65 72 6e 20 76  sort();.extern v
02a0: 6f 69 64 20 2a 6d 61 6c 6c 6f 63 28 29 3b 0a 0a  oid *malloc();..
02b0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  /******** From t
02c0: 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e  he file "action.
02d0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
02e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
02f0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74  ********/.struct
0300: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
0310: 6e 65 77 28 29 3b 0a 73 74 72 75 63 74 20 61 63  new();.struct ac
0320: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72  tion *Action_sor
0330: 74 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  t();../*********
0340: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
0350: 61 73 73 65 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  assert.h" ******
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0380: 76 6f 69 64 20 6d 79 61 73 73 65 72 74 28 29 3b  void myassert();
0390: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
03a0: 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74  #  define assert
03b0: 28 58 29 20 69 66 28 21 28 58 29 29 6d 79 61 73  (X) if(!(X))myas
03c0: 73 65 72 74 28 5f 5f 46 49 4c 45 5f 5f 2c 5f 5f  sert(__FILE__,__
03d0: 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23 20  LINE__).#else.# 
03e0: 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 28 58   define assert(X
03f0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a 2a 2a 2a  ).#endif../*****
0400: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
0410: 69 6c 65 20 22 62 75 69 6c 64 2e 68 22 20 2a 2a  ile "build.h" **
0420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0440: 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c  **/.void FindRul
0450: 65 50 72 65 63 65 64 65 6e 63 65 73 28 29 3b 0a  ePrecedences();.
0460: 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53 65  void FindFirstSe
0470: 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53  ts();.void FindS
0480: 74 61 74 65 73 28 29 3b 0a 76 6f 69 64 20 46 69  tates();.void Fi
0490: 6e 64 4c 69 6e 6b 73 28 29 3b 0a 76 6f 69 64 20  ndLinks();.void 
04a0: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 29  FindFollowSets()
04b0: 3b 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69 6f  ;.void FindActio
04c0: 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ns();../********
04d0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
04e0: 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22 20 2a  "configlist.h" *
04f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0510: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
0520: 74 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a  t_init(/* void *
0530: 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  /);.struct confi
0540: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  g *Configlist_ad
0550: 64 28 2f 2a 20 73 74 72 75 63 74 20 72 75 6c 65  d(/* struct rule
0560: 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a 73 74 72   *, int */);.str
0570: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
0580: 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28  iglist_addbasis(
0590: 2f 2a 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  /* struct rule *
05a0: 2c 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64 20  , int */);.void 
05b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
05c0: 72 65 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  re(/* void */);.
05d0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
05e0: 73 6f 72 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  sort(/* void */)
05f0: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
0600: 74 5f 73 6f 72 74 62 61 73 69 73 28 2f 2a 20 76  t_sortbasis(/* v
0610: 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  oid */);.struct 
0620: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
0630: 73 74 5f 72 65 74 75 72 6e 28 2f 2a 20 76 6f 69  st_return(/* voi
0640: 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f  d */);.struct co
0650: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
0660: 5f 62 61 73 69 73 28 2f 2a 20 76 6f 69 64 20 2a  _basis(/* void *
0670: 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  /);.void Configl
0680: 69 73 74 5f 65 61 74 28 2f 2a 20 73 74 72 75 63  ist_eat(/* struc
0690: 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a  t config * */);.
06a0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
06b0: 72 65 73 65 74 28 2f 2a 20 76 6f 69 64 20 2a 2f  reset(/* void */
06c0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
06d0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72  rom the file "er
06e0: 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ror.h" *********
06f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0710: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f  void ErrorMsg(co
0720: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c  nst char *, int,
0730: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 2e 2e  const char *, ..
0740: 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f  .);../****** Fro
0750: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
0760: 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.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 2a 2a  ****************
0790: 2f 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  /.struct s_optio
07a0: 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 7b 20 4f 50  ns {.  enum { OP
07b0: 54 5f 46 4c 41 47 3d 31 2c 20 20 4f 50 54 5f 49  T_FLAG=1,  OPT_I
07c0: 4e 54 2c 20 20 4f 50 54 5f 44 42 4c 2c 20 20 4f  NT,  OPT_DBL,  O
07d0: 50 54 5f 53 54 52 2c 0a 20 20 20 20 20 20 20 20  PT_STR,.        
07e0: 20 4f 50 54 5f 46 46 4c 41 47 2c 20 4f 50 54 5f   OPT_FFLAG, OPT_
07f0: 46 49 4e 54 2c 20 4f 50 54 5f 46 44 42 4c 2c 20  FINT, OPT_FDBL, 
0800: 4f 50 54 5f 46 53 54 52 7d 20 74 79 70 65 3b 0a  OPT_FSTR} type;.
0810: 20 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 20    char *label;. 
0820: 20 63 68 61 72 20 2a 61 72 67 3b 0a 20 20 63 68   char *arg;.  ch
0830: 61 72 20 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a  ar *message;.};.
0840: 69 6e 74 20 20 20 20 4f 70 74 49 6e 69 74 28 2f  int    OptInit(/
0850: 2a 20 63 68 61 72 2a 2a 2c 73 74 72 75 63 74 20  * char**,struct 
0860: 73 5f 6f 70 74 69 6f 6e 73 2a 2c 46 49 4c 45 2a  s_options*,FILE*
0870: 20 2a 2f 29 3b 0a 69 6e 74 20 20 20 20 4f 70 74   */);.int    Opt
0880: 4e 41 72 67 73 28 2f 2a 20 76 6f 69 64 20 2a 2f  NArgs(/* void */
0890: 29 3b 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67  );.char  *OptArg
08a0: 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69  (/* int */);.voi
08b0: 64 20 20 20 4f 70 74 45 72 72 28 2f 2a 20 69 6e  d   OptErr(/* in
08c0: 74 20 2a 2f 29 3b 0a 76 6f 69 64 20 20 20 4f 70  t */);.void   Op
08d0: 74 50 72 69 6e 74 28 2f 2a 20 76 6f 69 64 20 2a  tPrint(/* void *
08e0: 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46  /);../******** F
08f0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61  rom the file "pa
0900: 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  rse.h" *********
0910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0930: 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 2f 2a 20  /.void Parse(/* 
0940: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
0950: 6d 70 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  mp */);../******
0960: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0970: 65 20 22 70 6c 69 6e 6b 2e 68 22 20 2a 2a 2a 2a  e "plink.h" ****
0980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09a0: 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e  ***/.struct plin
09b0: 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 2f 2a 20  k *Plink_new(/* 
09c0: 76 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 50  void */);.void P
09d0: 6c 69 6e 6b 5f 61 64 64 28 2f 2a 20 73 74 72 75  link_add(/* stru
09e0: 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72  ct plink **, str
09f0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29  uct config * */)
0a00: 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70  ;.void Plink_cop
0a10: 79 28 2f 2a 20 73 74 72 75 63 74 20 70 6c 69 6e  y(/* struct plin
0a20: 6b 20 2a 2a 2c 20 73 74 72 75 63 74 20 70 6c 69  k **, struct pli
0a30: 6e 6b 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 50  nk * */);.void P
0a40: 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 2f 2a 20 73  link_delete(/* s
0a50: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 20 2a 2f  truct plink * */
0a60: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  );../********** 
0a70: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72  From the file "r
0a80: 65 70 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  eport.h" *******
0a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0ab0: 76 6f 69 64 20 52 65 70 72 69 6e 74 28 2f 2a 20  void Reprint(/* 
0ac0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a  struct lemon * *
0ad0: 2f 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f  /);.void ReportO
0ae0: 75 74 70 75 74 28 2f 2a 20 73 74 72 75 63 74 20  utput(/* struct 
0af0: 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69  lemon * */);.voi
0b00: 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28 2f 2a  d ReportTable(/*
0b10: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20   struct lemon * 
0b20: 2a 2f 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74  */);.void Report
0b30: 48 65 61 64 65 72 28 2f 2a 20 73 74 72 75 63 74  Header(/* struct
0b40: 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f   lemon * */);.vo
0b50: 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65  id CompressTable
0b60: 73 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  s(/* struct lemo
0b70: 6e 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  n * */);../*****
0b80: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
0b90: 69 6c 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a  ile "set.h" ****
0ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bc0: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53  ****/.void  SetS
0bd0: 69 7a 65 28 2f 2a 20 69 6e 74 20 4e 20 2a 2f 29  ize(/* int N */)
0be0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0bf0: 20 41 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62   All sets will b
0c00: 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63  e of size N */.c
0c10: 68 61 72 20 2a 53 65 74 4e 65 77 28 2f 2a 20 76  har *SetNew(/* v
0c20: 6f 69 64 20 2a 2f 29 3b 20 20 20 20 20 20 20 20  oid */);        
0c30: 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20         /* A new 
0c40: 73 65 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20  set for element 
0c50: 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65  0..N */.void  Se
0c60: 74 46 72 65 65 28 2f 2a 20 63 68 61 72 2a 20 2a  tFree(/* char* *
0c70: 2f 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  /);             
0c80: 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  /* Deallocate a 
0c90: 73 65 74 20 2a 2f 0a 0a 69 6e 74 20 53 65 74 41  set */..int SetA
0ca0: 64 64 28 2f 2a 20 63 68 61 72 2a 2c 69 6e 74 20  dd(/* char*,int 
0cb0: 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  */);            
0cc0: 2f 2a 20 41 64 64 20 65 6c 65 6d 65 6e 74 20 74  /* Add element t
0cd0: 6f 20 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53  o a set */.int S
0ce0: 65 74 55 6e 69 6f 6e 28 2f 2a 20 63 68 61 72 20  etUnion(/* char 
0cf0: 2a 41 2c 63 68 61 72 20 2a 42 20 2a 2f 29 3b 20  *A,char *B */); 
0d00: 20 20 20 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42     /* A <- A U B
0d10: 2c 20 74 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e  , thru element N
0d20: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 53 65 74   */..#define Set
0d30: 46 69 6e 64 28 58 2c 59 29 20 28 58 5b 59 5d 29  Find(X,Y) (X[Y])
0d40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
0d50: 66 20 59 20 69 73 20 69 6e 20 73 65 74 20 58 20  f Y is in set X 
0d60: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  */../********** 
0d70: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
0d80: 74 72 75 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  truct.h" *******
0d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0db0: 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20  /*.** Principal 
0dc0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
0dd0: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
0de0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
0df0: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  */..typedef enum
0e00: 20 7b 42 5f 46 41 4c 53 45 3d 30 2c 20 42 5f 54   {B_FALSE=0, B_T
0e10: 52 55 45 7d 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f  RUE} Boolean;../
0e20: 2a 20 53 79 6d 62 6f 6c 73 20 28 74 65 72 6d 69  * Symbols (termi
0e30: 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d  nals and nonterm
0e40: 69 6e 61 6c 73 29 20 6f 66 20 74 68 65 20 67 72  inals) of the gr
0e50: 61 6d 6d 61 72 20 61 72 65 20 73 74 6f 72 65 64  ammar are stored
0e60: 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  .** in the follo
0e70: 77 69 6e 67 3a 20 2a 2f 0a 73 74 72 75 63 74 20  wing: */.struct 
0e80: 73 79 6d 62 6f 6c 20 7b 0a 20 20 63 68 61 72 20  symbol {.  char 
0e90: 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  *name;          
0ea0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
0eb0: 68 65 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69  he symbol */.  i
0ec0: 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20  nt index;       
0ed0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
0ee0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73   number for this
0ef0: 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75   symbol */.  enu
0f00: 6d 20 7b 0a 20 20 20 20 54 45 52 4d 49 4e 41 4c  m {.    TERMINAL
0f10: 2c 0a 20 20 20 20 4e 4f 4e 54 45 52 4d 49 4e 41  ,.    NONTERMINA
0f20: 4c 0a 20 20 7d 20 74 79 70 65 3b 20 20 20 20 20  L.  } type;     
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0f40: 53 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20  Symbols are all 
0f50: 65 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c 53  either TERMINALS
0f60: 20 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72   or NTs */.  str
0f70: 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20  uct rule *rule; 
0f80: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20        /* Linked 
0f90: 6c 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f 66  list of rules of
0fa0: 20 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54 29   this (if an NT)
0fb0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
0fc0: 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f  bol *fallback; /
0fd0: 2a 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e  * fallback token
0fe0: 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 74 6f   in case this to
0ff0: 6b 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72 73  ken doesn't pars
1000: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b  e */.  int prec;
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69 66  /* Precedence if
1030: 20 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74 68   defined (-1 oth
1040: 65 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75  erwise) */.  enu
1050: 6d 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20 20  m e_assoc {.    
1060: 4c 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54 2c  LEFT,.    RIGHT,
1070: 0a 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20 55  .    NONE,.    U
1080: 4e 4b 0a 20 20 7d 20 61 73 73 6f 63 3b 20 20 20  NK.  } assoc;   
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a0: 20 41 73 73 6f 63 69 61 74 69 76 69 74 79 20 69   Associativity i
10b0: 66 20 70 72 65 64 65 63 65 6e 63 65 20 69 73 20  f predecence is 
10c0: 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61  defined */.  cha
10d0: 72 20 2a 66 69 72 73 74 73 65 74 3b 20 20 20 20  r *firstset;    
10e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 2d 73        /* First-s
10f0: 65 74 20 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73  et for all rules
1100: 20 6f 66 20 74 68 69 73 20 73 79 6d 62 6f 6c 20   of this symbol 
1110: 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d  */.  Boolean lam
1120: 62 64 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  bda;          /*
1130: 20 54 72 75 65 20 69 66 20 4e 54 20 61 6e 64 20   True if NT and 
1140: 63 61 6e 20 67 65 6e 65 72 61 74 65 20 61 6e 20  can generate an 
1150: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  empty string */.
1160: 20 20 63 68 61 72 20 2a 64 65 73 74 72 75 63 74    char *destruct
1170: 6f 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  or;        /* Co
1180: 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1190: 73 20 77 68 65 6e 65 76 65 72 20 74 68 69 73 20  s whenever this 
11a0: 73 79 6d 62 6f 6c 20 69 73 0a 20 20 20 20 20 20  symbol is.      
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 20 20 20 2a 2a 20 70 6f 70 70 65 64 20 66       ** popped f
11d0: 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 64 75  rom the stack du
11e0: 72 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63 65  ring error proce
11f0: 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64  ssing */.  int d
1200: 65 73 74 72 75 63 74 6f 72 6c 6e 3b 20 20 20 20  estructorln;    
1210: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
1220: 65 72 20 6f 66 20 64 65 73 74 72 75 63 74 6f 72  er of destructor
1230: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
1240: 2a 64 61 74 61 74 79 70 65 3b 20 20 20 20 20 20  *datatype;      
1250: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
1260: 74 79 70 65 20 6f 66 20 69 6e 66 6f 72 6d 61 74  type of informat
1270: 69 6f 6e 20 68 65 6c 64 20 62 79 20 74 68 69 73  ion held by this
1280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1290: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
12a0: 62 6a 65 63 74 2e 20 4f 6e 6c 79 20 75 73 65 64  bject. Only used
12b0: 20 69 66 20 74 79 70 65 3d 3d 4e 4f 4e 54 45 52   if type==NONTER
12c0: 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69 6e 74 20 64  MINAL */.  int d
12d0: 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
12e0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
12f0: 74 79 70 65 20 6e 75 6d 62 65 72 2e 20 20 49 6e  type number.  In
1300: 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
1310: 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20   value.         
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 20 2a 2a 20 73 74 61 63 6b 20 69 73 20 61 20    ** stack is a 
1340: 75 6e 69 6f 6e 2e 20 20 54 68 65 20 2e 79 79 25  union.  The .yy%
1350: 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 69  d element of thi
1360: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1380: 75 6e 69 6f 6e 20 69 73 20 74 68 65 20 63 6f 72  union is the cor
1390: 72 65 63 74 20 64 61 74 61 20 74 79 70 65 20 66  rect data type f
13a0: 6f 72 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  or this object *
13b0: 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70 72  /.};../* Each pr
13c0: 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69 6e  oduction rule in
13d0: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73 20   the grammar is 
13e0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66 6f  stored in the fo
13f0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63  llowing.** struc
1400: 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63 74  ture.  */.struct
1410: 20 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63 74   rule {.  struct
1420: 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20   symbol *lhs;   
1430: 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20     /* Left-hand 
1440: 73 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c 65  side of the rule
1450: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 68 73 61   */.  char *lhsa
1460: 6c 69 61 73 3b 20 20 20 20 20 20 20 20 20 20 2f  lias;          /
1470: 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
1480: 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e  LHS (NULL if non
1490: 65 29 20 2a 2f 0a 20 20 69 6e 74 20 72 75 6c 65  e) */.  int rule
14a0: 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20  line;           
14b0: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
14c0: 66 6f 72 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a  for the rule */.
14d0: 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20 20    int nrhs;     
14e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14f0: 6d 62 65 72 20 6f 66 20 52 48 53 20 73 79 6d 62  mber of RHS symb
1500: 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ols */.  struct 
1510: 73 79 6d 62 6f 6c 20 2a 2a 72 68 73 3b 20 20 20  symbol **rhs;   
1520: 20 20 2f 2a 20 54 68 65 20 52 48 53 20 73 79 6d    /* The RHS sym
1530: 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  bols */.  char *
1540: 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20  *rhsalias;      
1550: 20 20 20 2f 2a 20 41 6e 20 61 6c 69 61 73 20 66     /* An alias f
1560: 6f 72 20 65 61 63 68 20 52 48 53 20 73 79 6d 62  or each RHS symb
1570: 6f 6c 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65  ol (NULL if none
1580: 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 69 6e 65 3b  ) */.  int line;
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 61  /* Line number a
15b0: 74 20 77 68 69 63 68 20 63 6f 64 65 20 62 65 67  t which code beg
15c0: 69 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63  ins */.  char *c
15d0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
15e0: 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 65 78    /* The code ex
15f0: 65 63 75 74 65 64 20 77 68 65 6e 20 74 68 69 73  ecuted when this
1600: 20 72 75 6c 65 20 69 73 20 72 65 64 75 63 65 64   rule is reduced
1610: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
1620: 62 6f 6c 20 2a 70 72 65 63 73 79 6d 3b 20 20 2f  bol *precsym;  /
1630: 2a 20 50 72 65 63 65 64 65 6e 63 65 20 73 79 6d  * Precedence sym
1640: 62 6f 6c 20 66 6f 72 20 74 68 69 73 20 72 75 6c  bol for this rul
1650: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78  e */.  int index
1660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1670: 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6e 75 6d 62  /* An index numb
1680: 65 72 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65  er for this rule
1690: 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63 61   */.  Boolean ca
16a0: 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20 2f  nReduce;       /
16b0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 72  * True if this r
16c0: 75 6c 65 20 69 73 20 65 76 65 72 20 72 65 64 75  ule is ever redu
16d0: 63 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ced */.  struct 
16e0: 72 75 6c 65 20 2a 6e 65 78 74 6c 68 73 3b 20 20  rule *nextlhs;  
16f0: 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20 77    /* Next rule w
1700: 69 74 68 20 74 68 65 20 73 61 6d 65 20 4c 48 53  ith the same LHS
1710: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
1720: 65 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 20 2f  e *next;       /
1730: 2a 20 4e 65 78 74 20 72 75 6c 65 20 69 6e 20 74  * Next rule in t
1740: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 2a  he global list *
1750: 2f 0a 7d 3b 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69  /.};../* A confi
1760: 67 75 72 61 74 69 6f 6e 20 69 73 20 61 20 70 72  guration is a pr
1770: 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 6f 66  oduction rule of
1780: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 74 6f 67   the grammar tog
1790: 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 61 20  ether with.** a 
17a0: 6d 61 72 6b 20 28 64 6f 74 29 20 73 68 6f 77 69  mark (dot) showi
17b0: 6e 67 20 68 6f 77 20 6d 75 63 68 20 6f 66 20 74  ng how much of t
17c0: 68 61 74 20 72 75 6c 65 20 68 61 73 20 62 65 65  hat rule has bee
17d0: 6e 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20 66  n processed so f
17e0: 61 72 2e 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  ar..** Configura
17f0: 74 69 6f 6e 73 20 61 6c 73 6f 20 63 6f 6e 74 61  tions also conta
1800: 69 6e 20 61 20 66 6f 6c 6c 6f 77 2d 73 65 74 20  in a follow-set 
1810: 77 68 69 63 68 20 69 73 20 61 20 6c 69 73 74 20  which is a list 
1820: 6f 66 20 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73  of terminal.** s
1830: 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 61 72 65  ymbols which are
1840: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 69 6d 6d 65   allowed to imme
1850: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74  diately follow t
1860: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 75  he end of the ru
1870: 6c 65 2e 0a 2a 2a 20 45 76 65 72 79 20 63 6f 6e  le..** Every con
1880: 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 72 65  figuration is re
1890: 63 6f 72 64 65 64 20 61 73 20 61 6e 20 69 6e 73  corded as an ins
18a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
18b0: 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73 74 72 75 63  lowing: */.struc
18c0: 74 20 63 6f 6e 66 69 67 20 7b 0a 20 20 73 74 72  t config {.  str
18d0: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20  uct rule *rp;   
18e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c        /* The rul
18f0: 65 20 75 70 6f 6e 20 77 68 69 63 68 20 74 68 65  e upon which the
1900: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
1910: 73 20 62 61 73 65 64 20 2a 2f 0a 20 20 69 6e 74  s based */.  int
1920: 20 64 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20   dot;           
1930: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1940: 73 65 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 63 68  se point */.  ch
1950: 61 72 20 2a 66 77 73 3b 20 20 20 20 20 20 20 20  ar *fws;        
1960: 20 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77         /* Follow
1970: 2d 73 65 74 20 66 6f 72 20 74 68 69 73 20 63 6f  -set for this co
1980: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 6e 6c 79  nfiguration only
1990: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69   */.  struct pli
19a0: 6e 6b 20 2a 66 70 6c 70 3b 20 20 20 20 20 20 2f  nk *fplp;      /
19b0: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72  * Follow-set for
19c0: 77 61 72 64 20 70 72 6f 70 61 67 61 74 69 6f 6e  ward propagation
19d0: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75   links */.  stru
19e0: 63 74 20 70 6c 69 6e 6b 20 2a 62 70 6c 70 3b 20  ct plink *bplp; 
19f0: 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73       /* Follow-s
1a00: 65 74 20 62 61 63 6b 77 61 72 64 73 20 70 72 6f  et backwards pro
1a10: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
1a20: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  /.  struct state
1a30: 20 2a 73 74 70 3b 20 20 20 20 20 20 20 2f 2a 20   *stp;       /* 
1a40: 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 61 74 65  Pointer to state
1a50: 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20   which contains 
1a60: 74 68 69 73 20 2a 2f 0a 20 20 65 6e 75 6d 20 7b  this */.  enum {
1a70: 0a 20 20 20 20 43 4f 4d 50 4c 45 54 45 2c 20 20  .    COMPLETE,  
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a90: 68 65 20 73 74 61 74 75 73 20 69 73 20 75 73 65  he status is use
1aa0: 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73  d during follows
1ab0: 65 74 20 61 6e 64 20 2a 2f 0a 20 20 20 20 49 4e  et and */.    IN
1ac0: 43 4f 4d 50 4c 45 54 45 20 20 20 20 20 20 20 20  COMPLETE        
1ad0: 20 20 20 20 20 2f 2a 20 20 20 20 73 68 69 66 74       /*    shift
1ae0: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f   computations */
1af0: 0a 20 20 7d 20 73 74 61 74 75 73 3b 0a 20 20 73  .  } status;.  s
1b00: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
1b10: 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  xt;     /* Next 
1b20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e  configuration in
1b30: 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20 20   the state */.  
1b40: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
1b50: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
1b60: 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66 69  next basis confi
1b70: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  guration */.};..
1b80: 2f 2a 20 45 76 65 72 79 20 73 68 69 66 74 20 6f  /* Every shift o
1b90: 72 20 72 65 64 75 63 65 20 6f 70 65 72 61 74 69  r reduce operati
1ba0: 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 61 73 20  on is stored as 
1bb0: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
1bc0: 77 69 6e 67 20 2a 2f 0a 73 74 72 75 63 74 20 61  wing */.struct a
1bd0: 63 74 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74  ction {.  struct
1be0: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 20   symbol *sp;    
1bf0: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61     /* The look-a
1c00: 68 65 61 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20  head symbol */. 
1c10: 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b   enum e_action {
1c20: 0a 20 20 20 20 53 48 49 46 54 2c 0a 20 20 20 20  .    SHIFT,.    
1c30: 41 43 43 45 50 54 2c 0a 20 20 20 20 52 45 44 55  ACCEPT,.    REDU
1c40: 43 45 2c 0a 20 20 20 20 45 52 52 4f 52 2c 0a 20  CE,.    ERROR,. 
1c50: 20 20 20 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20     CONFLICT,    
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1c70: 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75 74  as a reduce, but
1c80: 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c   part of a confl
1c90: 69 63 74 20 2a 2f 0a 20 20 20 20 53 48 5f 52 45  ict */.    SH_RE
1ca0: 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20  SOLVED,         
1cb0: 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68 69      /* Was a shi
1cc0: 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20  ft.  Precedence 
1cd0: 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63  resolved conflic
1ce0: 74 20 2a 2f 0a 20 20 20 20 52 44 5f 52 45 53 4f  t */.    RD_RESO
1cf0: 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20  LVED,           
1d00: 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e    /* Was reduce.
1d10: 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73    Precedence res
1d20: 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a  olved conflict *
1d30: 2f 0a 20 20 20 20 4e 4f 54 5f 55 53 45 44 20 20  /.    NOT_USED  
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d50: 2a 20 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d  * Deleted by com
1d60: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 7d 20  pression */.  } 
1d70: 74 79 70 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a  type;.  union {.
1d80: 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 65      struct state
1d90: 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68   *stp;     /* Th
1da0: 65 20 6e 65 77 20 73 74 61 74 65 2c 20 69 66 20  e new state, if 
1db0: 61 20 73 68 69 66 74 20 2a 2f 0a 20 20 20 20 73  a shift */.    s
1dc0: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20  truct rule *rp; 
1dd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c        /* The rul
1de0: 65 2c 20 69 66 20 61 20 72 65 64 75 63 65 20 2a  e, if a reduce *
1df0: 2f 0a 20 20 7d 20 78 3b 0a 20 20 73 74 72 75 63  /.  } x;.  struc
1e00: 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20  t action *next; 
1e10: 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69      /* Next acti
1e20: 6f 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  on for this stat
1e30: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63  e */.  struct ac
1e40: 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20  tion *collide;  
1e50: 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77  /* Next action w
1e60: 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
1e70: 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68  h */.};../* Each
1e80: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65   state of the ge
1e90: 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73  nerated parser's
1ea0: 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61   finite state ma
1eb0: 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f  chine.** is enco
1ec0: 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e  ded as an instan
1ed0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1ee0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a  ing structure. *
1ef0: 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b  /.struct state {
1f00: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
1f10: 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *bp;       /* T
1f20: 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  he basis configu
1f30: 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73  rations for this
1f40: 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75   state */.  stru
1f50: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20  ct config *cfp; 
1f60: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66       /* All conf
1f70: 69 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68  igurations in th
1f80: 69 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  is set */.  int 
1f90: 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  index;          
1fa0: 20 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 63 69       /* Sequenci
1fb0: 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  al number for th
1fc0: 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74  is state */.  st
1fd0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
1fe0: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
1ff0: 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74  of actions for t
2000: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69  his state */.  i
2010: 6e 74 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41  nt nTknAct, nNtA
2020: 63 74 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ct;     /* Numbe
2030: 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20  r of actions on 
2040: 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f  terminals and no
2050: 6e 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20  nterminals */.  
2060: 69 6e 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e  int iTknOfst, iN
2070: 74 4f 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61  tOfst;   /* yy_a
2080: 63 74 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66  ction[] offset f
2090: 6f 72 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  or terminals and
20a0: 20 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69   nonterms */.  i
20b0: 6e 74 20 69 44 66 6c 74 3b 20 20 20 20 20 20 20  nt iDflt;       
20c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75          /* Defau
20d0: 6c 74 20 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  lt action */.};.
20e0: 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45  #define NO_OFFSE
20f0: 54 20 28 2d 32 31 34 37 34 38 33 36 34 37 29 0a  T (-2147483647).
2100: 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20  ./* A followset 
2110: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
2120: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
2130: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2140: 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61  one.** configura
2150: 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73  tion followset s
2160: 68 6f 75 6c 64 20 62 65 20 70 72 6f 70 61 67 61  hould be propaga
2170: 74 65 64 20 74 6f 20 61 6e 6f 74 68 65 72 20 77  ted to another w
2180: 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68 65 20 66  henever.** the f
2190: 69 72 73 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f  irst changes. */
21a0: 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a  .struct plink {.
21b0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
21c0: 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  *cfp;      /* Th
21d0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
21e0: 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b 65 64 20  to which linked 
21f0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  */.  struct plin
2200: 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a  k *next;      /*
2210: 20 54 68 65 20 6e 65 78 74 20 70 72 6f 70 61 67   The next propag
2220: 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a  ate link */.};..
2230: 2f 2a 20 54 68 65 20 73 74 61 74 65 20 76 65 63  /* The state vec
2240: 74 6f 72 20 66 6f 72 20 74 68 65 20 65 6e 74 69  tor for the enti
2250: 72 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  re parser genera
2260: 74 6f 72 20 69 73 20 72 65 63 6f 72 64 65 64 20  tor is recorded 
2270: 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20  as.** follows.  
2280: 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67  (LEMON uses no g
2290: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
22a0: 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65  and makes little
22b0: 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69   use of.** stati
22c0: 63 20 76 61 72 69 61 62 6c 65 73 2e 20 20 46 69  c variables.  Fi
22d0: 65 6c 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  elds in the foll
22e0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
22f0: 63 61 6e 20 62 65 20 74 68 6f 75 67 68 74 0a 2a  can be thought.*
2300: 2a 20 6f 66 20 61 73 20 62 65 67 69 6e 20 67 6c  * of as begin gl
2310: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 69  obal variables i
2320: 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 29 20  n the program.) 
2330: 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  */.struct lemon 
2340: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
2350: 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20   **sorted;   /* 
2360: 54 61 62 6c 65 20 6f 66 20 73 74 61 74 65 73 20  Table of states 
2370: 73 6f 72 74 65 64 20 62 79 20 73 74 61 74 65 20  sorted by state 
2380: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75  number */.  stru
2390: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
23a0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
23b0: 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69  all rules */.  i
23c0: 6e 74 20 6e 73 74 61 74 65 3b 20 20 20 20 20 20  nt nstate;      
23d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23e0: 72 20 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a 20  r of states */. 
23f0: 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20   int nrule;     
2400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2410: 62 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a  ber of rules */.
2420: 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20    int nsymbol;  
2430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2440: 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c  mber of terminal
2450: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
2460: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
2470: 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20  t nterminal;    
2480: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2490: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d   of terminal sym
24a0: 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  bols */.  struct
24b0: 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c   symbol **symbol
24c0: 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61 72 72  s; /* Sorted arr
24d0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  ay of pointers t
24e0: 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69  o symbols */.  i
24f0: 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20  nt errorcnt;    
2500: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2510: 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  r of errors */. 
2520: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
2530: 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65  errsym;   /* The
2540: 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f   error symbol */
2550: 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  .  char *name;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2570: 61 6d 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ame of the gener
2580: 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 20  ated parser */. 
2590: 20 63 68 61 72 20 2a 61 72 67 3b 20 20 20 20 20   char *arg;     
25a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63            /* Dec
25b0: 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  laration of the 
25c0: 33 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3th argument to 
25d0: 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72  parser */.  char
25e0: 20 2a 74 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20   *tokentype;    
25f0: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
2600: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
2610: 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73   in the parser s
2620: 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tack */.  char *
2630: 76 61 72 74 79 70 65 3b 20 20 20 20 20 20 20 20  vartype;        
2640: 20 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c     /* The defaul
2650: 74 20 74 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65  t type of non-te
2660: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a  rminal symbols *
2670: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 72 74 3b  /.  char *start;
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2690: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 72  Name of the star
26a0: 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65  t symbol for the
26b0: 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68   grammar */.  ch
26c0: 61 72 20 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20  ar *stacksize;  
26d0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
26e0: 66 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61  f the parser sta
26f0: 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e  ck */.  char *in
2700: 63 6c 75 64 65 3b 20 20 20 20 20 20 20 20 20 20  clude;          
2710: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 75 74 20   /* Code to put 
2720: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2730: 74 68 65 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20  the C file */.  
2740: 69 6e 74 20 20 69 6e 63 6c 75 64 65 6c 6e 3b 20  int  includeln; 
2750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
2760: 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72   number for star
2770: 74 20 6f 66 20 69 6e 63 6c 75 64 65 20 63 6f 64  t of include cod
2780: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72  e */.  char *err
2790: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
27a0: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
27b0: 74 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  te when an error
27c0: 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
27d0: 74 20 20 65 72 72 6f 72 6c 6e 3b 20 20 20 20 20  t  errorln;     
27e0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
27f0: 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74 20  umber for start 
2800: 6f 66 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  of error code */
2810: 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f  .  char *overflo
2820: 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  w;          /* C
2830: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
2840: 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c  n a stack overfl
2850: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 20 6f 76 65  ow */.  int  ove
2860: 72 66 6c 6f 77 6c 6e 3b 20 20 20 20 20 20 20 20  rflowln;        
2870: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
2880: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 6f 76 65  for start of ove
2890: 72 66 6c 6f 77 20 63 6f 64 65 20 2a 2f 0a 20 20  rflow code */.  
28a0: 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b 20 20  char *failure;  
28b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
28c0: 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e 20 70   to execute on p
28d0: 61 72 73 65 72 20 66 61 69 6c 75 72 65 20 2a 2f  arser failure */
28e0: 0a 20 20 69 6e 74 20 20 66 61 69 6c 75 72 65 6c  .  int  failurel
28f0: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  n;          /* L
2900: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  ine number for s
2910: 74 61 72 74 20 6f 66 20 66 61 69 6c 75 72 65 20  tart of failure 
2920: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
2930: 61 63 63 65 70 74 3b 20 20 20 20 20 20 20 20 20  accept;         
2940: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2950: 65 63 75 74 65 20 77 68 65 6e 20 74 68 65 20 70  ecute when the p
2960: 61 72 73 65 72 20 65 78 63 65 70 74 73 20 2a 2f  arser excepts */
2970: 0a 20 20 69 6e 74 20 20 61 63 63 65 70 74 6c 6e  .  int  acceptln
2980: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
2990: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ine number for t
29a0: 68 65 20 73 74 61 72 74 20 6f 66 20 61 63 63 65  he start of acce
29b0: 70 74 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  pt code */.  cha
29c0: 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20 20  r *extracode;   
29d0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 70        /* Code ap
29e0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67 65  pended to the ge
29f0: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f 0a  nerated file */.
2a00: 20 20 69 6e 74 20 20 65 78 74 72 61 63 6f 64 65    int  extracode
2a10: 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ln;        /* Li
2a20: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ne number for th
2a30: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 65  e start of the e
2a40: 78 74 72 61 20 63 6f 64 65 20 2a 2f 0a 20 20 63  xtra code */.  c
2a50: 68 61 72 20 2a 74 6f 6b 65 6e 64 65 73 74 3b 20  har *tokendest; 
2a60: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2a70: 74 6f 20 65 78 65 63 75 74 65 20 74 6f 20 64 65  to execute to de
2a80: 73 74 72 6f 79 20 74 6f 6b 65 6e 20 64 61 74 61  stroy token data
2a90: 20 2a 2f 0a 20 20 69 6e 74 20 20 74 6f 6b 65 6e   */.  int  token
2aa0: 64 65 73 74 6c 6e 3b 20 20 20 20 20 20 20 20 2f  destln;        /
2ab0: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
2ac0: 72 20 74 6f 6b 65 6e 20 64 65 73 74 72 6f 79 65  r token destroye
2ad0: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  r code */.  char
2ae0: 20 2a 76 61 72 64 65 73 74 3b 20 20 20 20 20 20   *vardest;      
2af0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72       /* Code for
2b00: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e   the default non
2b10: 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75  -terminal destru
2b20: 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 20 76  ctor */.  int  v
2b30: 61 72 64 65 73 74 6c 6e 3b 20 20 20 20 20 20 20  ardestln;       
2b40: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
2b50: 72 20 66 6f 72 20 64 65 66 61 75 6c 74 20 6e 6f  r for default no
2b60: 6e 2d 74 65 72 6d 20 64 65 73 74 72 75 63 74 6f  n-term destructo
2b70: 72 20 63 6f 64 65 2a 2f 0a 20 20 63 68 61 72 20  r code*/.  char 
2b80: 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  *filename;      
2b90: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2ba0: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
2bb0: 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65  .  char *outname
2bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2bd0: 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
2be0: 6e 74 20 6f 75 74 70 75 74 20 66 69 6c 65 20 2a  nt output file *
2bf0: 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70  /.  char *tokenp
2c00: 72 65 66 69 78 3b 20 20 20 20 20 20 20 2f 2a 20  refix;       /* 
2c10: 41 20 70 72 65 66 69 78 20 61 64 64 65 64 20 74  A prefix added t
2c20: 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e  o token names in
2c30: 20 74 68 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a   the .h file */.
2c40: 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b    int nconflict;
2c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c60: 6d 62 65 72 20 6f 66 20 70 61 72 73 69 6e 67 20  mber of parsing 
2c70: 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69  conflicts */.  i
2c80: 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20 20 20  nt tablesize;   
2c90: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2ca0: 6f 66 20 74 68 65 20 70 61 72 73 65 20 74 61 62  of the parse tab
2cb0: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  les */.  int bas
2cc0: 69 73 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20  isflag;         
2cd0: 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20    /* Print only 
2ce0: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
2cf0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61  ions */.  int ha
2d00: 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20  s_fallback;     
2d10: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2d20: 79 20 25 66 61 6c 6c 62 61 63 6b 20 69 73 20 73  y %fallback is s
2d30: 65 65 6e 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  een in the gramm
2d40: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72  er */.  char *ar
2d50: 67 76 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  gv0;            
2d60: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2d70: 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23  program */.};..#
2d80: 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65  define MemoryChe
2d90: 63 6b 28 58 29 20 69 66 28 28 58 29 3d 3d 30 29  ck(X) if((X)==0)
2da0: 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20 76 6f 69  { \.  extern voi
2db0: 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29  d memory_error()
2dc0: 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72  ; \.  memory_err
2dd0: 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a  or(); \.}../****
2de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
2df0: 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c  m the file "tabl
2e00: 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.h" ***********
2e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e20: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c  ******/./*.** Al
2e30: 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  l code in this f
2e40: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75 74  ile has been aut
2e50: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
2e60: 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73  ated.** from a s
2e70: 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20  pecification in 
2e80: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  the file.**     
2e90: 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e           "table.
2ea0: 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73  q".** by the ass
2eb0: 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 63  ociative array c
2ec0: 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f  ode building pro
2ed0: 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a  gram "aagen"..**
2ee0: 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69   Do not edit thi
2ef0: 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64  s file!  Instead
2f00: 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63 69  , edit the speci
2f10: 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65  fication.** file
2f20: 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67  , then rerun aag
2f30: 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64  en..*/./*.** Cod
2f40: 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  e for processing
2f50: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c   tables in the L
2f60: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
2f70: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 6f  rator..*/../* Ro
2f80: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
2f90: 69 6e 67 20 61 20 73 74 72 69 6e 67 73 20 2a 2f  ing a strings */
2fa0: 0a 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 28  ..char *Strsafe(
2fb0: 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73 61 66 65  );..void Strsafe
2fc0: 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f  _init(/* void */
2fd0: 29 3b 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  );.int Strsafe_i
2fe0: 6e 73 65 72 74 28 2f 2a 20 63 68 61 72 20 2a 20  nsert(/* char * 
2ff0: 2a 2f 29 3b 0a 63 68 61 72 20 2a 53 74 72 73 61  */);.char *Strsa
3000: 66 65 5f 66 69 6e 64 28 2f 2a 20 63 68 61 72 20  fe_find(/* char 
3010: 2a 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69  * */);../* Routi
3020: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
3030: 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20   symbols of the 
3040: 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75  grammar */..stru
3050: 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
3060: 6c 5f 6e 65 77 28 29 3b 0a 69 6e 74 20 53 79 6d  l_new();.int Sym
3070: 62 6f 6c 63 6d 70 70 28 2f 2a 20 73 74 72 75 63  bolcmpp(/* struc
3080: 74 20 73 79 6d 62 6f 6c 20 2a 2a 2c 20 73 74 72  t symbol **, str
3090: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 20 2a 2f  uct symbol ** */
30a0: 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69  );.void Symbol_i
30b0: 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b  nit(/* void */);
30c0: 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
30d0: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 73 79 6d  rt(/* struct sym
30e0: 62 6f 6c 20 2a 2c 20 63 68 61 72 20 2a 20 2a 2f  bol *, char * */
30f0: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
3100: 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 2f 2a   *Symbol_find(/*
3110: 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a 73 74 72   char * */);.str
3120: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
3130: 6f 6c 5f 4e 74 68 28 2f 2a 20 69 6e 74 20 2a 2f  ol_Nth(/* int */
3140: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  );.int Symbol_co
3150: 75 6e 74 28 2f 2a 20 20 2a 2f 29 3b 0a 73 74 72  unt(/*  */);.str
3160: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d  uct symbol **Sym
3170: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20  bol_arrayof(/*  
3180: 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  */);../* Routine
3190: 73 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20  s to manage the 
31a0: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  state table */..
31b0: 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 2f 2a  int Configcmp(/*
31c0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
31d0: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
31e0: 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74  * */);.struct st
31f0: 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29  ate *State_new()
3200: 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  ;.void State_ini
3210: 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69  t(/* void */);.i
3220: 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28  nt State_insert(
3230: 2f 2a 20 73 74 72 75 63 74 20 73 74 61 74 65 20  /* struct state 
3240: 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  *, struct config
3250: 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73   * */);.struct s
3260: 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64  tate *State_find
3270: 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69  (/* struct confi
3280: 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  g * */);.struct 
3290: 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72  state **State_ar
32a0: 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a  rayof(/*  */);..
32b0: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64  /* Routines used
32c0: 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20   for efficiency 
32d0: 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  in Configlist_ad
32e0: 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69  d */..void Confi
32f0: 67 74 61 62 6c 65 5f 69 6e 69 74 28 2f 2a 20 76  gtable_init(/* v
3300: 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20 43 6f 6e  oid */);.int Con
3310: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
3320: 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  /* struct config
3330: 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63   * */);.struct c
3340: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62  onfig *Configtab
3350: 6c 65 5f 66 69 6e 64 28 2f 2a 20 73 74 72 75 63  le_find(/* struc
3360: 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a  t config * */);.
3370: 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
3380: 5f 63 6c 65 61 72 28 2f 2a 20 69 6e 74 28 2a 29  _clear(/* int(*)
3390: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
33a0: 29 20 2a 2f 29 3b 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ) */);./********
33b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
33c0: 74 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e  the file "action
33d0: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
33e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33f0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
3400: 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 70  nes processing p
3410: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 69 6e  arser actions in
3420: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
3430: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
3440: 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
3450: 65 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e  ew parser action
3460: 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74 69 6f   */.struct actio
3470: 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 29 7b  n *Action_new(){
3480: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
3490: 20 61 63 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73   action *freelis
34a0: 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
34b0: 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a 0a 20 20  action *new;..  
34c0: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
34d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
34e0: 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
34f0: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
3500: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
3510: 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
3520: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 29 2a 61  struct action)*a
3530: 6d 74 20 29 3b 0a 20 20 20 20 69 66 28 20 66 72  mt );.    if( fr
3540: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
3550: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
3560: 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  r,"Unable to all
3570: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
3580: 20 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63   a new parser ac
3590: 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65  tion.");.      e
35a0: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
35b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74    for(i=0; i<amt
35c0: 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73  -1; i++) freelis
35d0: 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65  t[i].next = &fre
35e0: 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
35f0: 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e  freelist[amt-1].
3600: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  next = 0;.  }.  
3610: 6e 65 77 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a  new = freelist;.
3620: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65    freelist = fre
3630: 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
3640: 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a  eturn new;.}../*
3650: 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 61 63 74   Compare two act
3660: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  ions */.static i
3670: 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28 61 70 31  nt actioncmp(ap1
3680: 2c 61 70 32 29 0a 73 74 72 75 63 74 20 61 63 74  ,ap2).struct act
3690: 69 6f 6e 20 2a 61 70 31 3b 0a 73 74 72 75 63 74  ion *ap1;.struct
36a0: 20 61 63 74 69 6f 6e 20 2a 61 70 32 3b 0a 7b 0a   action *ap2;.{.
36b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
36c0: 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20   ap1->sp->index 
36d0: 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78  - ap2->sp->index
36e0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20  ;.  if( rc==0 ) 
36f0: 72 63 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74  rc = (int)ap1->t
3700: 79 70 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e  ype - (int)ap2->
3710: 74 79 70 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d  type;.  if( rc==
3720: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
3730: 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52 45 44 55   ap1->type==REDU
3740: 43 45 20 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d  CE || ap1->type=
3750: 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 20  =RD_RESOLVED || 
3760: 61 70 31 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c  ap1->type==CONFL
3770: 49 43 54 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ICT);.    assert
3780: 28 20 61 70 32 2d 3e 74 79 70 65 3d 3d 52 45 44  ( ap2->type==RED
3790: 55 43 45 20 7c 7c 20 61 70 32 2d 3e 74 79 70 65  UCE || ap2->type
37a0: 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==RD_RESOLVED ||
37b0: 20 61 70 32 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46   ap2->type==CONF
37c0: 4c 49 43 54 29 3b 0a 20 20 20 20 72 63 20 3d 20  LICT);.    rc = 
37d0: 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78  ap1->x.rp->index
37e0: 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e   - ap2->x.rp->in
37f0: 64 65 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dex;.  }.  retur
3800: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  n rc;.}../* Sort
3810: 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20   parser actions 
3820: 2a 2f 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  */.struct action
3830: 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 61 70   *Action_sort(ap
3840: 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ).struct action 
3850: 2a 61 70 3b 0a 7b 0a 20 20 61 70 20 3d 20 28 73  *ap;.{.  ap = (s
3860: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d  truct action *)m
3870: 73 6f 72 74 28 28 63 68 61 72 20 2a 29 61 70 2c  sort((char *)ap,
3880: 28 63 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e 65  (char **)&ap->ne
3890: 78 74 2c 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20  xt,actioncmp);. 
38a0: 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76   return ap;.}..v
38b0: 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 61  oid Action_add(a
38c0: 70 70 2c 74 79 70 65 2c 73 70 2c 61 72 67 29 0a  pp,type,sp,arg).
38d0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2a  struct action **
38e0: 61 70 70 3b 0a 65 6e 75 6d 20 65 5f 61 63 74 69  app;.enum e_acti
38f0: 6f 6e 20 74 79 70 65 3b 0a 73 74 72 75 63 74 20  on type;.struct 
3900: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 63 68 61 72  symbol *sp;.char
3910: 20 2a 61 72 67 3b 0a 7b 0a 20 20 73 74 72 75 63   *arg;.{.  struc
3920: 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a 20  t action *new;. 
3930: 20 6e 65 77 20 3d 20 41 63 74 69 6f 6e 5f 6e 65   new = Action_ne
3940: 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78 74  w();.  new->next
3950: 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20   = *app;.  *app 
3960: 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e 74 79  = new;.  new->ty
3970: 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e 65 77  pe = type;.  new
3980: 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69 66 28  ->sp = sp;.  if(
3990: 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a   type==SHIFT ){.
39a0: 20 20 20 20 6e 65 77 2d 3e 78 2e 73 74 70 20 3d      new->x.stp =
39b0: 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
39c0: 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )arg;.  }else{. 
39d0: 20 20 20 6e 65 77 2d 3e 78 2e 72 70 20 3d 20 28     new->x.rp = (
39e0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29 61 72  struct rule *)ar
39f0: 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  g;.  }.}./******
3a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a10: 20 4e 65 77 20 63 6f 64 65 20 74 6f 20 69 6d 70   New code to imp
3a20: 6c 65 6d 65 6e 74 20 74 68 65 20 22 61 63 74 74  lement the "actt
3a30: 61 62 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a 2a 2a  ab" module *****
3a40: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  ******/./*.** Th
3a50: 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d  is module implem
3a60: 65 6e 74 73 20 72 6f 75 74 69 6e 65 73 20 75 73  ents routines us
3a70: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
3a80: 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74  he yy_action[] t
3a90: 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  able..*/../*.** 
3aa0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
3ab0: 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65   yy_action table
3ac0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
3ad0: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  ion is an instan
3ae0: 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c  ce of.** the fol
3af0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3b00: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
3b10: 63 74 20 61 63 74 74 61 62 20 61 63 74 74 61 62  ct acttab acttab
3b20: 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61 62 20  ;.struct acttab 
3b30: 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b  {.  int nAction;
3b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
3b60: 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41 63 74  ed slots in aAct
3b70: 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ion[] */.  int n
3b80: 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20  ActionAlloc;    
3b90: 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73          /* Slots
3ba0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
3bb0: 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74  Action[] */.  st
3bc0: 72 75 63 74 20 7b 0a 20 20 20 20 69 6e 74 20 6c  ruct {.    int l
3bd0: 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20  ookahead;       
3be0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
3bf0: 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  f the lookahead 
3c00: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  token */.    int
3c10: 20 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20   action;        
3c20: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f          /* Actio
3c30: 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65  n to take on the
3c40: 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64   given lookahead
3c50: 20 2a 2f 0a 20 20 7d 20 2a 61 41 63 74 69 6f 6e   */.  } *aAction
3c60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3c70: 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61 63 74     /* The yy_act
3c80: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e 64 65  ion[] table unde
3c90: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
3ca0: 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68 65 61  /.    *aLookahea
3cb0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3cc0: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 65 77   /* A single new
3cd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
3ce0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f 6f 6b   */.  int mnLook
3cf0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
3d00: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 4c     /* Minimum aL
3d10: 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61  ookahead[].looka
3d20: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e  head */.  int mn
3d30: 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Action;         
3d40: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e         /* Action
3d50: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3d60: 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a   mnLookahead */.
3d70: 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68 65 61    int mxLookahea
3d80: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
3d90: 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f 6b 61  * Maximum aLooka
3da0: 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  head[].lookahead
3db0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
3dc0: 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  head;           
3dd0: 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f 74 73     /* Used slots
3de0: 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d   in aLookahead[]
3df0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
3e00: 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20 20 20  headAlloc;      
3e10: 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f     /* Slots allo
3e20: 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b 61 68  cated in aLookah
3e30: 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  ead[] */.};../* 
3e40: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
3e50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3e60: 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61  the yy_action ta
3e70: 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61  ble */.#define a
3e80: 63 74 74 61 62 5f 73 69 7a 65 28 58 29 20 28 28  cttab_size(X) ((
3e90: 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a 2f 2a  X)->nAction)../*
3ea0: 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   The value for t
3eb0: 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e  he N-th entry in
3ec0: 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a 23 64   yy_action */.#d
3ed0: 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79 61  efine acttab_yya
3ee0: 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28 58 29  ction(X,N)  ((X)
3ef0: 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61 63 74  ->aAction[N].act
3f00: 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c  ion)../* The val
3f10: 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  ue for the N-th 
3f20: 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f 6f 6b  entry in yy_look
3f30: 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ahead */.#define
3f40: 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68   acttab_yylookah
3f50: 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e  ead(X,N)  ((X)->
3f60: 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b 61  aAction[N].looka
3f70: 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65 20 61  head)../* Free a
3f80: 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
3f90: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
3fa0: 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a 76 6f  ven acttab */.vo
3fb0: 69 64 20 61 63 74 74 61 62 5f 66 72 65 65 28 61  id acttab_free(a
3fc0: 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66 72 65  cttab *p){.  fre
3fd0: 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20 29 3b  e( p->aAction );
3fe0: 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c 6f 6f  .  free( p->aLoo
3ff0: 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72 65 65  kahead );.  free
4000: 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c  ( p );.}../* All
4010: 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63 74 74  ocate a new actt
4020: 61 62 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ab structure */.
4030: 61 63 74 74 61 62 20 2a 61 63 74 74 61 62 5f 61  acttab *acttab_a
4040: 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20 61 63  lloc(void){.  ac
4050: 74 74 61 62 20 2a 70 20 3d 20 6d 61 6c 6c 6f 63  ttab *p = malloc
4060: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
4070: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
4080: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
4090: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
40a0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
40b0: 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22 29 3b  a new acttab.");
40c0: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
40d0: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  }.  memset(p, 0,
40e0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
40f0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20  return p;.}../* 
4100: 41 64 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e  Add a new action
4110: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
4120: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a  transaction set.
4130: 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61  */.void acttab_a
4140: 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c  ction(acttab *p,
4150: 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20   int lookahead, 
4160: 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69  int action){.  i
4170: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
4180: 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41  >=p->nLookaheadA
4190: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
41a0: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b  LookaheadAlloc +
41b0: 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f  = 25;.    p->aLo
41c0: 6f 6b 61 68 65 61 64 20 3d 20 72 65 61 6c 6c 6f  okahead = reallo
41d0: 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  c( p->aLookahead
41e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4200: 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68  izeof(p->aLookah
4210: 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b  ead[0])*p->nLook
4220: 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20 20  aheadAlloc );.  
4230: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
4240: 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ead==0 ){.      
4250: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
4260: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22  malloc failed\n"
4270: 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  );.      exit(1)
4280: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
4290: 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d  ( p->nLookahead=
42a0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c  =0 ){.    p->mxL
42b0: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
42c0: 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c  head;.    p->mnL
42d0: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
42e0: 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41  head;.    p->mnA
42f0: 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a  ction = action;.
4300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
4310: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c   p->mxLookahead<
4320: 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e 6d  lookahead ) p->m
4330: 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  xLookahead = loo
4340: 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66 28 20  kahead;.    if( 
4350: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c  p->mnLookahead>l
4360: 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20  ookahead ){.    
4370: 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64    p->mnLookahead
4380: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
4390: 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20      p->mnAction 
43a0: 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a  = action;.    }.
43b0: 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68    }.  p->aLookah
43c0: 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ead[p->nLookahea
43d0: 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  d].lookahead = l
43e0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e 61  ookahead;.  p->a
43f0: 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f  Lookahead[p->nLo
4400: 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e 20  okahead].action 
4410: 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e  = action;.  p->n
4420: 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a  Lookahead++;.}..
4430: 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 72  /*.** Add the tr
4440: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62 75  ansaction set bu
4450: 69 6c 74 20 75 70 20 77 69 74 68 20 70 72 69 6f  ilt up with prio
4460: 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61  r calls to actta
4470: 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e  b_action().** in
4480: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  to the current a
4490: 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68  ction table.  Th
44a0: 65 6e 20 72 65 73 65 74 20 74 68 65 20 74 72 61  en reset the tra
44b0: 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62 61 63  nsaction set bac
44c0: 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74 79  k.** to an empty
44d0: 20 73 65 74 20 69 6e 20 70 72 65 70 61 72 61 74   set in preparat
44e0: 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20 72 6f  ion for a new ro
44f0: 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f 61 63  und of acttab_ac
4500: 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a  tion() calls..**
4510: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
4520: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 61  ffset into the a
4530: 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74  ction table of t
4540: 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69  he new transacti
4550: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74 61  on..*/.int actta
4560: 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61 62 20  b_insert(acttab 
4570: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *p){.  int i, j,
4580: 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28   k, n;.  assert(
4590: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30   p->nLookahead>0
45a0: 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   );..  /* Make s
45b0: 75 72 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75  ure we have enou
45c0: 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  gh space to hold
45d0: 20 74 68 65 20 65 78 70 61 6e 64 65 64 20 61 63   the expanded ac
45e0: 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20  tion table.  ** 
45f0: 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73  in the worst cas
4600: 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20 63 61  e.  The worst ca
4610: 73 65 20 6f 63 63 75 72 73 20 69 66 20 74 68 65  se occurs if the
4620: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
4630: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70  .  ** must be ap
4640: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75  pended to the cu
4650: 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62  rrent action tab
4660: 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d  le.  */.  n = p-
4670: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 31  >mxLookahead + 1
4680: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63 74 69  ;.  if( p->nActi
4690: 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41 63  on + n >= p->nAc
46a0: 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  tionAlloc ){.   
46b0: 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20   int oldAlloc = 
46c0: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b  p->nActionAlloc;
46d0: 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e 41  .    p->nActionA
46e0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f  lloc = p->nActio
46f0: 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74 69  n + n + p->nActi
4700: 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20 20  onAlloc + 20;.  
4710: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20 72    p->aAction = r
4720: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69  ealloc( p->aActi
4730: 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
4750: 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b  zeof(p->aAction[
4760: 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  0])*p->nActionAl
4770: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  loc);.    if( p-
4780: 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20  >aAction==0 ){. 
4790: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
47a0: 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
47b0: 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ed\n");.      ex
47c0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
47d0: 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b   for(i=oldAlloc;
47e0: 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c   i<p->nActionAll
47f0: 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  oc; i++){.      
4800: 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f  p->aAction[i].lo
4810: 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20  okahead = -1;.  
4820: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69      p->aAction[i
4830: 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20  ].action = -1;. 
4840: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
4850: 63 61 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67  can the existing
4860: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f   action table lo
4870: 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66  oking for an off
4880: 73 65 74 20 77 68 65 72 65 20 77 65 20 63 61 6e  set where we can
4890: 0a 20 20 2a 2a 20 69 6e 73 65 72 74 20 74 68 65  .  ** insert the
48a0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
48b0: 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c 20  tion set.  Fall 
48c0: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
48d0: 77 68 65 6e 20 74 68 61 74 0a 20 20 2a 2a 20 6f  when that.  ** o
48e0: 66 66 73 65 74 20 69 73 20 66 6f 75 6e 64 2e 20  ffset is found. 
48f0: 20 49 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61   In the worst ca
4900: 73 65 2c 20 77 65 20 66 61 6c 6c 20 6f 75 74 20  se, we fall out 
4910: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e  of the loop when
4920: 0a 20 20 2a 2a 20 69 20 72 65 61 63 68 65 73 20  .  ** i reaches 
4930: 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63  p->nAction, whic
4940: 68 20 6d 65 61 6e 73 20 77 65 20 61 70 70 65 6e  h means we appen
4950: 64 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61  d the new transa
4960: 63 74 69 6f 6e 20 73 65 74 2e 0a 20 20 2a 2a 0a  ction set..  **.
4970: 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
4980: 64 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f  dex in p->aActio
4990: 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c  n[] where p->mnL
49a0: 6f 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65  ookahead is inse
49b0: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  rted..  */.  for
49c0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63 74 69  (i=0; i<p->nActi
49d0: 6f 6e 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61  on+p->mnLookahea
49e0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
49f0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
4a00: 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20 20  ookahead<0 ){.  
4a10: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
4a20: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
4a30: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  +){.        k = 
4a40: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
4a50: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
4a60: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
4a70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30  .        if( k<0
4a80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4a90: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
4aa0: 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30  [k].lookahead>=0
4ab0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4ac0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d  }.      if( j<p-
4ad0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f  >nLookahead ) co
4ae0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
4af0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74  r(j=0; j<p->nAct
4b00: 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ion; j++){.     
4b10: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
4b20: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[j].lookahead==
4b30: 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  j+p->mnLookahead
4b40: 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  -i ) break;.    
4b50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
4b60: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20  =p->nAction ){. 
4b70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f         break;  /
4b80: 2a 20 46 69 74 73 20 69 6e 20 65 6d 70 74 79 20  * Fits in empty 
4b90: 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20 20 7d  slots */.      }
4ba0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
4bb0: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f  ->aAction[i].loo
4bc0: 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f  kahead==p->mnLoo
4bd0: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
4be0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69  if( p->aAction[i
4bf0: 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41  ].action!=p->mnA
4c00: 63 74 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65  ction ) continue
4c10: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
4c20: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
4c30: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4c40: 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  k = p->aLookahea
4c50: 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d  d[j].lookahead -
4c60: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
4c70: 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + i;.        if(
4c80: 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41   k<0 || k>=p->nA
4c90: 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20  ction ) break;. 
4ca0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c         if( p->aL
4cb0: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
4cc0: 61 68 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f  ahead!=p->aActio
4cd0: 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29  n[k].lookahead )
4ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4cf0: 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  if( p->aLookahea
4d00: 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e  d[j].action!=p->
4d10: 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f  aAction[k].actio
4d20: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  n ) break;.     
4d30: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70   }.      if( j<p
4d40: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63  ->nLookahead ) c
4d50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e  ontinue;.      n
4d60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
4d70: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
4d80: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
4d90: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4da0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29  j].lookahead<0 )
4db0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
4dc0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
4dd0: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[j].lookahead==
4de0: 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  j+p->mnLookahead
4df0: 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  -i ) n++;.      
4e00: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70  }.      if( n==p
4e10: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a  ->nLookahead ){.
4e20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20          break;  
4e30: 2f 2a 20 53 61 6d 65 20 61 73 20 61 20 70 72 69  /* Same as a pri
4e40: 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  or transaction s
4e50: 65 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  et */.      }.  
4e60: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73    }.  }.  /* Ins
4e70: 65 72 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ert transaction 
4e80: 73 65 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20  set at index i. 
4e90: 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  */.  for(j=0; j<
4ea0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a  p->nLookahead; j
4eb0: 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e  ++){.    k = p->
4ec0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
4ed0: 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c  okahead - p->mnL
4ee0: 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20  ookahead + i;.  
4ef0: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20    p->aAction[k] 
4f00: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
4f10: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70  j];.    if( k>=p
4f20: 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e  ->nAction ) p->n
4f30: 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20  Action = k+1;.  
4f40: 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  }.  p->nLookahea
4f50: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74  d = 0;..  /* Ret
4f60: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74  urn the offset t
4f70: 68 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20  hat is added to 
4f80: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
4f90: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
4fa0: 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74  e.  ** index int
4fb0: 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74  o yy_action of t
4fc0: 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72  he action */.  r
4fd0: 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c  eturn i - p->mnL
4fe0: 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a  ookahead;.}../**
4ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5000: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
5010: 6c 65 20 22 61 73 73 65 72 74 2e 63 22 20 2a 2a  le "assert.c" **
5020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
5040: 2a 20 41 20 6d 6f 72 65 20 65 66 66 69 63 69 65  * A more efficie
5050: 6e 74 20 77 61 79 20 6f 66 20 68 61 6e 64 6c 69  nt way of handli
5060: 6e 67 20 61 73 73 65 72 74 69 6f 6e 73 2e 0a 2a  ng assertions..*
5070: 2f 0a 76 6f 69 64 20 6d 79 61 73 73 65 72 74 28  /.void myassert(
5080: 66 69 6c 65 2c 6c 69 6e 65 29 0a 63 68 61 72 20  file,line).char 
5090: 2a 66 69 6c 65 3b 0a 69 6e 74 20 6c 69 6e 65 3b  *file;.int line;
50a0: 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  .{.  fprintf(std
50b0: 65 72 72 2c 22 41 73 73 65 72 74 69 6f 6e 20 66  err,"Assertion f
50c0: 61 69 6c 65 64 20 6f 6e 20 6c 69 6e 65 20 25 64  ailed on line %d
50d0: 20 6f 66 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c   of file \"%s\"\
50e0: 6e 22 2c 6c 69 6e 65 2c 66 69 6c 65 29 3b 0a 20  n",line,file);. 
50f0: 20 65 78 69 74 28 31 29 3b 0a 7d 0a 2f 2a 2a 2a   exit(1);.}./***
5100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5110: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
5120: 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a  e "build.c" ****
5130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
5150: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e   Routines to con
5160: 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69  struction the fi
5170: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
5180: 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  ne for the LEMON
5190: 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72  .** parser gener
51a0: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e  ator..*/../* Fin
51b0: 64 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  d a precedence s
51c0: 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72  ymbol of every r
51d0: 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ule in the gramm
51e0: 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65  ar..** .** Those
51f0: 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76   rules which hav
5200: 65 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  e a precedence s
5210: 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74  ymbol coded in t
5220: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d  he input.** gram
5230: 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b  mar using the "[
5240: 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75  symbol]" constru
5250: 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20  ct will already 
5260: 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e  have the.** rp->
5270: 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69  precsym field fi
5280: 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c  lled.  Other rul
5290: 65 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72  es take as their
52a0: 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73   precedence.** s
52b0: 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20  ymbol the first 
52c0: 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20  RHS symbol with 
52d0: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
52e0: 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a  ence.  If there.
52f0: 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73  ** are not RHS s
5300: 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65  ymbols with a de
5310: 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65  fined precedence
5320: 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65  , the precedence
5330: 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64  .** symbol field
5340: 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a   is left blank..
5350: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65  */.void FindRule
5360: 50 72 65 63 65 64 65 6e 63 65 73 28 78 70 29 0a  Precedences(xp).
5370: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70  struct lemon *xp
5380: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ;.{.  struct rul
5390: 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d  e *rp;.  for(rp=
53a0: 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  xp->rule; rp; rp
53b0: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
53c0: 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d  if( rp->precsym=
53d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
53e0: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
53f0: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
5400: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
5410: 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 70 72 65 63  rp->rhs[i]->prec
5420: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
5430: 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72   rp->precsym = r
5440: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
5450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20       break;..}. 
5460: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5470: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
5480: 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65 72   Find all nonter
5490: 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 77 69 6c  minals which wil
54a0: 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 65  l generate the e
54b0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20  mpty string..** 
54c0: 54 68 65 6e 20 67 6f 20 62 61 63 6b 20 61 6e 64  Then go back and
54d0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72   compute the fir
54e0: 73 74 20 73 65 74 73 20 6f 66 20 65 76 65 72 79  st sets of every
54f0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a   nonterminal..**
5500: 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20 69   The first set i
5510: 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c  s the set of all
5520: 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
5530: 73 20 77 68 69 63 68 20 63 61 6e 20 62 65 67 69  s which can begi
5540: 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20 67 65  n.** a string ge
5550: 6e 65 72 61 74 65 64 20 62 79 20 74 68 61 74 20  nerated by that 
5560: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a  nonterminal..*/.
5570: 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53 65  void FindFirstSe
5580: 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  ts(lemp).struct 
5590: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
55a0: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
55b0: 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74   rule *rp;.  int
55c0: 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f   progress;..  fo
55d0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
55e0: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
55f0: 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b    lemp->symbols[
5600: 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 42 5f 46  i]->lambda = B_F
5610: 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ALSE;.  }.  for(
5620: 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i=lemp->ntermina
5630: 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  l; i<lemp->nsymb
5640: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  ol; i++){.    le
5650: 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
5660: 66 69 72 73 74 73 65 74 20 3d 20 53 65 74 4e 65  firstset = SetNe
5670: 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  w();.  }..  /* F
5680: 69 72 73 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c  irst compute all
5690: 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f   lambdas */.  do
56a0: 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d  {.    progress =
56b0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c   0;.    for(rp=l
56c0: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
56d0: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
56e0: 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e     if( rp->lhs->
56f0: 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74 69 6e 75  lambda ) continu
5700: 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
5710: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
5720: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 69 66 28  +){.         if(
5730: 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6c 61 6d   rp->rhs[i]->lam
5740: 62 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29 20 62  bda==B_FALSE ) b
5750: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5760: 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
5770: 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rhs ){.        r
5780: 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d  p->lhs->lambda =
5790: 20 42 5f 54 52 55 45 3b 0a 20 20 20 20 20 20 20   B_TRUE;.       
57a0: 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20   progress = 1;. 
57b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
57c0: 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20  while( progress 
57d0: 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d  );..  /* Now com
57e0: 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74 20 73  pute all first s
57f0: 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20  ets */.  do{.   
5800: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
5810: 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70 72 6f  s1, *s2;.    pro
5820: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66  gress = 0;.    f
5830: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
5840: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
5850: 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d 20 72  t){.      s1 = r
5860: 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 66 6f  p->lhs;.      fo
5870: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
5880: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
5890: 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d   s2 = rp->rhs[i]
58a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 32  ;.        if( s2
58b0: 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
58c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72   ){.          pr
58d0: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64  ogress += SetAdd
58e0: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
58f0: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
5900: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73      break;..}els
5910: 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a  e if( s1==s2 ){.
5920: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 31            if( s1
5930: 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53  ->lambda==B_FALS
5940: 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73  E ) break;..}els
5950: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f  e{.          pro
5960: 67 72 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f  gress += SetUnio
5970: 6e 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73  n(s1->firstset,s
5980: 32 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20  2->firstset);.  
5990: 20 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e          if( s2->
59a0: 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45 20  lambda==B_FALSE 
59b0: 29 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20  ) break;..}.    
59c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69    }.    }.  }whi
59d0: 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a  le( progress );.
59e0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
59f0: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30  Compute all LR(0
5a00: 29 20 73 74 61 74 65 73 20 66 6f 72 20 74 68 65  ) states for the
5a10: 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73   grammar.  Links
5a20: 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f  .** are added to
5a30: 20 62 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74   between some st
5a40: 61 74 65 73 20 73 6f 20 74 68 61 74 20 74 68 65  ates so that the
5a50: 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65   LR(1) follow se
5a60: 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d  ts.** can be com
5a70: 70 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a  puted later..*/.
5a80: 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73  PRIVATE struct s
5a90: 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 2f  tate *getstate(/
5aa0: 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  * struct lemon *
5ab0: 20 2a 2f 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72   */);  /* forwar
5ac0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76  d reference */.v
5ad0: 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 6c  oid FindStates(l
5ae0: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
5af0: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72  n *lemp;.{.  str
5b00: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
5b10: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
5b20: 70 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74  p;..  Configlist
5b30: 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46  _init();..  /* F
5b40: 69 6e 64 20 74 68 65 20 73 74 61 72 74 20 73 79  ind the start sy
5b50: 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65  mbol */.  if( le
5b60: 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20  mp->start ){.   
5b70: 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e   sp = Symbol_fin
5b80: 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a  d(lemp->start);.
5b90: 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b      if( sp==0 ){
5ba0: 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28  .      ErrorMsg(
5bb0: 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30  lemp->filename,0
5bc0: 2c 0a 22 54 68 65 20 73 70 65 63 69 66 69 65 64  ,."The specified
5bd0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22   start symbol \"
5be0: 25 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e  %s\" is not \.in
5bf0: 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f   a nonterminal o
5c00: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  f the grammar.  
5c10: 5c 22 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75  \"%s\" will be u
5c20: 73 65 64 20 61 73 20 74 68 65 20 73 74 61 72 74  sed as the start
5c30: 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61   \.symbol instea
5c40: 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c  d.",lemp->start,
5c50: 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d  lemp->rule->lhs-
5c60: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65  >name);.      le
5c70: 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
5c80: 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d        sp = lemp-
5c90: 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20  >rule->lhs;.    
5ca0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
5cb0: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
5cc0: 6c 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  lhs;.  }..  /* M
5cd0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 74 61  ake sure the sta
5ce0: 72 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27  rt symbol doesn'
5cf0: 74 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72  t occur on the r
5d00: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
5d10: 66 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e  f.  ** any rule.
5d20: 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
5d30: 72 20 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28  r if it does.  (
5d40: 59 41 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72  YACC would gener
5d50: 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73  ate a new.  ** s
5d60: 74 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74  tart symbol in t
5d70: 68 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20  his case.) */.  
5d80: 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
5d90: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
5da0: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
5db0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
5dc0: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
5dd0: 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73       if( rp->rhs
5de0: 5b 69 5d 3d 3d 73 70 20 29 7b 0a 20 20 20 20 20  [i]==sp ){.     
5df0: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
5e00: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54  ->filename,0,."T
5e10: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
5e20: 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e  \"%s\" occurs on
5e30: 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e   the \.right-han
5e40: 64 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65  d side of a rule
5e50: 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75  . This will resu
5e60: 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72 20 77  lt in a parser w
5e70: 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20  hich \.does not 
5e80: 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c  work properly.",
5e90: 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
5ea0: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
5eb0: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
5ec0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
5ed0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
5ee0: 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65  tion set for the
5ef0: 20 66 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a   first state.  *
5f00: 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77  * is all rules w
5f10: 68 69 63 68 20 68 61 76 65 20 74 68 65 20 73 74  hich have the st
5f20: 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68  art symbol as th
5f30: 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61  eir.  ** left-ha
5f40: 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72  nd side */.  for
5f50: 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70  (rp=sp->rule; rp
5f60: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73  ; rp=rp->nextlhs
5f70: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f  ){.    struct co
5f80: 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20  nfig *newcfp;.  
5f90: 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69    newcfp = Confi
5fa0: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72  glist_addbasis(r
5fb0: 70 2c 30 29 3b 0a 20 20 20 20 53 65 74 41 64 64  p,0);.    SetAdd
5fc0: 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b  (newcfp->fws,0);
5fd0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
5fe0: 74 65 20 74 68 65 20 66 69 72 73 74 20 73 74 61  te the first sta
5ff0: 74 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 73  te.  All other s
6000: 74 61 74 65 73 20 77 69 6c 6c 20 62 65 0a 20 20  tates will be.  
6010: 2a 2a 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f  ** computed auto
6020: 6d 61 74 69 63 61 6c 6c 79 20 64 75 72 69 6e 67  matically during
6030: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
6040: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 6e   of the first on
6050: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 74 75  e..  ** The retu
6060: 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20  rned pointer to 
6070: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20  the first state 
6080: 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a  is not used. */.
6090: 20 20 28 76 6f 69 64 29 67 65 74 73 74 61 74 65    (void)getstate
60a0: 28 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e  (lemp);.  return
60b0: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
60c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
60d0: 61 74 65 20 77 68 69 63 68 20 69 73 20 64 65 73  ate which is des
60e0: 63 72 69 62 65 64 20 62 79 20 74 68 65 20 63 6f  cribed by the co
60f0: 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c  nfiguration.** l
6100: 69 73 74 20 77 68 69 63 68 20 68 61 73 20 62 65  ist which has be
6110: 65 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20 63 61  en built from ca
6120: 6c 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73  lls to Configlis
6130: 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54  t_add..*/.PRIVAT
6140: 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66  E void buildshif
6150: 74 73 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d  ts(/* struct lem
6160: 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73 74 61  on *, struct sta
6170: 74 65 20 2a 20 2a 2f 29 3b 20 2f 2a 20 46 6f 72  te * */); /* For
6180: 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54  wd ref */.PRIVAT
6190: 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  E struct state *
61a0: 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 0a 73  getstate(lemp).s
61b0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
61c0: 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p;.{.  struct co
61d0: 6e 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a  nfig *cfp, *bp;.
61e0: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
61f0: 73 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61  stp;..  /* Extra
6200: 63 74 20 74 68 65 20 73 6f 72 74 65 64 20 62 61  ct the sorted ba
6210: 73 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73  sis of the new s
6220: 74 61 74 65 2e 20 20 54 68 65 20 62 61 73 69 73  tate.  The basis
6230: 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
6240: 0a 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63  .  ** by prior c
6250: 61 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c  alls to "Configl
6260: 69 73 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e  ist_addbasis()".
6270: 20 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74   */.  Configlist
6280: 5f 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20  _sortbasis();.  
6290: 62 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  bp = Configlist_
62a0: 62 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47  basis();..  /* G
62b0: 65 74 20 61 20 73 74 61 74 65 20 77 69 74 68 20  et a state with 
62c0: 74 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a  the same basis *
62d0: 2f 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f  /.  stp = State_
62e0: 66 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20  find(bp);.  if( 
62f0: 73 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20  stp ){.    /* A 
6300: 73 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73  state with the s
6310: 61 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61 64  ame basis alread
6320: 79 20 65 78 69 73 74 73 21 20 20 43 6f 70 79 20  y exists!  Copy 
6330: 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73  all the follow-s
6340: 65 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67  et.    ** propag
6350: 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d  ation links from
6360: 20 74 68 65 20 73 74 61 74 65 20 75 6e 64 65 72   the state under
6370: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e   construction in
6380: 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  to the.    ** pr
6390: 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c  eexisting state,
63a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70   then return a p
63b0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72  ointer to the pr
63c0: 65 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 20  eexisting state 
63d0: 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f  */.    struct co
63e0: 6e 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20  nfig *x, *y;.   
63f0: 20 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70   for(x=bp, y=stp
6400: 2d 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d  ->bp; x && y; x=
6410: 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b  x->bp, y=y->bp){
6420: 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70  .      Plink_cop
6430: 79 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70  y(&y->bplp,x->bp
6440: 6c 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  lp);.      Plink
6450: 5f 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29  _delete(x->fplp)
6460: 3b 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20  ;.      x->fplp 
6470: 3d 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20  = x->bplp = 0;. 
6480: 20 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43     }.    cfp = C
6490: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e  onfiglist_return
64a0: 28 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69  ();.    Configli
64b0: 73 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d  st_eat(cfp);.  }
64c0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69  else{.    /* Thi
64d0: 73 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65  s really is a ne
64e0: 77 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72  w state.  Constr
64f0: 75 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61  uct all the deta
6500: 69 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69  ils */.    Confi
6510: 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65  glist_closure(le
6520: 6d 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75  mp);    /* Compu
6530: 74 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  te the configura
6540: 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a  tion closure */.
6550: 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73      Configlist_s
6560: 6f 72 74 28 29 3b 20 20 20 20 20 20 20 20 20 20  ort();          
6570: 20 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e   /* Sort the con
6580: 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75  figuration closu
6590: 72 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20  re */.    cfp = 
65a0: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
65b0: 6e 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20  n();   /* Get a 
65c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
65d0: 6f 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20  onfig list */.  
65e0: 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65    stp = State_ne
65f0: 77 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f  w();           /
6600: 2a 20 41 20 6e 65 77 20 73 74 61 74 65 20 73 74  * A new state st
6610: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d  ructure */.    M
6620: 65 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b  emoryCheck(stp);
6630: 0a 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62  .    stp->bp = b
6640: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
6650: 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68    /* Remember th
6660: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
6670: 62 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70  basis */.    stp
6680: 2d 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20  ->cfp = cfp;    
6690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d            /* Rem
66a0: 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67  ember the config
66b0: 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20  uration closure 
66c0: 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 69 6e 64 65  */.    stp->inde
66d0: 78 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  x = lemp->nstate
66e0: 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73 74 61  ++; /* Every sta
66f0: 74 65 20 67 65 74 73 20 61 20 73 65 71 75 65 6e  te gets a sequen
6700: 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  ce number */.   
6710: 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20   stp->ap = 0;   
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6730: 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65 74   No actions, yet
6740: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f 69  . */.    State_i
6750: 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d 3e 62  nsert(stp,stp->b
6760: 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f 20  p);   /* Add to 
6770: 74 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20  the state table 
6780: 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68 69 66  */.    buildshif
6790: 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20  ts(lemp,stp);   
67a0: 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65      /* Recursive
67b0: 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63 63 65  ly compute succe
67c0: 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a 20  ssor states */. 
67d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 70 3b   }.  return stp;
67e0: 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74  .}../* Construct
67f0: 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72 20 73   all successor s
6800: 74 61 74 65 73 20 74 6f 20 74 68 65 20 67 69 76  tates to the giv
6810: 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22 73 75  en state.  A "su
6820: 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74  ccessor".** stat
6830: 65 20 69 73 20 61 6e 79 20 73 74 61 74 65 20 77  e is any state w
6840: 68 69 63 68 20 63 61 6e 20 62 65 20 72 65 61 63  hich can be reac
6850: 68 65 64 20 62 79 20 61 20 73 68 69 66 74 20 61  hed by a shift a
6860: 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
6870: 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66  E void buildshif
6880: 74 73 28 6c 65 6d 70 2c 73 74 70 29 0a 73 74 72  ts(lemp,stp).str
6890: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
68a0: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73  .struct state *s
68b0: 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 73  tp;     /* The s
68c0: 74 61 74 65 20 66 72 6f 6d 20 77 68 69 63 68 20  tate from which 
68d0: 73 75 63 63 65 73 73 6f 72 73 20 61 72 65 20 63  successors are c
68e0: 6f 6d 70 75 74 65 64 20 2a 2f 0a 7b 0a 20 20 73  omputed */.{.  s
68f0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
6900: 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  p;  /* For loopi
6910: 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66  ng thru the conf
6920: 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73  ig closure of "s
6930: 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  tp" */.  struct 
6940: 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a  config *bcfp; /*
6950: 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c   For the inner l
6960: 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c  oop on config cl
6970: 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a  osure of "stp" *
6980: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
6990: 67 20 2a 6e 65 77 3b 20 20 2f 2a 20 2a 2f 0a 20  g *new;  /* */. 
69a0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
69b0: 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20  sp;   /* Symbol 
69c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f  following the do
69d0: 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  t in configurati
69e0: 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20 73 74  on "cfp" */.  st
69f0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 73 70  ruct symbol *bsp
6a00: 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c  ;  /* Symbol fol
6a10: 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69  lowing the dot i
6a20: 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  n configuration 
6a30: 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75  "bcfp" */.  stru
6a40: 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73 74 70  ct state *newstp
6a50: 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  ; /* A pointer t
6a60: 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20 73 74  o a successor st
6a70: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63  ate */..  /* Eac
6a80: 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  h configuration 
6a90: 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65 74 65  becomes complete
6aa0: 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74 69 62   after it contib
6ab0: 75 74 65 73 20 74 6f 20 61 20 73 75 63 63 65 73  utes to a succes
6ac0: 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  sor.  ** state. 
6ad0: 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c 6c 20   Initially, all 
6ae0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61  configurations a
6af0: 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f  re incomplete */
6b00: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
6b10: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
6b20: 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e 73 74  p->next) cfp->st
6b30: 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54  atus = INCOMPLET
6b40: 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  E;..  /* Loop th
6b50: 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66 69 67  rough all config
6b60: 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  urations of the 
6b70: 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f 0a 20  state "stp" */. 
6b80: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
6b90: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
6ba0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
6bb0: 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d  cfp->status==COM
6bc0: 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65  PLETE ) continue
6bd0: 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20  ;    /* Already 
6be0: 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20 6c 6f  used by inner lo
6bf0: 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 66  op */.    if( cf
6c00: 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d  p->dot>=cfp->rp-
6c10: 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65  >nrhs ) continue
6c20: 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66  ;  /* Can't shif
6c30: 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20 2a 2f  t this config */
6c40: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
6c50: 72 65 73 65 74 28 29 3b 20 20 20 20 20 20 20 20  reset();        
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6c70: 20 52 65 73 65 74 20 74 68 65 20 6e 65 77 20 63   Reset the new c
6c80: 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20 20 20  onfig set */.   
6c90: 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d 3e 72   sp = cfp->rp->r
6ca0: 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20  hs[cfp->dot];   
6cb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d            /* Sym
6cc0: 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20 64 6f  bol after the do
6cd0: 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  t */..    /* For
6ce0: 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   every configura
6cf0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74  tion in the stat
6d00: 65 20 22 73 74 70 22 20 77 68 69 63 68 20 68 61  e "stp" which ha
6d10: 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70  s the symbol "sp
6d20: 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  ".    ** followi
6d30: 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64 64 20  ng its dot, add 
6d40: 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69 67 75  the same configu
6d50: 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 62 61  ration to the ba
6d60: 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a 20 20  sis set under.  
6d70: 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f    ** constructio
6d80: 6e 20 62 75 74 20 77 69 74 68 20 74 68 65 20 64  n but with the d
6d90: 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65 20 73  ot shifted one s
6da0: 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72 69 67  ymbol to the rig
6db0: 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 62  ht. */.    for(b
6dc0: 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b 20 62  cfp=cfp; bcfp; b
6dd0: 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74 29 7b  cfp=bcfp->next){
6de0: 0a 20 20 20 20 20 20 69 66 28 20 62 63 66 70 2d  .      if( bcfp-
6df0: 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54  >status==COMPLET
6e00: 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  E ) continue;   
6e10: 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64   /* Already used
6e20: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 63   */.      if( bc
6e30: 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e 72  fp->dot>=bcfp->r
6e40: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
6e50: 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73 68 69  ue; /* Can't shi
6e60: 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ft this one */. 
6e70: 20 20 20 20 20 62 73 70 20 3d 20 62 63 66 70 2d       bsp = bcfp-
6e80: 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d 3e 64  >rp->rhs[bcfp->d
6e90: 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ot];           /
6ea0: 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61 66 74  * Get symbol aft
6eb0: 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20 20 20  er dot */.      
6ec0: 69 66 28 20 62 73 70 21 3d 73 70 20 29 20 63 6f  if( bsp!=sp ) co
6ed0: 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 20 20 20  ntinue;         
6ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73            /* Mus
6ef0: 74 20 62 65 20 73 61 6d 65 20 61 73 20 66 6f 72  t be same as for
6f00: 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20 20 20   "cfp" */.      
6f10: 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43  bcfp->status = C
6f20: 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20 20 20  OMPLETE;        
6f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72            /* Mar
6f40: 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20 61 73  k this config as
6f50: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e   used */.      n
6f60: 65 77 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  ew = Configlist_
6f70: 61 64 64 62 61 73 69 73 28 62 63 66 70 2d 3e 72  addbasis(bcfp->r
6f80: 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a  p,bcfp->dot+1);.
6f90: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28        Plink_add(
6fa0: 26 6e 65 77 2d 3e 62 70 6c 70 2c 62 63 66 70 29  &new->bplp,bcfp)
6fb0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6fc0: 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  Get a pointer to
6fd0: 20 74 68 65 20 73 74 61 74 65 20 64 65 73 63 72   the state descr
6fe0: 69 62 65 64 20 62 79 20 74 68 65 20 62 61 73 69  ibed by the basi
6ff0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
7000: 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74  set.    ** const
7010: 72 75 63 74 65 64 20 69 6e 20 74 68 65 20 70 72  ructed in the pr
7020: 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a  eceding loop */.
7030: 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67 65 74      newstp = get
7040: 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20  state(lemp);..  
7050: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20 22    /* The state "
7060: 6e 65 77 73 74 70 22 20 69 73 20 72 65 61 63 68  newstp" is reach
7070: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ed from the stat
7080: 65 20 22 73 74 70 22 20 62 79 20 61 20 73 68 69  e "stp" by a shi
7090: 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ft action.    **
70a0: 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20 22   on the symbol "
70b0: 73 70 22 20 2a 2f 0a 20 20 20 20 41 63 74 69 6f  sp" */.    Actio
70c0: 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53  n_add(&stp->ap,S
70d0: 48 49 46 54 2c 73 70 2c 28 63 68 61 72 20 2a 29  HIFT,sp,(char *)
70e0: 6e 65 77 73 74 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  newstp);.  }.}..
70f0: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
7100: 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  the propagation 
7110: 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46 69  links.*/.void Fi
7120: 6e 64 4c 69 6e 6b 73 28 6c 65 6d 70 29 0a 73 74  ndLinks(lemp).st
7130: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
7140: 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  ;.{.  int i;.  s
7150: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
7160: 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74 72  p, *other;.  str
7170: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
7180: 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
7190: 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73 65  plp;..  /* House
71a0: 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a 0a  keeping detail:.
71b0: 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65 72    ** Add to ever
71c0: 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b  y propagate link
71d0: 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 20   a pointer back 
71e0: 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f 0a  to the state to.
71f0: 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20 6c    ** which the l
7200: 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64 2e  ink is attached.
7210: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
7220: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
7230: 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
7240: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
7250: 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d      for(cfp=stp-
7260: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
7270: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
7280: 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70 3b   cfp->stp = stp;
7290: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
72a0: 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61 63   Convert all bac
72b0: 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72 77  klinks into forw
72c0: 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c 79  ard links.  Only
72d0: 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20 2a   the forward.  *
72e0: 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65 64  * links are used
72f0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73   in the follow-s
7300: 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20  et computation. 
7310: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
7320: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
7330: 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
7340: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
7350: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
7360: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
7370: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
7380: 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70 6c  for(plp=cfp->bpl
7390: 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d  p; plp; plp=plp-
73a0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
73b0: 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66 70  other = plp->cfp
73c0: 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b 5f  ;.        Plink_
73d0: 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c 70  add(&other->fplp
73e0: 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ,cfp);.      }. 
73f0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43     }.  }.}../* C
7400: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c 6f  ompute all follo
7410: 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 66  wsets..**.** A f
7420: 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65 20  ollowset is the 
7430: 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62 6f  set of all symbo
7440: 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f 6d  ls which can com
7450: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  e immediately.**
7460: 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67 75   after a configu
7470: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
7480: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 6c  FindFollowSets(l
7490: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
74a0: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
74b0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   i;.  struct con
74c0: 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75  fig *cfp;.  stru
74d0: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20  ct plink *plp;. 
74e0: 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 20   int progress;. 
74f0: 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20   int change;..  
7500: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7510: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
7520: 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d     for(cfp=lemp-
7530: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b  >sorted[i]->cfp;
7540: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
7550: 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d  ext){.      cfp-
7560: 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50  >status = INCOMP
7570: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LETE;.    }.  }.
7580: 20 20 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f    .  do{.    pro
7590: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66  gress = 0;.    f
75a0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
75b0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
75c0: 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70      for(cfp=lemp
75d0: 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70  ->sorted[i]->cfp
75e0: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
75f0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
7600: 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  f( cfp->status==
7610: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
7620: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  nue;.        for
7630: 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20  (plp=cfp->fplp; 
7640: 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65  plp; plp=plp->ne
7650: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  xt){.          c
7660: 68 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e  hange = SetUnion
7670: 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63  (plp->cfp->fws,c
7680: 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20  fp->fws);.      
7690: 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 20 29      if( change )
76a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c  {.            pl
76b0: 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d  p->cfp->status =
76c0: 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20   INCOMPLETE;.   
76d0: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
76e0: 73 20 3d 20 31 3b 0a 09 20 20 7d 0a 09 7d 0a 20  s = 1;..  }..}. 
76f0: 20 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74         cfp->stat
7700: 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20  us = COMPLETE;. 
7710: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7720: 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20  while( progress 
7730: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
7740: 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63   resolve_conflic
7750: 74 28 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65  t();../* Compute
7760: 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
7770: 6f 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76 65  ons, and resolve
7780: 20 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76   conflicts..*/.v
7790: 6f 69 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28  oid FindActions(
77a0: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
77b0: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
77c0: 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63 74 20  t i,j;.  struct 
77d0: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
77e0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
77f0: 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
7800: 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20  l *sp;.  struct 
7810: 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f 2a 20  rule *rp;..  /* 
7820: 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  Add all of the r
7830: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 0a 20  educe actions . 
7840: 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61 63 74   ** A reduce act
7850: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66 6f 72  ion is added for
7860: 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   each element of
7870: 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20 6f   the followset o
7880: 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67 75  f.  ** a configu
7890: 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68 61 73  ration which has
78a0: 20 69 74 73 20 64 6f 74 20 61 74 20 74 68 65 20   its dot at the 
78b0: 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e 0a 20  extreme right.. 
78c0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
78d0: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
78e0: 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f  ++){   /* Loop o
78f0: 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20 2a  ver all states *
7900: 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  /.    stp = lemp
7910: 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
7920: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
7930: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
7940: 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f 70  >next){  /* Loop
7950: 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69 67   over all config
7960: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  urations */.    
7970: 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e 6e    if( cfp->rp->n
7980: 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 7b  rhs==cfp->dot ){
7990: 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 64 6f          /* Is do
79a0: 74 20 61 74 20 65 78 74 72 65 6d 65 20 72 69 67  t at extreme rig
79b0: 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ht? */.        f
79c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e  or(j=0; j<lemp->
79d0: 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b  nterminal; j++){
79e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53  .          if( S
79f0: 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77 73 2c  etFind(cfp->fws,
7a00: 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j) ){.          
7a10: 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64 75 63    /* Add a reduc
7a20: 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  e action to the 
7a30: 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63  state "stp" whic
7a40: 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20 62 79  h will reduce by
7a50: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
7a60: 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e 72   ** rule "cfp->r
7a70: 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68  p" if the lookah
7a80: 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20 22 6c  ead symbol is "l
7a90: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 22  emp->symbols[j]"
7aa0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
7ab0: 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d  Action_add(&stp-
7ac0: 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70 2d  >ap,REDUCE,lemp-
7ad0: 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68 61  >symbols[j],(cha
7ae0: 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20 20  r *)cfp->rp);.  
7af0: 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20          }..}.   
7b00: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
7b10: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63    /* Add the acc
7b20: 65 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a  epting token */.
7b30: 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72    if( lemp->star
7b40: 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79  t ){.    sp = Sy
7b50: 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e  mbol_find(lemp->
7b60: 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20  start);.    if( 
7b70: 73 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d  sp==0 ) sp = lem
7b80: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  p->rule->lhs;.  
7b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20  }else{.    sp = 
7ba0: 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b  lemp->rule->lhs;
7bb0: 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74 6f  .  }.  /* Add to
7bc0: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
7bd0: 20 28 77 68 69 63 68 20 69 73 20 61 6c 77 61 79   (which is alway
7be0: 73 20 74 68 65 20 73 74 61 72 74 69 6e 67 20 73  s the starting s
7bf0: 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tate of the.  **
7c00: 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61   finite state ma
7c10: 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69 6f 6e  chine) an action
7c20: 20 74 6f 20 41 43 43 45 50 54 20 69 66 20 74 68   to ACCEPT if th
7c30: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20 74  e lookahead is t
7c40: 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e 6f  he.  ** start no
7c50: 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20  nterminal.  */. 
7c60: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65 6d   Action_add(&lem
7c70: 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61 70  p->sorted[0]->ap
7c80: 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a 0a  ,ACCEPT,sp,0);..
7c90: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6e    /* Resolve con
7ca0: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28  flicts */.  for(
7cb0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
7cc0: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
7cd0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
7ce0: 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74 72 75  , *nap;.    stru
7cf0: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
7d00: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
7d10: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 73  orted[i];.    as
7d20: 73 65 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b  sert( stp->ap );
7d30: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41  .    stp->ap = A
7d40: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e  ction_sort(stp->
7d50: 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  ap);.    for(ap=
7d60: 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61  stp->ap; ap && a
7d70: 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e  p->next; ap=ap->
7d80: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72  next){.      for
7d90: 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e  (nap=ap->next; n
7da0: 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61  ap && nap->sp==a
7db0: 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e  p->sp; nap=nap->
7dc0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  next){.         
7dd0: 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69 6f  /* The two actio
7de0: 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61 70  ns "ap" and "nap
7df0: 22 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  " have the same 
7e00: 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 20  lookahead..     
7e10: 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75      ** Figure ou
7e20: 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f 75  t which one shou
7e30: 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20  ld be used */.  
7e40: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f         lemp->nco
7e50: 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76  nflict += resolv
7e60: 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61  e_conflict(ap,na
7e70: 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 29 3b  p,lemp->errsym);
7e80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7e90: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
7ea0: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63  an error for eac
7eb0: 68 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20  h rule that can 
7ec0: 6e 65 76 65 72 20 62 65 20 72 65 64 75 63 65 64  never be reduced
7ed0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  . */.  for(rp=le
7ee0: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
7ef0: 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63  =rp->next) rp->c
7f00: 61 6e 52 65 64 75 63 65 20 3d 20 42 5f 46 41 4c  anReduce = B_FAL
7f10: 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  SE;.  for(i=0; i
7f20: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
7f30: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
7f40: 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20  action *ap;.    
7f50: 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72  for(ap=lemp->sor
7f60: 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20  ted[i]->ap; ap; 
7f70: 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
7f80: 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
7f90: 3d 3d 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78  ==REDUCE ) ap->x
7fa0: 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d  .rp->canReduce =
7fb0: 20 42 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   B_TRUE;.    }. 
7fc0: 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
7fd0: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
7fe0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
7ff0: 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20  ( rp->canReduce 
8000: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8010: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
8020: 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
8030: 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20  line,"This rule 
8040: 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63  can not be reduc
8050: 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d  ed.\n");.    lem
8060: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
8070: 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65   }.}../* Resolve
8080: 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77   a conflict betw
8090: 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65  een the two give
80a0: 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74  n actions.  If t
80b0: 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63  he.** conflict c
80c0: 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76 65 2c  an't be resolve,
80d0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
80e0: 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45  ..**.** NO LONGE
80f0: 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20  R TRUE:.**   To 
8100: 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69  resolve a confli
8110: 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74  ct, first look t
8120: 6f 20 73 65 65 20 69 66 20 65 69 74 68 65 72 20  o see if either 
8130: 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f  action.**   is o
8140: 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e  n an error rule.
8150: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
8160: 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20  take the action 
8170: 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f  which.**   is no
8180: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
8190: 68 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65  h the error rule
81a0: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72  .  If neither or
81b0: 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f   both.**   actio
81c0: 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61 74 65  ns are associate
81d0: 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
81e0: 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74  rule, then try t
81f0: 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65  o.**   use prece
8200: 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65  dence to resolve
8210: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a   the conflict..*
8220: 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61  *.** If either a
8230: 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54  ction is a SHIFT
8240: 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62  , then it must b
8250: 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20  e apx.  This.** 
8260: 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77  function won't w
8270: 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65  ork if apx->type
8280: 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70 79  ==REDUCE and apy
8290: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a  ->type==SHIFT..*
82a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
82b0: 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70  olve_conflict(ap
82c0: 78 2c 61 70 79 2c 65 72 72 73 79 6d 29 0a 73 74  x,apy,errsym).st
82d0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 78  ruct action *apx
82e0: 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ;.struct action 
82f0: 2a 61 70 79 3b 0a 73 74 72 75 63 74 20 73 79 6d  *apy;.struct sym
8300: 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f  bol *errsym;   /
8310: 2a 20 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62  * The error symb
8320: 6f 6c 20 28 69 66 20 64 65 66 69 6e 65 64 2e 20  ol (if defined. 
8330: 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 29   NULL otherwise)
8340: 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 73   */.{.  struct s
8350: 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79  ymbol *spx, *spy
8360: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
8370: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70   0;.  assert( ap
8380: 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29  x->sp==apy->sp )
8390: 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  ;  /* Otherwise 
83a0: 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e  there would be n
83b0: 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  o conflict */.  
83c0: 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53  if( apx->type==S
83d0: 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70  HIFT && apy->typ
83e0: 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20  e==REDUCE ){.   
83f0: 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b 0a   spx = apx->sp;.
8400: 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78      spy = apy->x
8410: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
8420: 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c 20    if( spy==0 || 
8430: 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73  spx->prec<0 || s
8440: 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20 20  py->prec<0 ){.  
8450: 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67      /* Not enoug
8460: 68 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e 66  h precedence inf
8470: 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  ormation. */.   
8480: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 43     apy->type = C
8490: 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65  ONFLICT;.      e
84a0: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c  rrcnt++;.    }el
84b0: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
84c0: 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20 20 20  >spy->prec ){   
84d0: 20 2f 2a 20 4c 6f 77 65 72 20 70 72 65 63 65 64   /* Lower preced
84e0: 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20  ence wins */.   
84f0: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
8500: 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  D_RESOLVED;.    
8510: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
8520: 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b  rec<spy->prec ){
8530: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
8540: 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a   = SH_RESOLVED;.
8550: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
8560: 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72  x->prec==spy->pr
8570: 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63  ec && spx->assoc
8580: 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73  ==RIGHT ){ /* Us
8590: 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  e operator */.  
85a0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
85b0: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20  RD_RESOLVED;    
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f           /* asso
85e0: 63 69 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20  ciativity */.   
85f0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
8600: 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20  prec==spy->prec 
8610: 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c  && spx->assoc==L
8620: 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72  EFT ){  /* to br
8630: 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20  eak tie */.     
8640: 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f   apx->type = SH_
8650: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
8660: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
8670: 74 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70  t( spx->prec==sp
8680: 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e  y->prec && spx->
8690: 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20  assoc==NONE );. 
86a0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
86b0: 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20   CONFLICT;.     
86c0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
86d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78  .  }else if( apx
86e0: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
86f0: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44  & apy->type==RED
8700: 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d  UCE ){.    spx =
8710: 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apx->x.rp->prec
8720: 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61  sym;.    spy = a
8730: 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  py->x.rp->precsy
8740: 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d  m;.    if( spx==
8750: 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73  0 || spy==0 || s
8760: 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20  px->prec<0 ||.  
8770: 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c    spy->prec<0 ||
8780: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
8790: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
87a0: 70 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46 4c  py->type = CONFL
87b0: 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e  ICT;.      errcn
87c0: 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t++;.    }else i
87d0: 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79  f( spx->prec>spy
87e0: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
87f0: 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52  apy->type = RD_R
8800: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
8810: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
8820: 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20  <spy->prec ){.  
8830: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20      apx->type = 
8840: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  RD_RESOLVED;.   
8850: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
8860: 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 61  assert( .      a
8870: 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53  px->type==SH_RES
8880: 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61  OLVED ||.      a
8890: 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53  px->type==RD_RES
88a0: 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61  OLVED ||.      a
88b0: 70 78 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49  px->type==CONFLI
88c0: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  CT ||.      apy-
88d0: 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56  >type==SH_RESOLV
88e0: 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  ED ||.      apy-
88f0: 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56  >type==RD_RESOLV
8900: 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  ED ||.      apy-
8910: 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43 54 0a  >type==CONFLICT.
8920: 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68      );.    /* Th
8930: 65 20 52 45 44 55 43 45 2f 53 48 49 46 54 20 63  e REDUCE/SHIFT c
8940: 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70 70 65  ase cannot happe
8950: 6e 20 62 65 63 61 75 73 65 20 53 48 49 46 54 73  n because SHIFTs
8960: 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20 20   come before.   
8970: 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e 20 74   ** REDUCEs on t
8980: 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77 65 20  he list.  If we 
8990: 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
89a0: 20 69 74 20 6d 75 73 74 20 62 65 20 62 65 63 61   it must be beca
89b0: 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  use.    ** the p
89c0: 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74 20 68  arser conflict h
89d0: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
89e0: 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 7d  resolved. */.  }
89f0: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74  .  return errcnt
8a00: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
8a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
8a20: 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67  the file "config
8a30: 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  list.c" ********
8a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8a50: 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  */./*.** Routine
8a60: 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e 67 20  s to processing 
8a70: 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  a configuration 
8a80: 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64 69 6e  list and buildin
8a90: 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e 20  g a state.** in 
8aa0: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
8ab0: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
8ac0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
8ad0: 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74 20 3d  nfig *freelist =
8ae0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74   0;      /* List
8af0: 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69 67 75   of free configu
8b00: 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
8b10: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
8b20: 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  *current = 0;   
8b30: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69      /* Top of li
8b40: 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74  st of configurat
8b50: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  ions */.static s
8b60: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 63  truct config **c
8b70: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20 20  urrentend = 0;  
8b80: 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73 74   /* Last on list
8b90: 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73   of configs */.s
8ba0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
8bb0: 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30 3b 20  fig *basis = 0; 
8bc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
8bd0: 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20  f list of basis 
8be0: 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69  configs */.stati
8bf0: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
8c00: 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 20  **basisend = 0; 
8c10: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 69      /* End of li
8c20: 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66  st of basis conf
8c30: 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72  igs */../* Retur
8c40: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
8c50: 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69   new configurati
8c60: 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 73 74  on */.PRIVATE st
8c70: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
8c80: 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74 72 75  config(){.  stru
8c90: 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 3b 0a  ct config *new;.
8ca0: 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d    if( freelist==
8cb0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
8cc0: 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 33 3b      int amt = 3;
8cd0: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
8ce0: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
8cf0: 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
8d00: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 2a 61  struct config)*a
8d10: 6d 74 20 29 3b 0a 20 20 20 20 69 66 28 20 66 72  mt );.    if( fr
8d20: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
8d30: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
8d40: 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  r,"Unable to all
8d50: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
8d60: 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61   a new configura
8d70: 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65  tion.");.      e
8d80: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
8d90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74    for(i=0; i<amt
8da0: 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73  -1; i++) freelis
8db0: 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65  t[i].next = &fre
8dc0: 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
8dd0: 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e  freelist[amt-1].
8de0: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  next = 0;.  }.  
8df0: 6e 65 77 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a  new = freelist;.
8e00: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65    freelist = fre
8e10: 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
8e20: 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a  eturn new;.}../*
8e30: 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   The configurati
8e40: 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f 20 6c  on "old" is no l
8e50: 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a 50 52  onger used */.PR
8e60: 49 56 41 54 45 20 76 6f 69 64 20 64 65 6c 65 74  IVATE void delet
8e70: 65 63 6f 6e 66 69 67 28 6f 6c 64 29 0a 73 74 72  econfig(old).str
8e80: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
8e90: 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d  .{.  old->next =
8ea0: 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65   freelist;.  fre
8eb0: 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a  elist = old;.}..
8ec0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74  /* Initialized t
8ed0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
8ee0: 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f   list builder */
8ef0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
8f00: 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75 72 72 65  _init(){.  curre
8f10: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
8f20: 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b  tend = &current;
8f30: 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20  .  basis = 0;.  
8f40: 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69  basisend = &basi
8f50: 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65  s;.  Configtable
8f60: 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74 75 72  _init();.  retur
8f70: 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  n;.}../* Initial
8f80: 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75  ized the configu
8f90: 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c  ration list buil
8fa0: 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  der */.void Conf
8fb0: 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 7b 0a  iglist_reset(){.
8fc0: 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20    current = 0;. 
8fd0: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
8fe0: 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20  urrent;.  basis 
8ff0: 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  = 0;.  basisend 
9000: 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66  = &basis;.  Conf
9010: 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 30 29  igtable_clear(0)
9020: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
9030: 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20 63 6f  * Add another co
9040: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74  nfiguration to t
9050: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
9060: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
9070: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
9080: 73 74 5f 61 64 64 28 72 70 2c 64 6f 74 29 0a 73  st_add(rp,dot).s
9090: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20  truct rule *rp; 
90a0: 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20 2a     /* The rule *
90b0: 2f 0a 69 6e 74 20 64 6f 74 3b 20 20 20 20 20 20  /.int dot;      
90c0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
90d0: 6e 74 6f 20 74 68 65 20 52 48 53 20 6f 66 20 74  nto the RHS of t
90e0: 68 65 20 72 75 6c 65 20 77 68 65 72 65 20 74 68  he rule where th
90f0: 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 7b 0a  e dot goes */.{.
9100: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
9110: 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20  *cfp, model;..  
9120: 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65  assert( currente
9130: 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c  nd!=0 );.  model
9140: 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65  .rp = rp;.  mode
9150: 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63  l.dot = dot;.  c
9160: 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65  fp = Configtable
9170: 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20  _find(&model);. 
9180: 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20   if( cfp==0 ){. 
9190: 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66     cfp = newconf
91a0: 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72  ig();.    cfp->r
91b0: 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d  p = rp;.    cfp-
91c0: 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20  >dot = dot;.    
91d0: 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65  cfp->fws = SetNe
91e0: 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74  w();.    cfp->st
91f0: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
9200: 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70  fplp = cfp->bplp
9210: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e   = 0;.    cfp->n
9220: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  ext = 0;.    cfp
9230: 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63  ->bp = 0;.    *c
9240: 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b  urrentend = cfp;
9250: 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20  .    currentend 
9260: 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20  = &cfp->next;.  
9270: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e    Configtable_in
9280: 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20  sert(cfp);.  }. 
9290: 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a   return cfp;.}..
92a0: 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73 20 63  /* Add a basis c
92b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
92c0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
92d0: 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  n list */.struct
92e0: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
92f0: 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70 2c  ist_addbasis(rp,
9300: 64 6f 74 29 0a 73 74 72 75 63 74 20 72 75 6c 65  dot).struct rule
9310: 20 2a 72 70 3b 0a 69 6e 74 20 64 6f 74 3b 0a 7b   *rp;.int dot;.{
9320: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
9330: 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20   *cfp, model;.. 
9340: 20 61 73 73 65 72 74 28 20 62 61 73 69 73 65 6e   assert( basisen
9350: 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d!=0 );.  assert
9360: 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20  ( currentend!=0 
9370: 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20  );.  model.rp = 
9380: 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20  rp;.  model.dot 
9390: 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43  = dot;.  cfp = C
93a0: 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28  onfigtable_find(
93b0: 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63  &model);.  if( c
93c0: 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70  fp==0 ){.    cfp
93d0: 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a   = newconfig();.
93e0: 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70      cfp->rp = rp
93f0: 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d  ;.    cfp->dot =
9400: 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66   dot;.    cfp->f
9410: 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20  ws = SetNew();. 
9420: 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b     cfp->stp = 0;
9430: 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d  .    cfp->fplp =
9440: 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a   cfp->bplp = 0;.
9450: 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20      cfp->next = 
9460: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d  0;.    cfp->bp =
9470: 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74   0;.    *current
9480: 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63  end = cfp;.    c
9490: 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70  urrentend = &cfp
94a0: 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61 73  ->next;.    *bas
94b0: 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  isend = cfp;.   
94c0: 20 62 61 73 69 73 65 6e 64 20 3d 20 26 63 66 70   basisend = &cfp
94d0: 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67  ->bp;.    Config
94e0: 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70  table_insert(cfp
94f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9500: 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75  cfp;.}../* Compu
9510: 74 65 20 74 68 65 20 63 6c 6f 73 75 72 65 20 6f  te the closure o
9520: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  f the configurat
9530: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
9540: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73   Configlist_clos
9550: 75 72 65 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  ure(lemp).struct
9560: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
9570: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
9580: 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b 0a 20  *cfp, *newcfp;. 
9590: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
95a0: 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74 72 75  , *newrp;.  stru
95b0: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a  ct symbol *sp, *
95c0: 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 64 6f  xsp;.  int i, do
95d0: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
95e0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
95f0: 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65 6e 74   for(cfp=current
9600: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
9610: 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20 3d 20  next){.    rp = 
9620: 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64 6f 74  cfp->rp;.    dot
9630: 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20 20 20   = cfp->dot;.   
9640: 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72   if( dot>=rp->nr
9650: 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  hs ) continue;. 
9660: 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b     sp = rp->rhs[
9670: 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  dot];.    if( sp
9680: 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49  ->type==NONTERMI
9690: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  NAL ){.      if(
96a0: 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26 26 20   sp->rule==0 && 
96b0: 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  sp!=lemp->errsym
96c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
96d0: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
96e0: 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f  ame,rp->line,"No
96f0: 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73 5c 22  nterminal \"%s\"
9700: 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e 22 2c   has no rules.",
9710: 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 6e  .          sp->n
9720: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  ame);.        le
9730: 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
9740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
9750: 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75 6c 65  r(newrp=sp->rule
9760: 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70 3d 6e  ; newrp; newrp=n
9770: 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a  ewrp->nextlhs){.
9780: 20 20 20 20 20 20 20 20 6e 65 77 63 66 70 20 3d          newcfp =
9790: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28   Configlist_add(
97a0: 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20 20 20  newrp,0);.      
97b0: 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b 20 69    for(i=dot+1; i
97c0: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
97d0: 0a 20 20 20 20 20 20 20 20 20 20 78 73 70 20 3d  .          xsp =
97e0: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
97f0: 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e         if( xsp->
9800: 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29  type==TERMINAL )
9810: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 65  {.            Se
9820: 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73  tAdd(newcfp->fws
9830: 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  ,xsp->index);.  
9840: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9850: 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20  ..  }else{.     
9860: 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f 6e 28         SetUnion(
9870: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d  newcfp->fws,xsp-
9880: 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20  >firstset);.    
9890: 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d          if( xsp-
98a0: 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45  >lambda==B_FALSE
98b0: 20 29 20 62 72 65 61 6b 3b 0a 09 20 20 7d 0a 09   ) break;..  }..
98c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  }.        if( i=
98d0: 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c 69 6e  =rp->nrhs ) Plin
98e0: 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66 70 6c 70  k_add(&cfp->fplp
98f0: 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20 20 20 20  ,newcfp);.      
9900: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
9910: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  turn;.}../* Sort
9920: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
9930: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
9940: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28  Configlist_sort(
9950: 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28  ){.  current = (
9960: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
9970: 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75  msort((char *)cu
9980: 72 72 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26  rrent,(char **)&
9990: 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c  (current->next),
99a0: 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75  Configcmp);.  cu
99b0: 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20  rrentend = 0;.  
99c0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f  return;.}../* So
99d0: 72 74 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e  rt the basis con
99e0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
99f0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
9a00: 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 7b 0a  st_sortbasis(){.
9a10: 20 20 62 61 73 69 73 20 3d 20 28 73 74 72 75 63    basis = (struc
9a20: 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74  t config *)msort
9a30: 28 28 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74  ((char *)current
9a40: 2c 28 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72  ,(char **)&(curr
9a50: 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66 69 67 63  ent->bp),Configc
9a60: 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  mp);.  basisend 
9a70: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
9a80: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
9a90: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
9aa0: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
9ab0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
9ac0: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
9ad0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
9ae0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72  ig *Configlist_r
9af0: 65 74 75 72 6e 28 29 7b 0a 20 20 73 74 72 75 63  eturn(){.  struc
9b00: 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20  t config *old;. 
9b10: 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a   old = current;.
9b20: 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20    current = 0;. 
9b30: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b   currentend = 0;
9b40: 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d  .  return old;.}
9b50: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
9b60: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
9b70: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
9b80: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
9b90: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
9ba0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
9bb0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62  ig *Configlist_b
9bc0: 61 73 69 73 28 29 7b 0a 20 20 73 74 72 75 63 74  asis(){.  struct
9bd0: 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20   config *old;.  
9be0: 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20 20 62  old = basis;.  b
9bf0: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
9c00: 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  send = 0;.  retu
9c10: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72  rn old;.}../* Fr
9c20: 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20  ee all elements 
9c30: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6e  of the given con
9c40: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
9c50: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
9c60: 73 74 5f 65 61 74 28 63 66 70 29 0a 73 74 72 75  st_eat(cfp).stru
9c70: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
9c80: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
9c90: 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f  g *nextcfp;.  fo
9ca0: 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78  r(; cfp; cfp=nex
9cb0: 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63  tcfp){.    nextc
9cc0: 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a  fp = cfp->next;.
9cd0: 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d      assert( cfp-
9ce0: 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20  >fplp==0 );.    
9cf0: 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c  assert( cfp->bpl
9d00: 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  p==0 );.    if( 
9d10: 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72  cfp->fws ) SetFr
9d20: 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ee(cfp->fws);.  
9d30: 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63    deleteconfig(c
9d40: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
9d50: 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n;.}./**********
9d60: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
9d70: 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20   file "error.c" 
9d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9da0: 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
9db0: 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72  r printing error
9dc0: 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 2f 2a   message..*/../*
9dd0: 20 46 69 6e 64 20 61 20 67 6f 6f 64 20 70 6c 61   Find a good pla
9de0: 63 65 20 74 6f 20 62 72 65 61 6b 20 22 6d 73 67  ce to break "msg
9df0: 22 20 73 6f 20 74 68 61 74 20 69 74 73 20 6c 65  " so that its le
9e00: 6e 67 74 68 20 69 73 20 61 74 20 6c 65 61 73 74  ngth is at least
9e10: 20 22 6d 69 6e 22 0a 2a 2a 20 62 75 74 20 6e 6f   "min".** but no
9e20: 20 6d 6f 72 65 20 74 68 61 6e 20 22 6d 61 78 22   more than "max"
9e30: 2e 20 20 4d 61 6b 65 20 74 68 65 20 70 6f 69 6e  .  Make the poin
9e40: 74 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 6d 61  t as close to ma
9e50: 78 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  x as possible..*
9e60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
9e70: 64 62 72 65 61 6b 28 6d 73 67 2c 6d 69 6e 2c 6d  dbreak(msg,min,m
9e80: 61 78 29 0a 63 68 61 72 20 2a 6d 73 67 3b 0a 69  ax).char *msg;.i
9e90: 6e 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d 61 78 3b  nt min;.int max;
9ea0: 0a 7b 0a 20 20 69 6e 74 20 69 2c 73 70 6f 74 3b  .{.  int i,spot;
9eb0: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66 6f 72  .  char c;.  for
9ec0: 28 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20 69 3c 3d  (i=spot=min; i<=
9ed0: 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  max; i++){.    c
9ee0: 20 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20 20 20 69   = msg[i];.    i
9ef0: 66 28 20 63 3d 3d 27 5c 74 27 20 29 20 6d 73 67  f( c=='\t' ) msg
9f00: 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69  [i] = ' ';.    i
9f10: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 6d 73  f( c=='\n' ){ ms
9f20: 67 5b 69 5d 20 3d 20 27 20 27 3b 20 73 70 6f 74  g[i] = ' '; spot
9f30: 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20   = i; break; }. 
9f40: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 20 73     if( c==0 ){ s
9f50: 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20  pot = i; break; 
9f60: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2d 27  }.    if( c=='-'
9f70: 20 26 26 20 69 3c 6d 61 78 2d 31 20 29 20 73 70   && i<max-1 ) sp
9f80: 6f 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 69 66  ot = i+1;.    if
9f90: 28 20 63 3d 3d 27 20 27 20 29 20 73 70 6f 74 20  ( c==' ' ) spot 
9fa0: 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
9fb0: 6e 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n spot;.}../*.**
9fc0: 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   The error messa
9fd0: 67 65 20 69 73 20 73 70 6c 69 74 20 61 63 72 6f  ge is split acro
9fe0: 73 73 20 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 65  ss multiple line
9ff0: 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  s if necessary. 
a000: 20 54 68 65 0a 2a 2a 20 73 70 6c 69 74 73 20 6f   The.** splits o
a010: 63 63 75 72 20 61 74 20 61 20 73 70 61 63 65 2c  ccur at a space,
a020: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 73   if there is a s
a030: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6e  pace available n
a040: 65 61 72 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f  ear the end.** o
a050: 66 20 74 68 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 23  f the line..*/.#
a060: 64 65 66 69 6e 65 20 45 52 52 4d 53 47 53 49 5a  define ERRMSGSIZ
a070: 45 20 20 31 30 30 30 30 20 2f 2a 20 48 6f 70 65  E  10000 /* Hope
a080: 20 74 68 69 73 20 69 73 20 62 69 67 20 65 6e 6f   this is big eno
a090: 75 67 68 2e 20 20 4e 6f 20 77 61 79 20 74 6f 20  ugh.  No way to 
a0a0: 65 72 72 6f 72 20 63 68 65 63 6b 20 2a 2f 0a 23  error check */.#
a0b0: 64 65 66 69 6e 65 20 4c 49 4e 45 57 49 44 54 48  define LINEWIDTH
a0c0: 20 20 20 20 20 20 37 39 20 2f 2a 20 4d 61 78 20        79 /* Max 
a0d0: 77 69 64 74 68 20 6f 66 20 61 6e 79 20 6f 75 74  width of any out
a0e0: 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66  put line */.#def
a0f0: 69 6e 65 20 50 52 45 46 49 58 4c 49 4d 49 54 20  ine PREFIXLIMIT 
a100: 20 20 20 33 30 20 2f 2a 20 4d 61 78 20 77 69 64     30 /* Max wid
a110: 74 68 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  th of the prefix
a120: 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f   on each line */
a130: 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63  .void ErrorMsg(c
a140: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
a150: 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  ame, int lineno,
a160: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72   const char *for
a170: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61  mat, ...){.  cha
a180: 72 20 65 72 72 6d 73 67 5b 45 52 52 4d 53 47 53  r errmsg[ERRMSGS
a190: 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 72 65  IZE];.  char pre
a1a0: 66 69 78 5b 50 52 45 46 49 58 4c 49 4d 49 54 2b  fix[PREFIXLIMIT+
a1b0: 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72 72 6d 73  10];.  int errms
a1c0: 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20 70 72 65  gsize;.  int pre
a1d0: 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e 74 20 61  fixsize;.  int a
a1e0: 76 61 69 6c 61 62 6c 65 77 69 64 74 68 3b 0a 20  vailablewidth;. 
a1f0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
a200: 6e 74 20 65 6e 64 2c 20 72 65 73 74 61 72 74 2c  nt end, restart,
a210: 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f 73 74 61   base;..  va_sta
a220: 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a  rt(ap, format);.
a230: 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61 20 70    /* Prepare a p
a240: 72 65 66 69 78 20 74 6f 20 62 65 20 70 72 65 70  refix to be prep
a250: 65 6e 64 65 64 20 74 6f 20 65 76 65 72 79 20 6f  ended to every o
a260: 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 20 20  utput line */.  
a270: 69 66 28 20 6c 69 6e 65 6e 6f 3e 30 20 29 7b 0a  if( lineno>0 ){.
a280: 20 20 20 20 73 70 72 69 6e 74 66 28 70 72 65 66      sprintf(pref
a290: 69 78 2c 22 25 2e 2a 73 3a 25 64 3a 20 22 2c 50  ix,"%.*s:%d: ",P
a2a0: 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69  REFIXLIMIT-10,fi
a2b0: 6c 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29 3b 0a  lename,lineno);.
a2c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72    }else{.    spr
a2d0: 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a  intf(prefix,"%.*
a2e0: 73 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d 49 54  s: ",PREFIXLIMIT
a2f0: 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  -10,filename);. 
a300: 20 7d 0a 20 20 70 72 65 66 69 78 73 69 7a 65 20   }.  prefixsize 
a310: 3d 20 73 74 72 6c 65 6e 28 70 72 65 66 69 78 29  = strlen(prefix)
a320: 3b 0a 20 20 61 76 61 69 6c 61 62 6c 65 77 69 64  ;.  availablewid
a330: 74 68 20 3d 20 4c 49 4e 45 57 49 44 54 48 20 2d  th = LINEWIDTH -
a340: 20 70 72 65 66 69 78 73 69 7a 65 3b 0a 0a 20 20   prefixsize;..  
a350: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
a360: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  error message */
a370: 0a 20 20 76 73 70 72 69 6e 74 66 28 65 72 72 6d  .  vsprintf(errm
a380: 73 67 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20  sg,format,ap);. 
a390: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65   va_end(ap);.  e
a3a0: 72 72 6d 73 67 73 69 7a 65 20 3d 20 73 74 72 6c  rrmsgsize = strl
a3b0: 65 6e 28 65 72 72 6d 73 67 29 3b 0a 20 20 2f 2a  en(errmsg);.  /*
a3c0: 20 52 65 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67   Remove trailing
a3d0: 20 27 5c 6e 27 73 20 66 72 6f 6d 20 74 68 65 20   '\n's from the 
a3e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 2a  error message. *
a3f0: 2f 0a 20 20 77 68 69 6c 65 28 20 65 72 72 6d 73  /.  while( errms
a400: 67 73 69 7a 65 3e 30 20 26 26 20 65 72 72 6d 73  gsize>0 && errms
a410: 67 5b 65 72 72 6d 73 67 73 69 7a 65 2d 31 5d 3d  g[errmsgsize-1]=
a420: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 65 72  ='\n' ){.     er
a430: 72 6d 73 67 5b 2d 2d 65 72 72 6d 73 67 73 69 7a  rmsg[--errmsgsiz
a440: 65 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  e] = 0;.  }..  /
a450: 2a 20 50 72 69 6e 74 20 74 68 65 20 65 72 72 6f  * Print the erro
a460: 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 62  r message */.  b
a470: 61 73 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ase = 0;.  while
a480: 28 20 65 72 72 6d 73 67 5b 62 61 73 65 5d 21 3d  ( errmsg[base]!=
a490: 30 20 29 7b 0a 20 20 20 20 65 6e 64 20 3d 20 72  0 ){.    end = r
a4a0: 65 73 74 61 72 74 20 3d 20 66 69 6e 64 62 72 65  estart = findbre
a4b0: 61 6b 28 26 65 72 72 6d 73 67 5b 62 61 73 65 5d  ak(&errmsg[base]
a4c0: 2c 30 2c 61 76 61 69 6c 61 62 6c 65 77 69 64 74  ,0,availablewidt
a4d0: 68 29 3b 0a 20 20 20 20 72 65 73 74 61 72 74 20  h);.    restart 
a4e0: 2b 3d 20 62 61 73 65 3b 0a 20 20 20 20 77 68 69  += base;.    whi
a4f0: 6c 65 28 20 65 72 72 6d 73 67 5b 72 65 73 74 61  le( errmsg[resta
a500: 72 74 5d 3d 3d 27 20 27 20 29 20 72 65 73 74 61  rt]==' ' ) resta
a510: 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  rt++;.    fprint
a520: 66 28 73 74 64 6f 75 74 2c 22 25 73 25 2e 2a 73  f(stdout,"%s%.*s
a530: 5c 6e 22 2c 70 72 65 66 69 78 2c 65 6e 64 2c 26  \n",prefix,end,&
a540: 65 72 72 6d 73 67 5b 62 61 73 65 5d 29 3b 0a 20  errmsg[base]);. 
a550: 20 20 20 62 61 73 65 20 3d 20 72 65 73 74 61 72     base = restar
a560: 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  t;.  }.}./******
a570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
a580: 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63  the file "main.c
a590: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
a5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a5b0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61  ******/./*.** Ma
a5c0: 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20  in program file 
a5d0: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
a5e0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
a5f0: 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e  */../* Report an
a600: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63   out-of-memory c
a610: 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f  ondition and abo
a620: 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  rt.  This functi
a630: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f  on.** is used mo
a640: 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d  stly by the "Mem
a650: 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20  oryCheck" macro 
a660: 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76  in struct.h.*/.v
a670: 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72  oid memory_error
a680: 28 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  (){.  fprintf(st
a690: 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
a6a0: 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e  ory.  Aborting..
a6b0: 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29  .\n");.  exit(1)
a6c0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
a6d0: 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 20 20  nDefine = 0;    
a6e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d    /* Number of -
a6f0: 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65  D options on the
a700: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f   command line */
a710: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61  .static char **a
a720: 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a  zDefine = 0;  /*
a730: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 2d 44 20   Name of the -D 
a740: 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68  macros */../* Th
a750: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
a760: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 61 72  lled with the ar
a770: 67 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20 2d  gument to each -
a780: 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  D command-line o
a790: 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68  ption..** Add th
a7a0: 65 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 20  e macro defined 
a7b0: 74 6f 20 74 68 65 20 61 7a 44 65 66 69 6e 65 20  to the azDefine 
a7c0: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
a7d0: 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f   void handle_D_o
a7e0: 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a  ption(char *z){.
a7f0: 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20    char **paz;.  
a800: 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44  nDefine++;.  azD
a810: 65 66 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  efine = realloc(
a820: 61 7a 44 65 66 69 6e 65 2c 20 73 69 7a 65 6f 66  azDefine, sizeof
a830: 28 61 7a 44 65 66 69 6e 65 5b 30 5d 29 2a 6e 44  (azDefine[0])*nD
a840: 65 66 69 6e 65 29 3b 0a 20 20 69 66 28 20 61 7a  efine);.  if( az
a850: 44 65 66 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  Define==0 ){.   
a860: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
a870: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
a880: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
a890: 0a 20 20 7d 0a 20 20 70 61 7a 20 3d 20 26 61 7a  .  }.  paz = &az
a8a0: 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31  Define[nDefine-1
a8b0: 5d 3b 0a 20 20 2a 70 61 7a 20 3d 20 6d 61 6c 6c  ];.  *paz = mall
a8c0: 6f 63 28 20 73 74 72 6c 65 6e 28 7a 29 2b 31 20  oc( strlen(z)+1 
a8d0: 29 3b 0a 20 20 69 66 28 20 2a 70 61 7a 3d 3d 30  );.  if( *paz==0
a8e0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
a8f0: 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d  stderr,"out of m
a900: 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65  emory\n");.    e
a910: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74  xit(1);.  }.  st
a920: 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20  rcpy(*paz, z);. 
a930: 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20   for(z=*paz; *z 
a940: 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29  && *z!='='; z++)
a950: 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a  {}.  *z = 0;.}..
a960: 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f  ./* The main pro
a970: 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65  gram.  Parse the
a980: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e   command line an
a990: 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e  d do it... */.in
a9a0: 74 20 6d 61 69 6e 28 61 72 67 63 2c 61 72 67 76  t main(argc,argv
a9b0: 29 0a 69 6e 74 20 61 72 67 63 3b 0a 63 68 61 72  ).int argc;.char
a9c0: 20 2a 2a 61 72 67 76 3b 0a 7b 0a 20 20 73 74 61   **argv;.{.  sta
a9d0: 74 69 63 20 69 6e 74 20 76 65 72 73 69 6f 6e 20  tic int version 
a9e0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
a9f0: 74 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20  t rpflag = 0;.  
aa00: 73 74 61 74 69 63 20 69 6e 74 20 62 61 73 69 73  static int basis
aa10: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
aa20: 69 63 20 69 6e 74 20 63 6f 6d 70 72 65 73 73 20  ic int compress 
aa30: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
aa40: 74 20 71 75 69 65 74 20 3d 20 30 3b 0a 20 20 73  t quiet = 0;.  s
aa50: 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 69 73  tatic int statis
aa60: 74 69 63 73 20 3d 20 30 3b 0a 20 20 73 74 61 74  tics = 0;.  stat
aa70: 69 63 20 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20  ic int mhflag = 
aa80: 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  0;.  static stru
aa90: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74  ct s_options opt
aaa0: 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  ions[] = {.    {
aab0: 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28  OPT_FLAG, "b", (
aac0: 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67  char*)&basisflag
aad0: 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68  , "Print only th
aae0: 65 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72  e basis in repor
aaf0: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
ab00: 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a  LAG, "c", (char*
ab10: 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e  )&compress, "Don
ab20: 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20  't compress the 
ab30: 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c  action table."},
ab40: 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20  .    {OPT_FSTR, 
ab50: 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64  "D", (char*)hand
ab60: 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65  le_D_option, "De
ab70: 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d  fine an %ifdef m
ab80: 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  acro."},.    {OP
ab90: 54 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28 63 68  T_FLAG, "g", (ch
aba0: 61 72 2a 29 26 72 70 66 6c 61 67 2c 20 22 50 72  ar*)&rpflag, "Pr
abb0: 69 6e 74 20 67 72 61 6d 6d 61 72 20 77 69 74 68  int grammar with
abc0: 6f 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a  out actions."},.
abd0: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
abe0: 6d 22 2c 20 28 63 68 61 72 2a 29 26 6d 68 66 6c  m", (char*)&mhfl
abf0: 61 67 2c 20 22 4f 75 74 70 75 74 20 61 20 6d 61  ag, "Output a ma
ac00: 6b 65 68 65 61 64 65 72 73 20 63 6f 6d 70 61 74  keheaders compat
ac10: 69 62 6c 65 20 66 69 6c 65 22 7d 2c 0a 20 20 20  ible file"},.   
ac20: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c   {OPT_FLAG, "q",
ac30: 20 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20   (char*)&quiet, 
ac40: 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70  "(Quiet) Don't p
ac50: 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20  rint the report 
ac60: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
ac70: 54 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28 63 68  T_FLAG, "s", (ch
ac80: 61 72 2a 29 26 73 74 61 74 69 73 74 69 63 73 2c  ar*)&statistics,
ac90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acb0: 20 20 20 20 22 50 72 69 6e 74 20 70 61 72 73 65      "Print parse
acc0: 72 20 73 74 61 74 73 20 74 6f 20 73 74 61 6e 64  r stats to stand
acd0: 61 72 64 20 6f 75 74 70 75 74 2e 22 7d 2c 0a 20  ard output."},. 
ace0: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 78     {OPT_FLAG, "x
acf0: 22 2c 20 28 63 68 61 72 2a 29 26 76 65 72 73 69  ", (char*)&versi
ad00: 6f 6e 2c 20 22 50 72 69 6e 74 20 74 68 65 20 76  on, "Print the v
ad10: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 22 7d  ersion number."}
ad20: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
ad30: 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e  0,0,0}.  };.  in
ad40: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 6c 65  t i;.  struct le
ad50: 6d 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49  mon lem;..  OptI
ad60: 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73  nit(argv,options
ad70: 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66 28 20  ,stderr);.  if( 
ad80: 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  version ){.     
ad90: 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65  printf("Lemon ve
ada0: 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20  rsion 1.0\n");. 
adb0: 20 20 20 20 65 78 69 74 28 30 29 3b 20 0a 20 20      exit(0); .  
adc0: 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72 67 73  }.  if( OptNArgs
add0: 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66 70 72  ()!=1 ){.    fpr
ade0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 78 61  intf(stderr,"Exa
adf0: 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d  ctly one filenam
ae00: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65  e argument is re
ae10: 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20  quired.\n");.   
ae20: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
ae30: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30  lem.errorcnt = 0
ae40: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
ae50: 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20 2a  ze the machine *
ae60: 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e 69 74  /.  Strsafe_init
ae70: 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69  ();.  Symbol_ini
ae80: 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69  t();.  State_ini
ae90: 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30  t();.  lem.argv0
aea0: 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65   = argv[0];.  le
aeb0: 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74  m.filename = Opt
aec0: 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61  Arg(0);.  lem.ba
aed0: 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69 73 66  sisflag = basisf
aee0: 6c 61 67 3b 0a 20 20 6c 65 6d 2e 68 61 73 5f 66  lag;.  lem.has_f
aef0: 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 6c  allback = 0;.  l
af00: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 3d 20 30  em.nconflict = 0
af10: 3b 0a 20 20 6c 65 6d 2e 6e 61 6d 65 20 3d 20 6c  ;.  lem.name = l
af20: 65 6d 2e 69 6e 63 6c 75 64 65 20 3d 20 6c 65 6d  em.include = lem
af30: 2e 61 72 67 20 3d 20 6c 65 6d 2e 74 6f 6b 65 6e  .arg = lem.token
af40: 74 79 70 65 20 3d 20 6c 65 6d 2e 73 74 61 72 74  type = lem.start
af50: 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 76 61 72 74   = 0;.  lem.vart
af60: 79 70 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 73  ype = 0;.  lem.s
af70: 74 61 63 6b 73 69 7a 65 20 3d 20 30 3b 0a 20 20  tacksize = 0;.  
af80: 6c 65 6d 2e 65 72 72 6f 72 20 3d 20 6c 65 6d 2e  lem.error = lem.
af90: 6f 76 65 72 66 6c 6f 77 20 3d 20 6c 65 6d 2e 66  overflow = lem.f
afa0: 61 69 6c 75 72 65 20 3d 20 6c 65 6d 2e 61 63 63  ailure = lem.acc
afb0: 65 70 74 20 3d 20 6c 65 6d 2e 74 6f 6b 65 6e 64  ept = lem.tokend
afc0: 65 73 74 20 3d 0a 20 20 20 20 20 6c 65 6d 2e 74  est =.     lem.t
afd0: 6f 6b 65 6e 70 72 65 66 69 78 20 3d 20 6c 65 6d  okenprefix = lem
afe0: 2e 6f 75 74 6e 61 6d 65 20 3d 20 6c 65 6d 2e 65  .outname = lem.e
aff0: 78 74 72 61 63 6f 64 65 20 3d 20 30 3b 0a 20 20  xtracode = 0;.  
b000: 6c 65 6d 2e 76 61 72 64 65 73 74 20 3d 20 30 3b  lem.vardest = 0;
b010: 0a 20 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65  .  lem.tablesize
b020: 20 3d 20 30 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e   = 0;.  Symbol_n
b030: 65 77 28 22 24 22 29 3b 0a 20 20 6c 65 6d 2e 65  ew("$");.  lem.e
b040: 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e  rrsym = Symbol_n
b050: 65 77 28 22 65 72 72 6f 72 22 29 3b 0a 0a 20 20  ew("error");..  
b060: 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70  /* Parse the inp
b070: 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72  ut file */.  Par
b080: 73 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20  se(&lem);.  if( 
b090: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65  lem.errorcnt ) e
b0a0: 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74  xit(lem.errorcnt
b0b0: 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 72 75 6c  );.  if( lem.rul
b0c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
b0d0: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74  ntf(stderr,"Empt
b0e0: 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a  y grammar.\n");.
b0f0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
b100: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64  ..  /* Count and
b110: 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62 6f   index the symbo
b120: 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  ls of the gramma
b130: 72 20 2a 2f 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62  r */.  lem.nsymb
b140: 6f 6c 20 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e  ol = Symbol_coun
b150: 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65  t();.  Symbol_ne
b160: 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a  w("{default}");.
b170: 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20    lem.symbols = 
b180: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29  Symbol_arrayof()
b190: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
b1a0: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  lem.nsymbol; i++
b1b0: 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d  ) lem.symbols[i]
b1c0: 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71  ->index = i;.  q
b1d0: 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  sort(lem.symbols
b1e0: 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73  ,lem.nsymbol+1,s
b1f0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
b200: 62 6f 6c 2a 29 2c 0a 20 20 20 20 20 20 20 20 28  bol*),.        (
b210: 69 6e 74 28 2a 29 28 29 29 53 79 6d 62 6f 6c 63  int(*)())Symbolc
b220: 6d 70 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  mpp);.  for(i=0;
b230: 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b   i<=lem.nsymbol;
b240: 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c   i++) lem.symbol
b250: 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b  s[i]->index = i;
b260: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 73 75 70  .  for(i=1; isup
b270: 70 65 72 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  per(lem.symbols[
b280: 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b  i]->name[0]); i+
b290: 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69  +);.  lem.ntermi
b2a0: 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47  nal = i;..  /* G
b2b0: 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69 6e  enerate a reprin
b2c0: 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  t of the grammar
b2d0: 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 6f  , if requested o
b2e0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
b2f0: 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c  ne */.  if( rpfl
b300: 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e  ag ){.    Reprin
b310: 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  t(&lem);.  }else
b320: 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
b330: 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72  ize the size for
b340: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20   all follow and 
b350: 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20  first sets */.  
b360: 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74    SetSize(lem.nt
b370: 65 72 6d 69 6e 61 6c 29 3b 0a 0a 20 20 20 20 2f  erminal);..    /
b380: 2a 20 46 69 6e 64 20 74 68 65 20 70 72 65 63 65  * Find the prece
b390: 64 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20  dence for every 
b3a0: 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20  production rule 
b3b0: 28 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a  (that has one) *
b3c0: 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72  /.    FindRulePr
b3d0: 65 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b  ecedences(&lem);
b3e0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
b3f0: 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74   the lambda-nont
b400: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65  erminals and the
b410: 20 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20   first-sets for 
b420: 65 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e  every.    ** non
b430: 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20  terminal */.    
b440: 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c  FindFirstSets(&l
b450: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  em);..    /* Com
b460: 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73  pute all LR(0) s
b470: 74 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63  tates.  Also rec
b480: 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70  ord follow-set p
b490: 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a  ropagation.    *
b4a0: 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20  * links so that 
b4b0: 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63  the follow-set c
b4c0: 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c  an be computed l
b4d0: 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e  ater */.    lem.
b4e0: 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  nstate = 0;.    
b4f0: 46 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29  FindStates(&lem)
b500: 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64  ;.    lem.sorted
b510: 20 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66   = State_arrayof
b520: 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20  ();..    /* Tie 
b530: 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e  up loose ends on
b540: 20 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e   the propagation
b550: 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69   links */.    Fi
b560: 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a  ndLinks(&lem);..
b570: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
b580: 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66  he follow set of
b590: 20 65 76 65 72 79 20 72 65 64 75 63 69 62 6c 65   every reducible
b5a0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
b5b0: 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77  /.    FindFollow
b5c0: 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  Sets(&lem);..   
b5d0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
b5e0: 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f  action tables */
b5f0: 0a 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73  .    FindActions
b600: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
b610: 43 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74  Compress the act
b620: 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ion tables */.  
b630: 20 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d    if( compress==
b640: 30 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c  0 ) CompressTabl
b650: 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  es(&lem);..    /
b660: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70  * Generate a rep
b670: 6f 72 74 20 6f 66 20 74 68 65 20 70 61 72 73 65  ort of the parse
b680: 72 20 67 65 6e 65 72 61 74 65 64 2e 20 20 28 74  r generated.  (t
b690: 68 65 20 22 79 2e 6f 75 74 70 75 74 22 20 66 69  he "y.output" fi
b6a0: 6c 65 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le) */.    if( !
b6b0: 71 75 69 65 74 20 29 20 52 65 70 6f 72 74 4f 75  quiet ) ReportOu
b6c0: 74 70 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  tput(&lem);..   
b6d0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
b6e0: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72   source code for
b6f0: 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20   the parser */. 
b700: 20 20 20 52 65 70 6f 72 74 54 61 62 6c 65 28 26     ReportTable(&
b710: 6c 65 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20  lem, mhflag);.. 
b720: 20 20 20 2f 2a 20 50 72 6f 64 75 63 65 20 61 20     /* Produce a 
b730: 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20  header file for 
b740: 75 73 65 20 62 79 20 74 68 65 20 73 63 61 6e 6e  use by the scann
b750: 65 72 2e 20 20 28 54 68 69 73 20 73 74 65 70 20  er.  (This step 
b760: 69 73 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65  is.    ** omitte
b770: 64 20 69 66 20 74 68 65 20 22 2d 6d 22 20 6f 70  d if the "-m" op
b780: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 65 63  tion is used bec
b790: 61 75 73 65 20 6d 61 6b 65 68 65 61 64 65 72 73  ause makeheaders
b7a0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e   will.    ** gen
b7b0: 65 72 61 74 65 20 74 68 65 20 66 69 6c 65 20 66  erate the file f
b7c0: 6f 72 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69  or us.) */.    i
b7d0: 66 28 20 21 6d 68 66 6c 61 67 20 29 20 52 65 70  f( !mhflag ) Rep
b7e0: 6f 72 74 48 65 61 64 65 72 28 26 6c 65 6d 29 3b  ortHeader(&lem);
b7f0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 69  .  }.  if( stati
b800: 73 74 69 63 73 20 29 7b 0a 20 20 20 20 70 72 69  stics ){.    pri
b810: 6e 74 66 28 22 50 61 72 73 65 72 20 73 74 61 74  ntf("Parser stat
b820: 69 73 74 69 63 73 3a 20 25 64 20 74 65 72 6d 69  istics: %d termi
b830: 6e 61 6c 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d  nals, %d nonterm
b840: 69 6e 61 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c  inals, %d rules\
b850: 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74  n",.      lem.nt
b860: 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79  erminal, lem.nsy
b870: 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d  mbol - lem.nterm
b880: 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29  inal, lem.nrule)
b890: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20  ;.    printf("  
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 25 64 20 73 74 61 74 65 73 2c 20 25 64 20 70   %d states, %d p
b8c0: 61 72 73 65 72 20 74 61 62 6c 65 20 65 6e 74 72  arser table entr
b8d0: 69 65 73 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74  ies, %d conflict
b8e0: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e  s\n",.      lem.
b8f0: 6e 73 74 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c  nstate, lem.tabl
b900: 65 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66  esize, lem.nconf
b910: 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lict);.  }.  if(
b920: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 29   lem.nconflict )
b930: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
b940: 64 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67  derr,"%d parsing
b950: 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c   conflicts.\n",l
b960: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20  em.nconflict);. 
b970: 20 7d 0a 20 20 65 78 69 74 28 6c 65 6d 2e 65 72   }.  exit(lem.er
b980: 72 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f  rorcnt + lem.nco
b990: 6e 66 6c 69 63 74 29 3b 0a 20 20 72 65 74 75 72  nflict);.  retur
b9a0: 6e 20 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20  n (lem.errorcnt 
b9b0: 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  + lem.nconflict)
b9c0: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
b9d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
b9e0: 68 65 20 66 69 6c 65 20 22 6d 73 6f 72 74 2e 63  he file "msort.c
b9f0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
ba00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ba10: 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e 65 72  */./*.** A gener
ba20: 69 63 20 6d 65 72 67 65 2d 73 6f 72 74 20 70 72  ic merge-sort pr
ba30: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53 41  ogram..**.** USA
ba40: 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70 74 72 22  GE:.** Let "ptr"
ba50: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
ba60: 20 73 6f 6d 65 20 73 74 72 75 63 74 75 72 65 20   some structure 
ba70: 77 68 69 63 68 20 69 73 20 61 74 20 74 68 65 20  which is at the 
ba80: 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20 6e 75 6c  head of.** a nul
ba90: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 73  l-terminated lis
baa0: 74 2e 20 20 54 68 65 6e 20 74 6f 20 73 6f 72 74  t.  Then to sort
bab0: 20 74 68 65 20 6c 69 73 74 20 63 61 6c 6c 3a 0a   the list call:.
bac0: 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72 20 3d 20  **.**     ptr = 
bad0: 6d 73 6f 72 74 28 70 74 72 2c 26 28 70 74 72 2d  msort(ptr,&(ptr-
bae0: 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63 29 3b 0a  >next),cmpfnc);.
baf0: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 6f  **.** In the abo
bb00: 76 65 2c 20 22 63 6d 70 66 6e 63 22 20 69 73 20  ve, "cmpfnc" is 
bb10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
bb20: 75 6e 63 74 69 6f 6e 20 77 68 69 63 68 20 63 6f  unction which co
bb30: 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f 20 69 6e  mpares.** two in
bb40: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73  stances of the s
bb50: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
bb60: 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  urns an integer,
bb70: 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72 63 6d 70   as in.** strcmp
bb80: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  .  The second ar
bb90: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
bba0: 74 65 72 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  ter to the point
bbb0: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 65 63  er to the.** sec
bbc0: 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ond element of t
bbd0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20  he linked list. 
bbe0: 20 54 68 69 73 20 61 64 64 72 65 73 73 20 69 73   This address is
bbf0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
bc00: 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 74  .** the offset t
bc10: 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65  o the "next" fie
bc20: 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  ld within the st
bc30: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6f 66  ructure.  The of
bc40: 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 22  fset to.** the "
bc50: 6e 65 78 74 22 20 66 69 65 6c 64 20 6d 75 73 74  next" field must
bc60: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f 72   be constant for
bc70: 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
bc80: 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a  in the list..**.
bc90: 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  ** The function 
bca0: 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 70 6f  returns a new po
bcb0: 69 6e 74 65 72 20 77 68 69 63 68 20 69 73 20 74  inter which is t
bcc0: 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 6c  he head of the l
bcd0: 69 73 74 0a 2a 2a 20 61 66 74 65 72 20 73 6f 72  ist.** after sor
bce0: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f  ting..**.** ALGO
bcf0: 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67 65 2d  RITHM:.** Merge-
bd00: 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  sort..*/../*.** 
bd10: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
bd20: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 72   to the next str
bd30: 75 63 74 75 72 65 20 69 6e 20 74 68 65 20 6c 69  ucture in the li
bd40: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 23 64  nked list..*/.#d
bd50: 65 66 69 6e 65 20 4e 45 58 54 28 41 29 20 28 2a  efine NEXT(A) (*
bd60: 28 63 68 61 72 2a 2a 29 28 28 28 75 6e 73 69 67  (char**)(((unsig
bd70: 6e 65 64 20 6c 6f 6e 67 29 41 29 2b 6f 66 66 73  ned long)A)+offs
bd80: 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  et))../*.** Inpu
bd90: 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20  ts:.**   a:     
bda0: 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c    A sorted, null
bdb0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b  -terminated link
bdc0: 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62  ed list.  (May b
bdd0: 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a  e null)..**   b:
bde0: 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c         A sorted,
bdf0: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
be00: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28   linked list.  (
be10: 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a  May be null)..**
be20: 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f     cmp:     A po
be30: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  inter to the com
be40: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
be50: 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20  ..**   offset:  
be60: 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74  Offset in the st
be70: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22  ructure to the "
be80: 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a  next" field..**.
be90: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
bea0: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
beb0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
bec0: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
bed0: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
bee0: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74  ents.**   of bot
bef0: 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a  h a and b..**.**
bf00: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
bf10: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
bf20: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
bf30: 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ents in the list
bf40: 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a  s a and b are.**
bf50: 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73     changed..*/.s
bf60: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67  tatic char *merg
bf70: 65 28 61 2c 62 2c 63 6d 70 2c 6f 66 66 73 65 74  e(a,b,cmp,offset
bf80: 29 0a 63 68 61 72 20 2a 61 3b 0a 63 68 61 72 20  ).char *a;.char 
bf90: 2a 62 3b 0a 69 6e 74 20 28 2a 63 6d 70 29 28 29  *b;.int (*cmp)()
bfa0: 3b 0a 69 6e 74 20 6f 66 66 73 65 74 3b 0a 7b 0a  ;.int offset;.{.
bfb0: 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65    char *ptr, *he
bfc0: 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20  ad;..  if( a==0 
bfd0: 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b  ){.    head = b;
bfe0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d  .  }else if( b==
bff0: 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20  0 ){.    head = 
c000: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
c010: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
c020: 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20 3d  0 ){.      ptr =
c030: 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e 45   a;.      a = NE
c040: 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65  XT(a);.    }else
c050: 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b  {.      ptr = b;
c060: 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28  .      b = NEXT(
c070: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 65  b);.    }.    he
c080: 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77 68  ad = ptr;.    wh
c090: 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a 20  ile( a && b ){. 
c0a0: 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28       if( (*cmp)(
c0b0: 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  a,b)<0 ){.      
c0c0: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b    NEXT(ptr) = a;
c0d0: 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 61  .        ptr = a
c0e0: 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e 45  ;.        a = NE
c0f0: 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  XT(a);.      }el
c100: 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54  se{.        NEXT
c110: 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20 20  (ptr) = b;.     
c120: 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20     ptr = b;.    
c130: 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b      b = NEXT(b);
c140: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c150: 20 20 20 69 66 28 20 61 20 29 20 4e 45 58 54 28     if( a ) NEXT(
c160: 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c  ptr) = a;.    el
c170: 73 65 20 20 20 20 4e 45 58 54 28 70 74 72 29 20  se    NEXT(ptr) 
c180: 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = b;.  }.  retur
c190: 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n head;.}../*.**
c1a0: 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69   Inputs:.**   li
c1b0: 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72  st:      Pointer
c1c0: 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e   to a singly-lin
c1d0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72 75  ked list of stru
c1e0: 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78  ctures..**   nex
c1f0: 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20  t:      Pointer 
c200: 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  to pointer to th
c210: 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
c220: 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   of the list..**
c230: 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41 20     cmp:       A 
c240: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
c250: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ion..**.** Retur
c260: 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20  n Value:.**   A 
c270: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
c280: 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20  ead of a sorted 
c290: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
c2a0: 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20  the elements.** 
c2b0: 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c    orginally in l
c2c0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20  ist..**.** Side 
c2d0: 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68  effects:.**   Th
c2e0: 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72  e "next" pointer
c2f0: 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69  s for elements i
c300: 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e 67  n list are chang
c310: 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c  ed..*/.#define L
c320: 49 53 54 53 49 5a 45 20 33 30 0a 63 68 61 72 20  ISTSIZE 30.char 
c330: 2a 6d 73 6f 72 74 28 6c 69 73 74 2c 6e 65 78 74  *msort(list,next
c340: 2c 63 6d 70 29 0a 63 68 61 72 20 2a 6c 69 73 74  ,cmp).char *list
c350: 3b 0a 63 68 61 72 20 2a 2a 6e 65 78 74 3b 0a 69  ;.char **next;.i
c360: 6e 74 20 28 2a 63 6d 70 29 28 29 3b 0a 7b 0a 20  nt (*cmp)();.{. 
c370: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f   unsigned long o
c380: 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20 2a 65  ffset;.  char *e
c390: 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74 5b 4c  p;.  char *set[L
c3a0: 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  ISTSIZE];.  int 
c3b0: 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 75  i;.  offset = (u
c3c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6e 65 78  nsigned long)nex
c3d0: 74 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t - (unsigned lo
c3e0: 6e 67 29 6c 69 73 74 3b 0a 20 20 66 6f 72 28 69  ng)list;.  for(i
c3f0: 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20  =0; i<LISTSIZE; 
c400: 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d 20 30 3b  i++) set[i] = 0;
c410: 0a 20 20 77 68 69 6c 65 28 20 6c 69 73 74 20 29  .  while( list )
c420: 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69 73 74 3b  {.    ep = list;
c430: 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e 45 58 54  .    list = NEXT
c440: 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e 45 58 54  (list);.    NEXT
c450: 28 65 70 29 20 3d 20 30 3b 0a 20 20 20 20 66 6f  (ep) = 0;.    fo
c460: 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a  r(i=0; i<LISTSIZ
c470: 45 2d 31 20 26 26 20 73 65 74 5b 69 5d 21 3d 30  E-1 && set[i]!=0
c480: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 65 70  ; i++){.      ep
c490: 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65 74 5b   = merge(ep,set[
c4a0: 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a  i],cmp,offset);.
c4b0: 20 20 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 30        set[i] = 0
c4c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 5b  ;.    }.    set[
c4d0: 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a 20 20 65  i] = ep;.  }.  e
c4e0: 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  p = 0;.  for(i=0
c4f0: 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b  ; i<LISTSIZE; i+
c500: 2b 29 20 69 66 28 20 73 65 74 5b 69 5d 20 29 20  +) if( set[i] ) 
c510: 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65  ep = merge(ep,se
c520: 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29  t[i],cmp,offset)
c530: 3b 0a 20 20 72 65 74 75 72 6e 20 65 70 3b 0a 7d  ;.  return ep;.}
c540: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
c550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
c560: 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e  the file "option
c570: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
c580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
c590: 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61 72  static char **ar
c5a0: 67 76 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63  gv;.static struc
c5b0: 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 3b  t s_options *op;
c5c0: 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 65 72  .static FILE *er
c5d0: 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65 66 69 6e  rstream;..#defin
c5e0: 65 20 49 53 4f 50 54 28 58 29 20 28 28 58 29 5b  e ISOPT(X) ((X)[
c5f0: 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30 5d 3d  0]=='-'||(X)[0]=
c600: 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28 28 58 29  ='+'||strchr((X)
c610: 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a  ,'=')!=0)../*.**
c620: 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6d 6d 61   Print the comma
c630: 6e 64 20 6c 69 6e 65 20 77 69 74 68 20 61 20 63  nd line with a c
c640: 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  arrot pointing t
c650: 6f 20 74 68 65 20 6b 2d 74 68 20 63 68 61 72 61  o the k-th chara
c660: 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 6e  cter.** of the n
c670: 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74  -th field..*/.st
c680: 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c 69 6e  atic void errlin
c690: 65 28 6e 2c 6b 2c 65 72 72 29 0a 69 6e 74 20 6e  e(n,k,err).int n
c6a0: 3b 0a 69 6e 74 20 6b 3b 0a 46 49 4c 45 20 2a 65  ;.int k;.FILE *e
c6b0: 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e  rr;.{.  int spcn
c6c0: 74 2c 20 69 3b 0a 20 20 73 70 63 6e 74 20 3d 20  t, i;.  spcnt = 
c6d0: 30 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d  0;.  if( argv[0]
c6e0: 20 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22   ) fprintf(err,"
c6f0: 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20  %s",argv[0]);.  
c700: 73 70 63 6e 74 20 3d 20 73 74 72 6c 65 6e 28 61  spcnt = strlen(a
c710: 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20 66  rgv[0]) + 1;.  f
c720: 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 61  or(i=1; i<n && a
c730: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
c740: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20    fprintf(err," 
c750: 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20  %s",argv[i]);.  
c760: 20 20 73 70 63 6e 74 20 2b 3d 20 73 74 72 6c 65    spcnt += strle
c770: 6e 28 61 72 67 76 5b 69 5d 2b 31 29 3b 0a 20 20  n(argv[i]+1);.  
c780: 7d 0a 20 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a  }.  spcnt += k;.
c790: 20 20 66 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b    for(; argv[i];
c7a0: 20 69 2b 2b 29 20 66 70 72 69 6e 74 66 28 65 72   i++) fprintf(er
c7b0: 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29  r," %s",argv[i])
c7c0: 3b 0a 20 20 69 66 28 20 73 70 63 6e 74 3c 32 30  ;.  if( spcnt<20
c7d0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
c7e0: 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65  err,"\n%*s^-- he
c7f0: 72 65 5c 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b  re\n",spcnt,"");
c800: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
c810: 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73  rintf(err,"\n%*s
c820: 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e  here --^\n",spcn
c830: 74 2d 37 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  t-7,"");.  }.}..
c840: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
c850: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4e 2d   index of the N-
c860: 74 68 20 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72  th non-switch ar
c870: 67 75 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  gument.  Return 
c880: 2d 31 0a 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75  -1.** if N is ou
c890: 74 20 6f 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73  t of range..*/.s
c8a0: 74 61 74 69 63 20 69 6e 74 20 61 72 67 69 6e 64  tatic int argind
c8b0: 65 78 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20  ex(n).int n;.{. 
c8c0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 64 61   int i;.  int da
c8d0: 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 66  shdash = 0;.  if
c8e0: 28 20 61 72 67 76 21 3d 30 20 26 26 20 2a 61 72  ( argv!=0 && *ar
c8f0: 67 76 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  gv!=0 ){.    for
c900: 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69  (i=1; argv[i]; i
c910: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ++){.      if( d
c920: 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f 50  ashdash || !ISOP
c930: 54 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20  T(argv[i]) ){.  
c940: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
c950: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20   return i;.     
c960: 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a     n--;.      }.
c970: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
c980: 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d  (argv[i],"--")==
c990: 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20 31  0 ) dashdash = 1
c9a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
c9b0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74  turn -1;.}..stat
c9c0: 69 63 20 63 68 61 72 20 65 6d 73 67 5b 5d 20 3d  ic char emsg[] =
c9d0: 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73   "Command line s
c9e0: 79 6e 74 61 78 20 65 72 72 6f 72 3a 20 22 3b 0a  yntax error: ";.
c9f0: 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61  ./*.** Process a
ca00: 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64 20 6c 69   flag command li
ca10: 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ne argument..*/.
ca20: 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c  static int handl
ca30: 65 66 6c 61 67 73 28 69 2c 65 72 72 29 0a 69 6e  eflags(i,err).in
ca40: 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a  t i;.FILE *err;.
ca50: 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74  {.  int v;.  int
ca60: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69   errcnt = 0;.  i
ca70: 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  nt j;.  for(j=0;
ca80: 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b   op[j].label; j+
ca90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  +){.    if( strn
caa0: 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c  cmp(&argv[i][1],
cab0: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 73 74 72 6c  op[j].label,strl
cac0: 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 29  en(op[j].label))
cad0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
cae0: 0a 20 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b 30  .  v = argv[i][0
caf0: 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b 0a  ]=='-' ? 1 : 0;.
cb00: 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65    if( op[j].labe
cb10: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  l==0 ){.    if( 
cb20: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72  err ){.      fpr
cb30: 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65  intf(err,"%sunde
cb40: 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22  fined option.\n"
cb50: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
cb60: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
cb70: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
cb80: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ++;.  }else if( 
cb90: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
cba0: 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69  FLAG ){.    *((i
cbb0: 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  nt*)op[j].arg) =
cbc0: 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   v;.  }else if( 
cbd0: 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f  op[j].type==OPT_
cbe0: 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28  FFLAG ){.    (*(
cbf0: 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d  void(*)())(op[j]
cc00: 2e 61 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c  .arg))(v);.  }el
cc10: 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70  se if( op[j].typ
cc20: 65 3d 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20  e==OPT_FSTR ){. 
cc30: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29     (*(void(*)())
cc40: 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 26 61 72  (op[j].arg))(&ar
cc50: 67 76 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c  gv[i][2]);.  }el
cc60: 73 65 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20  se{.    if( err 
cc70: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
cc80: 28 65 72 72 2c 22 25 73 6d 69 73 73 69 6e 67 20  (err,"%smissing 
cc90: 61 72 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74  argument on swit
cca0: 63 68 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  ch.\n",emsg);.  
ccb0: 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c      errline(i,1,
ccc0: 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  err);.    }.    
ccd0: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  errcnt++;.  }.  
cce0: 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d  return errcnt;.}
ccf0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
cd00: 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73  a command line s
cd10: 77 69 74 63 68 20 77 68 69 63 68 20 68 61 73 20  witch which has 
cd20: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  an argument..*/.
cd30: 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c  static int handl
cd40: 65 73 77 69 74 63 68 28 69 2c 65 72 72 29 0a 69  eswitch(i,err).i
cd50: 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b  nt i;.FILE *err;
cd60: 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b  .{.  int lv = 0;
cd70: 0a 20 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30  .  double dv = 0
cd80: 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d  .0;.  char *sv =
cd90: 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72   0, *end;.  char
cda0: 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   *cp;.  int j;. 
cdb0: 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b   int errcnt = 0;
cdc0: 0a 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 61  .  cp = strchr(a
cdd0: 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 2a  rgv[i],'=');.  *
cde0: 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d  cp = 0;.  for(j=
cdf0: 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20  0; op[j].label; 
ce00: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  j++){.    if( st
ce10: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b  rcmp(argv[i],op[
ce20: 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62  j].label)==0 ) b
ce30: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20  reak;.  }.  *cp 
ce40: 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b  = '=';.  if( op[
ce50: 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20  j].label==0 ){. 
ce60: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
ce70: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
ce80: 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74  "%sundefined opt
ce90: 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ion.\n",emsg);. 
cea0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30       errline(i,0
ceb0: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
cec0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c   errcnt++;.  }el
ced0: 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20  se{.    cp++;.  
cee0: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e    switch( op[j].
cef0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
cf00: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
cf10: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
cf20: 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  G:.        if( e
cf30: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rr ){.          
cf40: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6f  fprintf(err,"%so
cf50: 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
cf60: 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  n argument.\n",e
cf70: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
cf80: 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29  errline(i,0,err)
cf90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cfa0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
cfb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cfc0: 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
cfd0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
cfe0: 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64 76  FDBL:.        dv
cff0: 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65 6e   = strtod(cp,&en
d000: 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  d);.        if( 
d010: 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  *end ){.        
d020: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
d030: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
d040: 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20  (err,"%sillegal 
d050: 63 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c 6f  character in flo
d060: 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75  ating-point argu
d070: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
d080: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c              errl
d090: 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64  ine(i,((unsigned
d0a0: 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69   long)end)-(unsi
d0b0: 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69  gned long)argv[i
d0c0: 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  ],err);.        
d0d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72    }.          er
d0e0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
d0f0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
d100: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d110: 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  INT:.      case 
d120: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
d130: 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63 70    lv = strtol(cp
d140: 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20 20  ,&end,0);.      
d150: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
d160: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
d170: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
d180: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c  printf(err,"%sil
d190: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
d1a0: 69 6e 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  in integer argum
d1b0: 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ent.\n",emsg);. 
d1c0: 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69             errli
d1d0: 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20  ne(i,((unsigned 
d1e0: 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67  long)end)-(unsig
d1f0: 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d  ned long)argv[i]
d200: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ,err);.         
d210: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72   }.          err
d220: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
d230: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d240: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
d250: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
d260: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
d270: 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20   sv = cp;.      
d280: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d290: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
d2a0: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
d2b0: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
d2c0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
d2d0: 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
d2e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d2f0: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a  T_DBL:.        *
d300: 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e  (double*)(op[j].
d310: 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20  arg) = dv;.     
d320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d330: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
d340: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
d350: 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  )())(op[j].arg))
d360: 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (dv);.        br
d370: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d380: 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20  OPT_INT:.       
d390: 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61   *(int*)(op[j].a
d3a0: 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20  rg) = lv;.      
d3b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
d3c0: 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
d3d0: 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
d3e0: 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28  ())(op[j].arg))(
d3f0: 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20 20  (int)lv);.      
d400: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
d410: 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20  ase OPT_STR:.   
d420: 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f       *(char**)(o
d430: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a  p[j].arg) = sv;.
d440: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d450: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
d460: 54 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  TR:.        (*(v
d470: 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e  oid(*)())(op[j].
d480: 61 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20  arg))(sv);.     
d490: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d4a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72    }.  return err
d4b0: 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49  cnt;.}..int OptI
d4c0: 6e 69 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68 61  nit(a,o,err).cha
d4d0: 72 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73 5f  r **a;.struct s_
d4e0: 6f 70 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c 45  options *o;.FILE
d4f0: 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 65   *err;.{.  int e
d500: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67  rrcnt = 0;.  arg
d510: 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b  v = a;.  op = o;
d520: 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65  .  errstream = e
d530: 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26  rr;.  if( argv &
d540: 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b  & *argv && op ){
d550: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
d560: 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d  for(i=1; argv[i]
d570: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d580: 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b  ( argv[i][0]=='+
d590: 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d  ' || argv[i][0]=
d5a0: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
d5b0: 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65  errcnt += handle
d5c0: 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20  flags(i,err);.  
d5d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
d5e0: 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27  rchr(argv[i],'='
d5f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  ) ){.        err
d600: 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69  cnt += handleswi
d610: 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  tch(i,err);.    
d620: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d630: 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a  if( errcnt>0 ){.
d640: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
d650: 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c  "Valid command l
d660: 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20  ine options for 
d670: 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a  \"%s\" are:\n",*
d680: 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74  a);.    OptPrint
d690: 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ();.    exit(1);
d6a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
d6b0: 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73  .}..int OptNArgs
d6c0: 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  (){.  int cnt = 
d6d0: 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73  0;.  int dashdas
d6e0: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
d6f0: 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26    if( argv!=0 &&
d700: 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a 20   argv[0]!=0 ){. 
d710: 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76     for(i=1; argv
d720: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
d730: 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c   if( dashdash ||
d740: 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29   !ISOPT(argv[i])
d750: 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20   ) cnt++;.      
d760: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
d770: 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61  i],"--")==0 ) da
d780: 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20  shdash = 1;.    
d790: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  }.  }.  return c
d7a0: 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74  nt;.}..char *Opt
d7b0: 41 72 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a  Arg(n).int n;.{.
d7c0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61    int i;.  i = a
d7d0: 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65  rgindex(n);.  re
d7e0: 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76  turn i>=0 ? argv
d7f0: 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64  [i] : 0;.}..void
d800: 20 4f 70 74 45 72 72 28 6e 29 0a 69 6e 74 20 6e   OptErr(n).int n
d810: 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ;.{.  int i;.  i
d820: 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a   = argindex(n);.
d830: 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72    if( i>=0 ) err
d840: 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65  line(i,0,errstre
d850: 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74  am);.}..void Opt
d860: 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69  Print(){.  int i
d870: 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e  ;.  int max, len
d880: 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66  ;.  max = 0;.  f
d890: 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61  or(i=0; op[i].la
d8a0: 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c  bel; i++){.    l
d8b0: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 70 5b 69  en = strlen(op[i
d8c0: 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20  ].label) + 1;.  
d8d0: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e    switch( op[i].
d8e0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
d8f0: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
d900: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
d910: 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  G:.        break
d920: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
d930: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
d940: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
d950: 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20     len += 9;    
d960: 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
d970: 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20  "<integer>" */. 
d980: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d990: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
d9a0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d9b0: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c  _FDBL:.        l
d9c0: 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f  en += 6;       /
d9d0: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65  * length of "<re
d9e0: 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  al>" */.        
d9f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
da00: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
da10: 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
da20: 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38          len += 8
da30: 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74  ;       /* lengt
da40: 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20  h of "<string>" 
da50: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
da60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
da70: 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20  len>max ) max = 
da80: 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  len;.  }.  for(i
da90: 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b  =0; op[i].label;
daa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63   i++){.    switc
dab0: 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b  h( op[i].type ){
dac0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
dad0: 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65  FLAG:.      case
dae0: 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20   OPT_FFLAG:.    
daf0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
db00: 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20  tream,"  -%-*s  
db10: 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e  %s\n",max,op[i].
db20: 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73  label,op[i].mess
db30: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
db40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
db50: 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63  OPT_INT:.      c
db60: 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
db70: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
db80: 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69  rstream,"  %s=<i
db90: 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e  nteger>%*s  %s\n
dba0: 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20  ",op[i].label,. 
dbb0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d           (int)(m
dbc0: 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  ax-strlen(op[i].
dbd0: 6c 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b  label)-9),"",op[
dbe0: 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
dbf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc00: 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a    case OPT_DBL:.
dc10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
dc20: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 66 70 72  DBL:.        fpr
dc30: 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22  intf(errstream,"
dc40: 20 20 25 73 3d 3c 72 65 61 6c 3e 25 2a 73 20 20    %s=<real>%*s  
dc50: 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65  %s\n",op[i].labe
dc60: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  l,.          (in
dc70: 74 29 28 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70  t)(max-strlen(op
dc80: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22  [i].label)-6),""
dc90: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
dca0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dcb0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
dcc0: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
dcd0: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
dce0: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
dcf0: 61 6d 2c 22 20 20 25 73 3d 3c 73 74 72 69 6e 67  am,"  %s=<string
dd00: 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
dd10: 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
dd20: 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 73 74 72     (int)(max-str
dd30: 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29  len(op[i].label)
dd40: 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73  -8),"",op[i].mes
dd50: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
dd60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
dd70: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
dd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
dd90: 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e  the file "parse.
dda0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
ddb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
ddc0: 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c  ./*.** Input fil
ddd0: 65 20 70 61 72 73 65 72 20 66 6f 72 20 74 68 65  e parser for the
dde0: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
ddf0: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
de00: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
de10: 20 70 61 72 73 65 72 20 2a 2f 0a 73 74 72 75 63   parser */.struc
de20: 74 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61  t pstate {.  cha
de30: 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20  r *filename;    
de40: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
de50: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
de60: 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e    int tokenlinen
de70: 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e  o;      /* Linen
de80: 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63  umber at which c
de90: 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61  urrent token sta
dea0: 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  rts */.  int err
deb0: 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  orcnt;         /
dec0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
ded0: 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63  rs so far */.  c
dee0: 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b  har *tokenstart;
def0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
df00: 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f  current token */
df10: 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
df20: 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62  *gp;     /* Glob
df30: 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20  al state vector 
df40: 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74  */.  enum e_stat
df50: 65 20 7b 0a 20 20 20 20 49 4e 49 54 49 41 4c 49  e {.    INITIALI
df60: 5a 45 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f  ZE,.    WAITING_
df70: 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
df80: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
df90: 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a  R_DECL_KEYWORD,.
dfa0: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
dfb0: 44 45 43 4c 5f 41 52 47 2c 0a 20 20 20 20 57 41  DECL_ARG,.    WA
dfc0: 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
dfd0: 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20  ENCE_SYMBOL,.   
dfe0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52   WAITING_FOR_ARR
dff0: 4f 57 2c 0a 20 20 20 20 49 4e 5f 52 48 53 2c 0a  OW,.    IN_RHS,.
e000: 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c      LHS_ALIAS_1,
e010: 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32  .    LHS_ALIAS_2
e020: 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f  ,.    LHS_ALIAS_
e030: 33 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53  3,.    RHS_ALIAS
e040: 5f 31 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41  _1,.    RHS_ALIA
e050: 53 5f 32 2c 0a 20 20 20 20 50 52 45 43 45 44 45  S_2,.    PRECEDE
e060: 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 20 20  NCE_MARK_1,.    
e070: 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
e080: 32 2c 0a 20 20 20 20 52 45 53 59 4e 43 5f 41 46  2,.    RESYNC_AF
e090: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a  TER_RULE_ERROR,.
e0a0: 20 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52      RESYNC_AFTER
e0b0: 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 20  _DECL_ERROR,.   
e0c0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53   WAITING_FOR_DES
e0d0: 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a  TRUCTOR_SYMBOL,.
e0e0: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
e0f0: 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c  DATATYPE_SYMBOL,
e100: 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  .    WAITING_FOR
e110: 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 0a 20 20 7d  _FALLBACK_ID.  }
e120: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
e130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e140: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
e150: 72 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  rser */.  struct
e160: 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63   symbol *fallbac
e170: 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c  k;   /* The fall
e180: 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  back token */.  
e190: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c  struct symbol *l
e1a0: 68 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65  hs;        /* Le
e1b0: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
e1c0: 63 75 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a  current rule */.
e1d0: 20 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73    char *lhsalias
e1e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e1f0: 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  Alias for the LH
e200: 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b  S */.  int nrhs;
e210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e220: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
e230: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 73  ight-hand side s
e240: 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20  ymbols seen */. 
e250: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
e260: 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a  rhs[MAXRHS];  /*
e270: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a   RHS symbols */.
e280: 20 20 63 68 61 72 20 2a 61 6c 69 61 73 5b 4d 41    char *alias[MA
e290: 58 52 48 53 5d 3b 20 20 20 20 20 20 20 2f 2a 20  XRHS];       /* 
e2a0: 41 6c 69 61 73 65 73 20 66 6f 72 20 65 61 63 68  Aliases for each
e2b0: 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20   RHS symbol (or 
e2c0: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63  NULL) */.  struc
e2d0: 74 20 72 75 6c 65 20 2a 70 72 65 76 72 75 6c 65  t rule *prevrule
e2e0: 3b 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  ;     /* Previou
e2f0: 73 20 72 75 6c 65 20 70 61 72 73 65 64 20 2a 2f  s rule parsed */
e300: 0a 20 20 63 68 61 72 20 2a 64 65 63 6c 6b 65 79  .  char *declkey
e310: 77 6f 72 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  word;         /*
e320: 20 4b 65 79 77 6f 72 64 20 6f 66 20 61 20 64 65   Keyword of a de
e330: 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63  claration */.  c
e340: 68 61 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f  har **declargslo
e350: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t;        /* Whe
e360: 72 65 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  re the declarati
e370: 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  on argument shou
e380: 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a 20 20 69  ld be put */.  i
e390: 6e 74 20 2a 64 65 63 6c 6c 6e 73 6c 6f 74 3b 20  nt *decllnslot; 
e3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65            /* Whe
e3b0: 72 65 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  re the declarati
e3c0: 6f 6e 20 6c 69 6e 65 6e 75 6d 62 65 72 20 69 73  on linenumber is
e3d0: 20 70 75 74 20 2a 2f 0a 20 20 65 6e 75 6d 20 65   put */.  enum e
e3e0: 5f 61 73 73 6f 63 20 64 65 63 6c 61 73 73 6f 63  _assoc declassoc
e3f0: 3b 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74  ;    /* Assign t
e400: 68 69 73 20 61 73 73 6f 63 69 61 74 69 6f 6e 20  his association 
e410: 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e 74  to decl argument
e420: 73 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 63  s */.  int precc
e430: 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20  ounter;         
e440: 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73    /* Assign this
e450: 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20 64   precedence to d
e460: 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ecl arguments */
e470: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
e480: 66 69 72 73 74 72 75 6c 65 3b 20 20 20 20 2f 2a  firstrule;    /*
e490: 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73   Pointer to firs
e4a0: 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72  t rule in the gr
e4b0: 61 6d 6d 61 72 20 2a 2f 0a 20 20 73 74 72 75 63  ammar */.  struc
e4c0: 74 20 72 75 6c 65 20 2a 6c 61 73 74 72 75 6c 65  t rule *lastrule
e4d0: 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ;     /* Pointer
e4e0: 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63   to the most rec
e4f0: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 72 75 6c  ently parsed rul
e500: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73  e */.};../* Pars
e510: 65 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e  e a single token
e520: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
e530: 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 70 73  parseonetoken(ps
e540: 70 29 0a 73 74 72 75 63 74 20 70 73 74 61 74 65  p).struct pstate
e550: 20 2a 70 73 70 3b 0a 7b 0a 20 20 63 68 61 72 20   *psp;.{.  char 
e560: 2a 78 3b 0a 20 20 78 20 3d 20 53 74 72 73 61 66  *x;.  x = Strsaf
e570: 65 28 70 73 70 2d 3e 74 6f 6b 65 6e 73 74 61 72  e(psp->tokenstar
e580: 74 29 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 20  t);     /* Save 
e590: 74 68 65 20 74 6f 6b 65 6e 20 70 65 72 6d 61 6e  the token perman
e5a0: 65 6e 74 6c 79 20 2a 2f 0a 23 69 66 20 30 0a 20  ently */.#if 0. 
e5b0: 20 70 72 69 6e 74 66 28 22 25 73 3a 25 64 3a 20   printf("%s:%d: 
e5c0: 54 6f 6b 65 6e 3d 5b 25 73 5d 20 73 74 61 74 65  Token=[%s] state
e5d0: 3d 25 64 5c 6e 22 2c 70 73 70 2d 3e 66 69 6c 65  =%d\n",psp->file
e5e0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
e5f0: 69 6e 65 6e 6f 2c 0a 20 20 20 20 78 2c 70 73 70  ineno,.    x,psp
e600: 2d 3e 73 74 61 74 65 29 3b 0a 23 65 6e 64 69 66  ->state);.#endif
e610: 0a 20 20 73 77 69 74 63 68 28 20 70 73 70 2d 3e  .  switch( psp->
e620: 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  state ){.    cas
e630: 65 20 49 4e 49 54 49 41 4c 49 5a 45 3a 0a 20 20  e INITIALIZE:.  
e640: 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
e650: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70  e = 0;.      psp
e660: 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 20 3d 20  ->preccounter = 
e670: 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 66 69  0;.      psp->fi
e680: 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c  rstrule = psp->l
e690: 61 73 74 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  astrule = 0;.   
e6a0: 20 20 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c     psp->gp->nrul
e6b0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  e = 0;.      /* 
e6c0: 46 61 6c 6c 20 74 68 72 75 20 74 6f 20 6e 65 78  Fall thru to nex
e6d0: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 63 61  t case */.    ca
e6e0: 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  se WAITING_FOR_D
e6f0: 45 43 4c 5f 4f 52 5f 52 55 4c 45 3a 0a 20 20 20  ECL_OR_RULE:.   
e700: 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27     if( x[0]=='%'
e710: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
e720: 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
e730: 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
e740: 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  D;.      }else i
e750: 66 28 20 69 73 6c 6f 77 65 72 28 78 5b 30 5d 29  f( islower(x[0])
e760: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
e770: 3e 6c 68 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  >lhs = Symbol_ne
e780: 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  w(x);.        ps
e790: 70 2d 3e 6e 72 68 73 20 3d 20 30 3b 0a 20 20 20  p->nrhs = 0;.   
e7a0: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69       psp->lhsali
e7b0: 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  as = 0;.        
e7c0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
e7d0: 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a  TING_FOR_ARROW;.
e7e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e7f0: 78 5b 30 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20  x[0]=='{' ){.   
e800: 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 70 72       if( psp->pr
e810: 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  evrule==0 ){.   
e820: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
e830: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
e840: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
e850: 22 54 68 65 72 65 20 69 73 20 6e 6f 74 20 70 72  "There is not pr
e860: 69 6f 72 20 72 75 6c 65 20 6f 70 6f 6e 20 77 68  ior rule opon wh
e870: 69 63 68 20 74 6f 20 61 74 74 61 63 68 20 74 68  ich to attach th
e880: 65 20 63 6f 64 65 20 5c 0a 66 72 61 67 6d 65 6e  e code \.fragmen
e890: 74 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 6f  t which begins o
e8a0: 6e 20 74 68 69 73 20 6c 69 6e 65 2e 22 29 3b 0a  n this line.");.
e8b0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
e8c0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73  rrorcnt++;..}els
e8d0: 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72  e if( psp->prevr
e8e0: 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a  ule->code!=0 ){.
e8f0: 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
e900: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
e910: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
e920: 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65 6e  o,."Code fragmen
e930: 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74  t beginning on t
e940: 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
e950: 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66  the first \.to f
e960: 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f  ollow the previo
e970: 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20  us rule.");.    
e980: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
e990: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
e9a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e9b0: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c  psp->prevrule->l
e9c0: 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e  ine = psp->token
e9d0: 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
e9e0: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
e9f0: 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 09  >code = &x[1];..
ea00: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
ea10: 28 20 78 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20  ( x[0]=='[' ){. 
ea20: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
ea30: 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  e = PRECEDENCE_M
ea40: 41 52 4b 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c  ARK_1;.      }el
ea50: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
ea60: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
ea70: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
ea80: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
ea90: 54 6f 6b 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f  Token \"%s\" sho
eaa0: 75 6c 64 20 62 65 20 65 69 74 68 65 72 20 5c 22  uld be either \"
eab0: 25 25 5c 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72  %%\" or a nonter
eac0: 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20  minal name.",.  
ead0: 20 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20          x);.    
eae0: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
eaf0: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
eb00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
eb10: 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41  se PRECEDENCE_MA
eb20: 52 4b 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20  RK_1:.      if( 
eb30: 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29  !isupper(x[0]) )
eb40: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
eb50: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
eb60: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
eb70: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 68  o,.          "Th
eb80: 65 20 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d  e precedence sym
eb90: 62 6f 6c 20 6d 75 73 74 20 62 65 20 61 20 74 65  bol must be a te
eba0: 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20  rminal.");.     
ebb0: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
ebc0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
ebd0: 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
ebe0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
ebf0: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
ec00: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
ec10: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
ec20: 20 20 20 22 54 68 65 72 65 20 69 73 20 6e 6f 20     "There is no 
ec30: 70 72 69 6f 72 20 72 75 6c 65 20 74 6f 20 61 73  prior rule to as
ec40: 73 69 67 6e 20 70 72 65 63 65 64 65 6e 63 65 20  sign precedence 
ec50: 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20  \"[%s]\".",x);. 
ec60: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
ec70: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
ec80: 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65  lse if( psp->pre
ec90: 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d  vrule->precsym!=
eca0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  0 ){.        Err
ecb0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
ecc0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
ecd0: 6e 65 6e 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63  neno,."Precedenc
ece0: 65 20 6d 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c  e mark on this l
ecf0: 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66  ine is not the f
ed00: 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77  irst \.to follow
ed10: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 75   the previous ru
ed20: 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  le.");.        p
ed30: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
ed40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ed50: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
ed60: 6c 65 2d 3e 70 72 65 63 73 79 6d 20 3d 20 53 79  le->precsym = Sy
ed70: 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
ed80: 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e     }.      psp->
ed90: 73 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e  state = PRECEDEN
eda0: 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20  CE_MARK_2;.     
edb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
edc0: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
edd0: 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  _2:.      if( x[
ede0: 30 5d 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  0]!=']' ){.     
edf0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
ee00: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
ee10: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
ee20: 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c        "Missing \
ee30: 22 5d 5c 22 20 6f 6e 20 70 72 65 63 65 64 65 6e  "]\" on preceden
ee40: 63 65 20 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20  ce mark.");.    
ee50: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
ee60: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
ee70: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
ee80: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
ee90: 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20  _OR_RULE;.      
eea0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
eeb0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f  WAITING_FOR_ARRO
eec0: 57 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  W:.      if( x[0
eed0: 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d  ]==':' && x[1]==
eee0: 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27  ':' && x[2]=='='
eef0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
ef00: 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
ef10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ef20: 20 78 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20   x[0]=='(' ){.  
ef30: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
ef40: 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a   = LHS_ALIAS_1;.
ef50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ef60: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
ef70: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
ef80: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
ef90: 20 20 20 20 20 20 20 20 22 45 78 70 65 63 74 65          "Expecte
efa0: 64 20 74 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22  d to see a \":\"
efb0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c   following the L
efc0: 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22  HS symbol \"%s\"
efd0: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 73  .",.          ps
efe0: 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
eff0: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f000: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
f010: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
f020: 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
f030: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
f040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
f050: 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a  ase LHS_ALIAS_1:
f060: 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c 70  .      if( isalp
f070: 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ha(x[0]) ){.    
f080: 20 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61      psp->lhsalia
f090: 73 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70  s = x;.        p
f0a0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f  sp->state = LHS_
f0b0: 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d  ALIAS_2;.      }
f0c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
f0d0: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
f0e0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f0f0: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
f100: 20 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20   "\"%s\" is not 
f110: 61 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f  a valid alias fo
f120: 72 20 74 68 65 20 4c 48 53 20 5c 22 25 73 5c 22  r the LHS \"%s\"
f130: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  \n",.          x
f140: 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  ,psp->lhs->name)
f150: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f160: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f170: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f180: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
f190: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
f1a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f1b0: 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53    case LHS_ALIAS
f1c0: 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  _2:.      if( x[
f1d0: 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20  0]==')' ){.     
f1e0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f1f0: 4c 48 53 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20  LHS_ALIAS_3;.   
f200: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f210: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f220: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f230: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
f240: 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
f250: 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48  )\" following LH
f260: 53 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25  S alias name \"%
f270: 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c  s\".",psp->lhsal
f280: 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ias);.        ps
f290: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f2a0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f2b0: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
f2c0: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
f2d0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
f2e0: 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
f2f0: 4c 49 41 53 5f 33 3a 0a 20 20 20 20 20 20 69 66  LIAS_3:.      if
f300: 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78  ( x[0]==':' && x
f310: 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d  [1]==':' && x[2]
f320: 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='=' ){.       
f330: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e   psp->state = IN
f340: 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _RHS;.      }els
f350: 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
f360: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f370: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f380: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d  no,.          "M
f390: 69 73 73 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f  issing \"->\" fo
f3a0: 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25 73 28 25 73  llowing: \"%s(%s
f3b0: 29 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  )\".",.         
f3c0: 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65    psp->lhs->name
f3d0: 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  ,psp->lhsalias);
f3e0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
f3f0: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f400: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
f410: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
f420: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
f430: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f440: 20 63 61 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20   case IN_RHS:.  
f450: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
f460: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ' ){.        str
f470: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
f480: 20 20 20 20 20 20 72 70 20 3d 20 28 73 74 72 75        rp = (stru
f490: 63 74 20 72 75 6c 65 20 2a 29 6d 61 6c 6c 6f 63  ct rule *)malloc
f4a0: 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
f4b0: 72 75 6c 65 29 20 2b 20 0a 20 20 20 20 20 20 20  rule) + .       
f4c0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72        sizeof(str
f4d0: 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70  uct symbol*)*psp
f4e0: 2d 3e 6e 72 68 73 20 2b 20 73 69 7a 65 6f 66 28  ->nrhs + sizeof(
f4f0: 63 68 61 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73  char*)*psp->nrhs
f500: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
f510: 72 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rp==0 ){.       
f520: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f530: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f540: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f550: 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61          "Can't a
f560: 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 6d  llocate enough m
f570: 65 6d 6f 72 79 20 66 6f 72 20 74 68 69 73 20 72  emory for this r
f580: 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ule.");.        
f590: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f5a0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
f5b0: 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a  ->prevrule = 0;.
f5c0: 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20  .}else{.        
f5d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
f5e0: 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20     rp->ruleline 
f5f0: 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
f600: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  no;.          rp
f610: 2d 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74 20  ->rhs = (struct 
f620: 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b  symbol**)&rp[1];
f630: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
f640: 68 73 61 6c 69 61 73 20 3d 20 28 63 68 61 72 2a  hsalias = (char*
f650: 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70 73 70 2d  *)&(rp->rhs[psp-
f660: 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20 20 20 20  >nrhs]);.       
f670: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 73     for(i=0; i<ps
f680: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
f690: 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72             rp->r
f6a0: 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 72 68 73  hs[i] = psp->rhs
f6b0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
f6c0: 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
f6d0: 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73 5b 69 5d   = psp->alias[i]
f6e0: 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20 20 20  ;..  }.         
f6f0: 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e   rp->lhs = psp->
f700: 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72  lhs;.          r
f710: 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70 73  p->lhsalias = ps
f720: 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20  p->lhsalias;.   
f730: 20 20 20 20 20 20 20 72 70 2d 3e 6e 72 68 73 20         rp->nrhs 
f740: 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20  = psp->nrhs;.   
f750: 20 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 20         rp->code 
f760: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
f770: 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a  p->precsym = 0;.
f780: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 69 6e            rp->in
f790: 64 65 78 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e  dex = psp->gp->n
f7a0: 72 75 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rule++;.        
f7b0: 20 20 72 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20    rp->nextlhs = 
f7c0: 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20  rp->lhs->rule;. 
f7d0: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73           rp->lhs
f7e0: 2d 3e 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20  ->rule = rp;.   
f7f0: 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 20         rp->next 
f800: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
f810: 66 28 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c  f( psp->firstrul
f820: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
f830: 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75      psp->firstru
f840: 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75  le = psp->lastru
f850: 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d 65 6c 73  le = rp;..  }els
f860: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
f870: 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e 65  sp->lastrule->ne
f880: 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  xt = rp;.       
f890: 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75       psp->lastru
f8a0: 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d 0a 20 20  le = rp;..  }.  
f8b0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
f8c0: 76 72 75 6c 65 20 3d 20 72 70 3b 0a 09 7d 0a 20  vrule = rp;..}. 
f8d0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f8e0: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
f8f0: 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
f900: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
f910: 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
f920: 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
f930: 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a  nrhs>=MAXRHS ){.
f940: 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
f950: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f960: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f970: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
f980: 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 20  Too many symbol 
f990: 6f 6e 20 52 48 53 20 6f 72 20 72 75 6c 65 20 62  on RHS or rule b
f9a0: 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73  eginning at \"%s
f9b0: 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  \".",.          
f9c0: 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20    x);.          
f9d0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
f9e0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
f9f0: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
fa00: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
fa10: 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20  ..}else{.       
fa20: 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d     psp->rhs[psp-
fa30: 3e 6e 72 68 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f  >nrhs] = Symbol_
fa40: 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
fa50: 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70    psp->alias[psp
fa60: 2d 3e 6e 72 68 73 5d 20 3d 20 30 3b 0a 20 20 20  ->nrhs] = 0;.   
fa70: 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73         psp->nrhs
fa80: 2b 2b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c  ++;..}.      }el
fa90: 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27  se if( x[0]=='('
faa0: 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
fab0: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
fac0: 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41  state = RHS_ALIA
fad0: 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_1;.      }else
fae0: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
faf0: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
fb00: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
fb10: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
fb20: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
fb30: 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20  on RHS of rule: 
fb40: 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
fb50: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
fb60: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
fb70: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
fb80: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
fb90: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
fba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
fbb0: 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e RHS_ALIAS_1:. 
fbc0: 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61       if( isalpha
fbd0: 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
fbe0: 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70    psp->alias[psp
fbf0: 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20  ->nrhs-1] = x;. 
fc00: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
fc10: 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b  e = RHS_ALIAS_2;
fc20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fc30: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
fc40: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
fc50: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
fc60: 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
fc70: 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
fc80: 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 48  alias for the RH
fc90: 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c  S symbol \"%s\"\
fca0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c  n",.          x,
fcb0: 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
fcc0: 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  hs-1]->name);.  
fcd0: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
fce0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
fcf0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
fd00: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
fd10: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
fd20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
fd30: 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a  se RHS_ALIAS_2:.
fd40: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
fd50: 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ')' ){.        p
fd60: 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
fd70: 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
fd80: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
fd90: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
fda0: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
fdb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
fdc0: 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
fdd0: 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
fde0: 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
fdf0: 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
fe00: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
fe10: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
fe20: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
fe30: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
fe40: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
fe50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
fe60: 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
fe70: 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20  CL_KEYWORD:.    
fe80: 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b    if( isalpha(x[
fe90: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
fea0: 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20  sp->declkeyword 
feb0: 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
fec0: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
fed0: 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
fee0: 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 30 3b 0a  decllnslot = 0;.
fef0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
ff00: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
ff10: 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20  _DECL_ARG;.     
ff20: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c     if( strcmp(x,
ff30: 22 6e 61 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "name")==0 ){.  
ff40: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
ff50: 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
ff60: 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b 0a 09 7d 65  ->gp->name);..}e
ff70: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
ff80: 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29  ,"include")==0 )
ff90: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
ffa0: 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
ffb0: 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64  (psp->gp->includ
ffc0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
ffd0: 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
ffe0: 26 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64  &psp->gp->includ
fff0: 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  eln;..}else if( 
10000 73 74 72 63 6d 70 28 78 2c 22 63 6f 64 65 22 29  strcmp(x,"code")
10010 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10020 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10030 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
10040 78 74 72 61 63 6f 64 65 29 3b 0a 20 20 20 20 20  xtracode);.     
10050 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
10060 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
10070 3e 65 78 74 72 61 63 6f 64 65 6c 6e 3b 0a 09 7d  >extracodeln;..}
10080 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10090 78 2c 22 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63  x,"token_destruc
100a0 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tor")==0 ){.    
100b0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
100c0 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  rgslot = &psp->g
100d0 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20  p->tokendest;.  
100e0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
100f0 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  llnslot = &psp->
10100 67 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 6c 6e 3b  gp->tokendestln;
10110 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
10120 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65  mp(x,"default_de
10130 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b  structor")==0 ){
10140 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10150 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
10160 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b  sp->gp->vardest;
10170 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10180 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73  decllnslot = &ps
10190 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 6c 6e  p->gp->vardestln
101a0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
101b0 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 70 72 65  cmp(x,"token_pre
101c0 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  fix")==0 ){.    
101d0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
101e0 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  rgslot = &psp->g
101f0 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
10200 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
10210 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f  p(x,"syntax_erro
10220 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
10230 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10240 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
10250 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20 20 20  ->error);.      
10260 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73      psp->decllns
10270 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
10280 65 72 72 6f 72 6c 6e 3b 0a 09 7d 65 6c 73 65 20  errorln;..}else 
10290 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61  if( strcmp(x,"pa
102a0 72 73 65 5f 61 63 63 65 70 74 22 29 3d 3d 30 20  rse_accept")==0 
102b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
102c0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
102d0 26 28 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70  &(psp->gp->accep
102e0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  t);.          ps
102f0 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
10300 26 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74  &psp->gp->accept
10310 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  ln;..}else if( s
10320 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66  trcmp(x,"parse_f
10330 61 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20  ailure")==0 ){. 
10340 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10350 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
10360 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b  p->gp->failure);
10370 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10380 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73  decllnslot = &ps
10390 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 6c 6e  p->gp->failureln
103a0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
103b0 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 6f 76 65  cmp(x,"stack_ove
103c0 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20  rflow")==0 ){.  
103d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
103e0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
103f0 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b  ->gp->overflow);
10400 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10410 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73  decllnslot = &ps
10420 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 6c  p->gp->overflowl
10430 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
10440 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 65   if( strcmp(x,"e
10450 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 22 29 3d  xtra_argument")=
10460 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10470 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10480 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 72   = &(psp->gp->ar
10490 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  g);.        }els
104a0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
104b0 74 6f 6b 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20  token_type")==0 
104c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
104d0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
104e0 26 28 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e  &(psp->gp->token
104f0 74 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  type);.        }
10500 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10510 78 2c 22 64 65 66 61 75 6c 74 5f 74 79 70 65 22  x,"default_type"
10520 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10530 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
10540 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
10550 76 61 72 74 79 70 65 29 3b 0a 20 20 20 20 20 20  vartype);.      
10560 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10570 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65  mp(x,"stack_size
10580 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10590 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
105a0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
105b0 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20  >stacksize);.   
105c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
105d0 74 72 63 6d 70 28 78 2c 22 73 74 61 72 74 5f 73  trcmp(x,"start_s
105e0 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  ymbol")==0 ){.  
105f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10600 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
10610 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20  ->gp->start);.  
10620 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10630 73 74 72 63 6d 70 28 78 2c 22 6c 65 66 74 22 29  strcmp(x,"left")
10640 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10650 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65   psp->preccounte
10660 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r++;.          p
10670 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20  sp->declassoc = 
10680 4c 45 46 54 3b 0a 20 20 20 20 20 20 20 20 20 20  LEFT;.          
10690 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
106a0 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
106b0 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20  NCE_SYMBOL;.    
106c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
106d0 72 63 6d 70 28 78 2c 22 72 69 67 68 74 22 29 3d  rcmp(x,"right")=
106e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
106f0 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
10700 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
10710 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 52  p->declassoc = R
10720 49 47 48 54 3b 0a 20 20 20 20 20 20 20 20 20 20  IGHT;.          
10730 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
10740 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
10750 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20  NCE_SYMBOL;.    
10760 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
10770 72 63 6d 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63  rcmp(x,"nonassoc
10780 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10790 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
107a0 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ter++;.         
107b0 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20   psp->declassoc 
107c0 3d 20 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  = NONE;.        
107d0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
107e0 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45  AITING_FOR_PRECE
107f0 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d  DENCE_SYMBOL;..}
10800 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10810 78 2c 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d  x,"destructor")=
10820 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10830 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
10840 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43  TING_FOR_DESTRUC
10850 54 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c  TOR_SYMBOL;..}el
10860 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
10870 22 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "type")==0 ){.  
10880 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10890 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
108a0 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c  _DATATYPE_SYMBOL
108b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
108c0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 66 61  if( strcmp(x,"fa
108d0 6c 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b 0a 20  llback")==0 ){. 
108e0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61           psp->fa
108f0 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20  llback = 0;.    
10900 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10910 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46   = WAITING_FOR_F
10920 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20 20 20  ALLBACK_ID;.    
10930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10940 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10950 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10960 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
10970 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f            "Unkno
10980 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b  wn declaration k
10990 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22  eyword: \"%%%s\"
109a0 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20  .",x);.         
109b0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
109c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
109d0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
109e0 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
109f0 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ;..}.      }else
10a00 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
10a10 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
10a20 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
10a30 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
10a40 6c 65 67 61 6c 20 64 65 63 6c 61 72 61 74 69 6f  legal declaratio
10a50 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73 5c  n keyword: \"%s\
10a60 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ".",x);.        
10a70 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
10a80 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10a90 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
10aa0 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
10ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
10ac0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
10ad0 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43  TING_FOR_DESTRUC
10ae0 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20  TOR_SYMBOL:.    
10af0 20 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 78    if( !isalpha(x
10b00 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
10b10 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10b20 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10b30 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10b40 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20     "Symbol name 
10b50 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 64  missing after %d
10b60 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72  estructor keywor
10b70 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  d");.        psp
10b80 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10b90 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10ba0 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10bb0 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
10bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10bd0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
10be0 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
10bf0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
10c00 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10c10 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
10c20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10c30 6c 6c 6e 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  llnslot = &sp->d
10c40 65 73 74 72 75 63 74 6f 72 6c 6e 3b 0a 20 20 20  estructorln;.   
10c50 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10c60 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
10c70 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a  CL_ARG;.      }.
10c80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10c90 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
10ca0 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
10cb0 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  L:.      if( !is
10cc0 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
10cd0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
10ce0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
10cf0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
10d00 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
10d10 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
10d20 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f 72  fter %destructor
10d30 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20   keyword");.    
10d40 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
10d50 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
10d60 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
10d70 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
10d80 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
10d90 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
10da0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
10db0 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
10dc0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10dd0 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74  lot = &sp->datat
10de0 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ype;.        psp
10df0 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 30  ->decllnslot = 0
10e00 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10e10 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
10e20 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20  OR_DECL_ARG;.   
10e30 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
10e40 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
10e50 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
10e60 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20  E_SYMBOL:.      
10e70 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
10e80 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10e90 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
10ea0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
10eb0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10ec0 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b  isupper(x[0]) ){
10ed0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
10ee0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20  symbol *sp;.    
10ef0 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
10f00 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
10f10 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20  if( sp->prec>=0 
10f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
10f30 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10f40 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10f50 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10f60 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22    "Symbol \"%s\"
10f70 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 20   has already be 
10f80 67 69 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e  given a preceden
10f90 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  ce.",x);.       
10fa0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10fb0 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20  ++;..}else{.    
10fc0 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d        sp->prec =
10fd0 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65   psp->preccounte
10fe0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  r;.          sp-
10ff0 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65  >assoc = psp->de
11000 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20 20 20  classoc;..}.    
11010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11020 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11030 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11040 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11050 20 20 20 20 22 43 61 6e 27 74 20 61 73 73 69 67      "Can't assig
11060 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 74  n a precedence t
11070 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  o \"%s\".",x);. 
11080 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11090 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
110a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
110b0 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
110c0 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20 20  R_DECL_ARG:.    
110d0 20 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7b 27    if( (x[0]=='{'
110e0 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c   || x[0]=='\"' |
110f0 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29 29  | isalnum(x[0]))
11100 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11110 2a 28 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c  *(psp->declargsl
11120 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ot)!=0 ){.      
11130 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11140 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11150 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11160 20 20 20 20 20 20 20 20 20 22 54 68 65 20 61 72           "The ar
11170 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 74 6f  gument \"%s\" to
11180 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 5c 22 25   declaration \"%
11190 25 25 73 5c 22 20 69 73 20 6e 6f 74 20 74 68 65  %%s\" is not the
111a0 20 66 69 72 73 74 2e 22 2c 0a 20 20 20 20 20 20   first.",.      
111b0 20 20 20 20 20 20 78 5b 30 5d 3d 3d 27 5c 22 27        x[0]=='\"'
111c0 20 3f 20 26 78 5b 31 5d 20 3a 20 78 2c 70 73 70   ? &x[1] : x,psp
111d0 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 29 3b 0a  ->declkeyword);.
111e0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
111f0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
11200 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11210 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
11220 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73  ECL_ERROR;..}els
11230 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 70  e{.          *(p
11240 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 29  sp->declargslot)
11250 20 3d 20 28 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c   = (x[0]=='\"' |
11260 7c 20 78 5b 30 5d 3d 3d 27 7b 27 29 20 3f 20 26  | x[0]=='{') ? &
11270 78 5b 31 5d 20 3a 20 78 3b 0a 20 20 20 20 20 20  x[1] : x;.      
11280 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64 65 63      if( psp->dec
11290 6c 6c 6e 73 6c 6f 74 20 29 20 2a 70 73 70 2d 3e  llnslot ) *psp->
112a0 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 70 73 70  decllnslot = psp
112b0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20  ->tokenlineno;. 
112c0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
112d0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
112e0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
112f0 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .}.      }else{.
11300 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11310 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11320 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11330 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65  .          "Ille
11340 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  gal argument to 
11350 25 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64  %%%s: %s",psp->d
11360 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20  eclkeyword,x);. 
11370 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11380 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
11390 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
113a0 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
113b0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
113c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
113d0 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
113e0 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20  FALLBACK_ID:.   
113f0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
11400 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
11410 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
11420 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
11430 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
11440 66 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d  f( !isupper(x[0]
11450 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
11460 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11470 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
11480 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11490 20 22 25 25 66 61 6c 6c 62 61 63 6b 20 61 72 67   "%%fallback arg
114a0 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f  ument \"%s\" sho
114b0 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c  uld be a token",
114c0 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70   x);.        psp
114d0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
114e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
114f0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
11500 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65   *sp = Symbol_ne
11510 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  w(x);.        if
11520 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d  ( psp->fallback=
11530 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11540 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20  psp->fallback = 
11550 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  sp;.        }els
11560 65 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61  e if( sp->fallba
11570 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ck ){.          
11580 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11590 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
115a0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
115b0 20 20 20 20 20 20 22 4d 6f 72 65 20 74 68 61 6e        "More than
115c0 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61 73   one fallback as
115d0 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20  signed to token 
115e0 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  %s", x);.       
115f0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11600 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
11610 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  e{.          sp-
11620 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d  >fallback = psp-
11630 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20  >fallback;.     
11640 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61       psp->gp->ha
11650 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  s_fallback = 1;.
11660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11670 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11680 20 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41     case RESYNC_A
11690 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3a  FTER_RULE_ERROR:
116a0 0a 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b 30  ./*      if( x[0
116b0 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74  ]=='.' ) psp->st
116c0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
116d0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
116e0 2a 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2a  **      break; *
116f0 2f 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e  /.    case RESYN
11700 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
11710 4f 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  OR:.      if( x[
11720 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73  0]=='.' ) psp->s
11730 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11740 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
11750 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
11760 3d 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61 74  ='%' ) psp->stat
11770 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11780 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20  DECL_KEYWORD;.  
11790 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d      break;.  }.}
117a0 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 6f  ../* Run the pro
117b0 70 72 6f 63 65 73 73 6f 72 20 6f 76 65 72 20 74  processor over t
117c0 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74 65  he input file te
117d0 78 74 2e 20 20 54 68 65 20 67 6c 6f 62 61 6c 20  xt.  The global 
117e0 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 7a 44  variables.** azD
117f0 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f 75 67 68  efine[0] through
11800 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e   azDefine[nDefin
11810 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68  e-1] contains th
11820 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 64  e names of all d
11830 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f 73  efined.** macros
11840 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
11850 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69 66 64 65  looks for "%ifde
11860 66 22 20 61 6e 64 20 22 25 69 66 6e 64 65 66 22  f" and "%ifndef"
11870 20 61 6e 64 20 22 25 65 6e 64 69 66 22 20 61 6e   and "%endif" an
11880 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 74 68  d.** comments th
11890 65 6d 20 6f 75 74 2e 20 20 54 65 78 74 20 69 6e  em out.  Text in
118a0 20 62 65 74 77 65 65 6e 20 69 73 20 61 6c 73 6f   between is also
118b0 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20 61   commented out a
118c0 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a  s appropriate..*
118d0 2f 0a 73 74 61 74 69 63 20 70 72 65 70 72 6f 63  /.static preproc
118e0 65 73 73 5f 69 6e 70 75 74 28 63 68 61 72 20 2a  ess_input(char *
118f0 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  z){.  int i, j, 
11900 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 65 78 63 6c  k, n;.  int excl
11910 75 64 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ude = 0;.  int s
11920 74 61 72 74 3b 0a 20 20 69 6e 74 20 6c 69 6e 65  tart;.  int line
11930 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74  no = 1;.  int st
11940 61 72 74 5f 6c 69 6e 65 6e 6f 3b 0a 20 20 66 6f  art_lineno;.  fo
11950 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
11960 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  ){.    if( z[i]=
11970 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
11980 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d  ;.    if( z[i]!=
11990 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a  '%' || (i>0 && z
119a0 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63  [i-1]!='\n') ) c
119b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
119c0 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22   strncmp(&z[i],"
119d0 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26 26  %endif",6)==0 &&
119e0 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 36 5d 29   isspace(z[i+6])
119f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78   ){.      if( ex
11a00 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
11a10 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20   exclude--;.    
11a20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 3d      if( exclude=
11a30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11a40 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69  for(j=start; j<i
11a50 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21  ; j++) if( z[j]!
11a60 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27  ='\n' ) z[j] = '
11a70 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
11a80 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
11a90 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a  j=i; z[j] && z[j
11aa0 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b  ]!='\n'; j++) z[
11ab0 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65  j] = ' ';.    }e
11ac0 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63 6d 70  lse if( (strncmp
11ad0 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c  (&z[i],"%ifdef",
11ae0 36 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63 65  6)==0 && isspace
11af0 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20 20  (z[i+6])).      
11b00 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28      || (strncmp(
11b10 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c  &z[i],"%ifndef",
11b20 37 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63 65  7)==0 && isspace
11b30 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20  (z[i+7])) ){.   
11b40 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
11b50 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
11b60 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  e++;.      }else
11b70 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
11b80 69 2b 37 3b 20 69 73 73 70 61 63 65 28 7a 5b 6a  i+7; isspace(z[j
11b90 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); j++){}.     
11ba0 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b     for(n=0; z[j+
11bb0 6e 5d 20 26 26 20 21 69 73 73 70 61 63 65 28 7a  n] && !isspace(z
11bc0 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20  [j+n]); n++){}. 
11bd0 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
11be0 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   1;.        for(
11bf0 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20  k=0; k<nDefine; 
11c00 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
11c10 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 44 65  if( strncmp(azDe
11c20 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29  fine[k],&z[j],n)
11c30 3d 3d 30 20 26 26 20 73 74 72 6c 65 6e 28 61 7a  ==0 && strlen(az
11c40 44 65 66 69 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b  Define[k])==n ){
11c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78 63  .            exc
11c60 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  lude = 0;.      
11c70 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11c90 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
11ca0 5b 69 2b 33 5d 3d 3d 27 6e 27 20 29 20 65 78 63  [i+3]=='n' ) exc
11cb0 6c 75 64 65 20 3d 20 21 65 78 63 6c 75 64 65 3b  lude = !exclude;
11cc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 63  .        if( exc
11cd0 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lude ){.        
11ce0 20 20 73 74 61 72 74 20 3d 20 69 3b 0a 20 20 20    start = i;.   
11cf0 20 20 20 20 20 20 20 73 74 61 72 74 5f 6c 69 6e         start_lin
11d00 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20  eno = lineno;.  
11d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11d20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a        for(j=i; z
11d30 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e  [j] && z[j]!='\n
11d40 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27  '; j++) z[j] = '
11d50 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   ';.    }.  }.  
11d60 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20  if( exclude ){. 
11d70 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
11d80 72 2c 22 75 6e 74 65 72 6d 69 6e 61 74 65 64 20  r,"unterminated 
11d90 25 25 69 66 64 65 66 20 73 74 61 72 74 69 6e 67  %%ifdef starting
11da0 20 6f 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 20   on line %d\n", 
11db0 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20  start_lineno);. 
11dc0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
11dd0 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69 74 65 20 6f  }../* In spite o
11de0 66 20 69 74 73 20 6e 61 6d 65 2c 20 74 68 69 73  f its name, this
11df0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 61   function is rea
11e00 6c 6c 79 20 61 20 73 63 61 6e 6e 65 72 2e 20 20  lly a scanner.  
11e10 49 74 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  It read.** in th
11e20 65 20 65 6e 74 69 72 65 20 69 6e 70 75 74 20 66  e entire input f
11e30 69 6c 65 20 28 61 6c 6c 20 61 74 20 6f 6e 63 65  ile (all at once
11e40 29 20 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65 73  ) then tokenizes
11e50 20 69 74 2e 20 20 45 61 63 68 0a 2a 2a 20 74 6f   it.  Each.** to
11e60 6b 65 6e 20 69 73 20 70 61 73 73 65 64 20 74 6f  ken is passed to
11e70 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 70   the function "p
11e80 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 22 20 77 68  arseonetoken" wh
11e90 69 63 68 20 62 75 69 6c 64 73 20 61 6c 6c 0a 2a  ich builds all.*
11ea0 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
11eb0 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
11ec0 73 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20  s in the global 
11ed0 73 74 61 74 65 20 76 65 63 74 6f 72 20 22 67 70  state vector "gp
11ee0 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65  "..*/.void Parse
11ef0 28 67 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  (gp).struct lemo
11f00 6e 20 2a 67 70 3b 0a 7b 0a 20 20 73 74 72 75 63  n *gp;.{.  struc
11f10 74 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46  t pstate ps;.  F
11f20 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20  ILE *fp;.  char 
11f30 2a 66 69 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20  *filebuf;.  int 
11f40 66 69 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20  filesize;.  int 
11f50 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b  lineno;.  int c;
11f60 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65  .  char *cp, *ne
11f70 78 74 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72  xtcp;.  int star
11f80 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 70 73  tline = 0;..  ps
11f90 2e 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66  .gp = gp;.  ps.f
11fa0 69 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69  ilename = gp->fi
11fb0 6c 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72  lename;.  ps.err
11fc0 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e  orcnt = 0;.  ps.
11fd0 73 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49  state = INITIALI
11fe0 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  ZE;..  /* Begin 
11ff0 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 69  by reading the i
12000 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66  nput file */.  f
12010 70 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c  p = fopen(ps.fil
12020 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69  ename,"rb");.  i
12030 66 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( fp==0 ){.    
12040 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
12050 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70  name,0,"Can't op
12060 65 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  en this file for
12070 20 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20   reading.");.   
12080 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b   gp->errorcnt++;
12090 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
120a0 0a 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29  .  fseek(fp,0,2)
120b0 3b 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66  ;.  filesize = f
120c0 74 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69  tell(fp);.  rewi
120d0 6e 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75  nd(fp);.  filebu
120e0 66 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c  f = (char *)mall
120f0 6f 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29  oc( filesize+1 )
12100 3b 0a 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d  ;.  if( filebuf=
12110 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d  =0 ){.    ErrorM
12120 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30  sg(ps.filename,0
12130 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65  ,"Can't allocate
12140 20 25 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f   %d of memory to
12150 20 68 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e   hold this file.
12160 22 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a  ",.      filesiz
12170 65 2b 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72  e+1);.    gp->er
12180 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
12190 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
121a0 66 72 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c  fread(filebuf,1,
121b0 66 69 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69  filesize,fp)!=fi
121c0 6c 65 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72  lesize ){.    Er
121d0 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
121e0 6d 65 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64  me,0,"Can't read
121f0 20 69 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73   in all %d bytes
12200 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c   of this file.",
12210 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29  .      filesize)
12220 3b 0a 20 20 20 20 66 72 65 65 28 66 69 6c 65 62  ;.    free(fileb
12230 75 66 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  uf);.    gp->err
12240 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
12250 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  urn;.  }.  fclos
12260 65 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66  e(fp);.  filebuf
12270 5b 66 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a  [filesize] = 0;.
12280 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e  .  /* Make an in
12290 69 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75  itial pass throu
122a0 67 68 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68  gh the file to h
122b0 61 6e 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64  andle %ifdef and
122c0 20 25 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72   %ifndef */.  pr
122d0 65 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66  eprocess_input(f
122e0 69 6c 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e  ilebuf);..  /* N
122f0 6f 77 20 73 63 61 6e 20 74 68 65 20 74 65 78 74  ow scan the text
12300 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
12310 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d  le */.  lineno =
12320 20 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c   1;.  for(cp=fil
12330 65 62 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d  ebuf; (c= *cp)!=
12340 30 3b 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  0; ){.    if( c=
12350 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
12360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
12370 2a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  * Keep track of 
12380 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
12390 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 73 70 61  */.    if( isspa
123a0 63 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63  ce(c) ){ cp++; c
123b0 6f 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53  ontinue; }  /* S
123c0 6b 69 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70  kip all white sp
123d0 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ace */.    if( c
123e0 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
123f0 27 2f 27 20 29 7b 20 20 20 20 20 20 20 20 20 20  '/' ){          
12400 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c  /* Skip C++ styl
12410 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20  e comments */.  
12420 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20      cp+=2;.     
12430 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
12440 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29  !=0 && c!='\n' )
12450 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e   cp++;.      con
12460 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
12470 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
12480 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20  p[1]=='*' ){    
12490 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20        /* Skip C 
124a0 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a  style comments *
124b0 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20  /.      cp+=2;. 
124c0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
124d0 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27  *cp)!=0 && (c!='
124e0 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a  /' || cp[-1]!='*
124f0 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ') ){.        if
12500 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
12510 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70  no++;.        cp
12520 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
12530 20 20 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a    if( c ) cp++;.
12540 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
12550 20 20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b      }.    ps.tok
12560 65 6e 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20  enstart = cp;   
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12580 4d 61 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69  Mark the beginni
12590 6e 67 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20  ng of the token 
125a0 2a 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c  */.    ps.tokenl
125b0 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20  ineno = lineno; 
125c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
125d0 65 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68  enumber on which
125e0 20 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f   token begins */
125f0 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27  .    if( c=='\"'
12600 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
12610 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
12620 67 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20  g literals */.  
12630 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
12640 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
12650 3d 30 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b  =0 && c!='\"' ){
12660 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
12670 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
12680 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  .        cp++;. 
12690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
126a0 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
126b0 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
126c0 65 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c  ename,startline,
126d0 0a 22 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e  ."String startin
126e0 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  g on this line i
126f0 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64  s not terminated
12700 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20   before the end 
12710 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a  of the file.");.
12720 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72          ps.error
12730 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  cnt++;.        n
12740 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
12750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12760 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a   nextcp = cp+1;.
12770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
12780 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20  e if( c=='{' ){ 
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
127a0 20 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f   A block of C co
127b0 64 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  de */.      int 
127c0 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b  level;.      cp+
127d0 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76  +;.      for(lev
127e0 65 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d  el=1; (c= *cp)!=
127f0 30 20 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c  0 && (level>1 ||
12800 20 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b   c!='}'); cp++){
12810 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
12820 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
12830 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
12840 28 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c  ( c=='{' ) level
12850 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  ++;.        else
12860 20 69 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65   if( c=='}' ) le
12870 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65  vel--;.        e
12880 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26  lse if( c=='/' &
12890 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20  & cp[1]=='*' ){ 
128a0 20 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74   /* Skip comment
128b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
128c0 6e 74 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20  nt prevc;.      
128d0 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b      cp = &cp[2];
128e0 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63  .          prevc
128f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
12900 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
12910 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c  =0 && (c!='/' ||
12920 20 70 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a   prevc!='*') ){.
12930 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12940 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
12950 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
12960 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20  prevc = c;.     
12970 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20         cp++;..  
12980 7d 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  }..}else if( c==
12990 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f  '/' && cp[1]=='/
129a0 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b  ' ){  /* Skip C+
129b0 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  + style comments
129c0 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20   too */.        
129d0 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20    cp = &cp[2];. 
129e0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
129f0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63  (c= *cp)!=0 && c
12a00 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20  !='\n' ) cp++;. 
12a10 20 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29           if( c )
12a20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73   lineno++;..}els
12a30 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c  e if( c=='\'' ||
12a40 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f   c=='\"' ){    /
12a50 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61 72 61  * String a chara
12a60 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f  cter literals */
12a70 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73  .          int s
12a80 74 61 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b  tartchar, prevc;
12a90 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74  .          start
12aa0 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20  char = c;.      
12ab0 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20      prevc = 0;. 
12ac0 20 20 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b           for(cp+
12ad0 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  +; (c= *cp)!=0 &
12ae0 26 20 28 63 21 3d 73 74 61 72 74 63 68 61 72 20  & (c!=startchar 
12af0 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b  || prevc=='\\');
12b00 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   cp++){.        
12b10 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
12b20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
12b30 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65 76          if( prev
12b40 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20  c=='\\' ) prevc 
12b50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
12b60 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
12b70 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 09 20     prevc = c;.. 
12b80 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20   }..}.      }.  
12b90 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
12ba0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12bb0 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e  (ps.filename,ps.
12bc0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20  tokenlineno,."C 
12bd0 63 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e  code starting on
12be0 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
12bf0 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66  t terminated bef
12c00 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ore the end of t
12c10 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20  he file.");.    
12c20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b      ps.errorcnt+
12c30 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  +;.        nextc
12c40 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65  p = cp;.      }e
12c50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  lse{.        nex
12c60 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20  tcp = cp+1;.    
12c70 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
12c80 28 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20  ( isalnum(c) ){ 
12c90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e           /* Iden
12ca0 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20  tifiers */.     
12cb0 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
12cc0 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  !=0 && (isalnum(
12cd0 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20  c) || c=='_') ) 
12ce0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
12cf0 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
12d00 73 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26  se if( c==':' &&
12d10 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63   cp[1]==':' && c
12d20 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20  p[2]=='=' ){ /* 
12d30 54 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a  The operator "::
12d40 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b  =" */.      cp +
12d50 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  = 3;.      nextc
12d60 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
12d70 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
12d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
12d90 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63 68  ll other (one ch
12da0 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74 6f  aracter) operato
12db0 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b  rs */.      cp++
12dc0 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
12dd0 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   cp;.    }.    c
12de0 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20   = *cp;.    *cp 
12df0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12e10 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ull terminate th
12e20 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70  e token */.    p
12e30 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73  arseonetoken(&ps
12e40 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
12e50 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b 65  * Parse the toke
12e60 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20 63  n */.    *cp = c
12e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12e80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
12e90 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 2a  ore the buffer *
12ea0 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74 63  /.    cp = nextc
12eb0 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66 69  p;.  }.  free(fi
12ec0 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20 20  lebuf);         
12ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12ee0 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65 72  lease the buffer
12ef0 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20 2a   after parsing *
12f00 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70  /.  gp->rule = p
12f10 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20 67  s.firstrule;.  g
12f20 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70 73  p->errorcnt = ps
12f30 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a  .errorcnt;.}./**
12f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
12f60 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63  he file "plink.c
12f70 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
12f80 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52  *******/./*.** R
12f90 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69  outines processi
12fa0 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ng configuration
12fb0 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70   follow-set prop
12fc0 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a  agation links.**
12fd0 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
12fe0 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
12ff0 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
13000 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72   plink *plink_fr
13010 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20  eelist = 0;../* 
13020 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
13030 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70  link */.struct p
13040 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28  link *Plink_new(
13050 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  ){.  struct plin
13060 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28 20 70  k *new;..  if( p
13070 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30  link_freelist==0
13080 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
13090 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30     int amt = 100
130a0 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65  ;.    plink_free
130b0 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 70  list = (struct p
130c0 6c 69 6e 6b 20 2a 29 6d 61 6c 6c 6f 63 28 20 73  link *)malloc( s
130d0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70 6c 69  izeof(struct pli
130e0 6e 6b 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69  nk)*amt );.    i
130f0 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  f( plink_freelis
13100 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
13110 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
13120 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 61      "Unable to a
13130 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
13140 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d  or a new follow-
13150 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  set propagation 
13160 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  link.\n");.     
13170 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
13180 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
13190 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b  mt-1; i++) plink
131a0 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78  _freelist[i].nex
131b0 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65 65 6c  t = &plink_freel
131c0 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 70 6c  ist[i+1];.    pl
131d0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61 6d 74  ink_freelist[amt
131e0 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  -1].next = 0;.  
131f0 7d 0a 20 20 6e 65 77 20 3d 20 70 6c 69 6e 6b 5f  }.  new = plink_
13200 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e  freelist;.  plin
13210 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 69  k_freelist = pli
13220 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78  nk_freelist->nex
13230 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b  t;.  return new;
13240 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69  .}../* Add a pli
13250 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69  nk to a plink li
13260 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b  st */.void Plink
13270 5f 61 64 64 28 70 6c 70 70 2c 63 66 70 29 0a 73  _add(plpp,cfp).s
13280 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c  truct plink **pl
13290 70 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  pp;.struct confi
132a0 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75  g *cfp;.{.  stru
132b0 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 20  ct plink *new;. 
132c0 20 6e 65 77 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77   new = Plink_new
132d0 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78 74 20  ();.  new->next 
132e0 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70  = *plpp;.  *plpp
132f0 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e 63   = new;.  new->c
13300 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20  fp = cfp;.}../* 
13310 54 72 61 6e 73 66 65 72 20 65 76 65 72 79 20 70  Transfer every p
13320 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74  link on the list
13330 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65 20 6c   "from" to the l
13340 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f 69 64  ist "to" */.void
13350 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 74 6f 2c 66   Plink_copy(to,f
13360 72 6f 6d 29 0a 73 74 72 75 63 74 20 70 6c 69 6e  rom).struct plin
13370 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75 63 74 20 70  k **to;.struct p
13380 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a 20 20  link *from;.{.  
13390 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
133a0 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66  xtpl;.  while( f
133b0 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  rom ){.    nextp
133c0 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a  l = from->next;.
133d0 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d      from->next =
133e0 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20   *to;.    *to = 
133f0 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d  from;.    from =
13400 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a   nextpl;.  }.}..
13410 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20  /* Delete every 
13420 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73  plink on the lis
13430 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  t */.void Plink_
13440 64 65 6c 65 74 65 28 70 6c 70 29 0a 73 74 72 75  delete(plp).stru
13450 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 7b  ct plink *plp;.{
13460 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
13470 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c  *nextpl;..  whil
13480 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65  e( plp ){.    ne
13490 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74  xtpl = plp->next
134a0 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20  ;.    plp->next 
134b0 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  = plink_freelist
134c0 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65  ;.    plink_free
134d0 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20  list = plp;.    
134e0 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20  plp = nextpl;.  
134f0 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
13500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
13510 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70 6f  m the file "repo
13520 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rt.c" **********
13530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13540 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72  /./*.** Procedur
13550 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e  es for generatin
13560 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20 74 61  g reports and ta
13570 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
13580 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
13590 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72  or..*/../* Gener
135a0 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65 20 77  ate a filename w
135b0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73 75  ith the given su
135c0 66 66 69 78 2e 20 20 53 70 61 63 65 20 74 6f 20  ffix.  Space to 
135d0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  hold the.** name
135e0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c   comes from mall
135f0 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
13600 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
13610 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
13620 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  n..*/.PRIVATE ch
13630 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d  ar *file_makenam
13640 65 28 6c 65 6d 70 2c 73 75 66 66 69 78 29 0a 73  e(lemp,suffix).s
13650 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
13660 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69 78 3b  p;.char *suffix;
13670 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b  .{.  char *name;
13680 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20  .  char *cp;..  
13690 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  name = malloc( s
136a0 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65  trlen(lemp->file
136b0 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65 6e 28 73  name) + strlen(s
136c0 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20  uffix) + 5 );.  
136d0 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  if( name==0 ){. 
136e0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
136f0 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74  r,"Can't allocat
13700 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66 69  e space for a fi
13710 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20  lename.\n");.   
13720 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
13730 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70  strcpy(name,lemp
13740 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63  ->filename);.  c
13750 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61 6d 65  p = strrchr(name
13760 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20  ,'.');.  if( cp 
13770 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74 72  ) *cp = 0;.  str
13780 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29  cat(name,suffix)
13790 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b  ;.  return name;
137a0 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69  .}../* Open a fi
137b0 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62  le with a name b
137c0 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65  ased on the name
137d0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
137e0 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20  le,.** but with 
137f0 61 20 64 69 66 66 65 72 65 6e 74 20 28 73 70 65  a different (spe
13800 63 69 66 69 65 64 29 20 73 75 66 66 69 78 2c 20  cified) suffix, 
13810 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
13820 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  nter.** to the s
13830 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45  tream */.PRIVATE
13840 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e   FILE *file_open
13850 28 6c 65 6d 70 2c 73 75 66 66 69 78 2c 6d 6f 64  (lemp,suffix,mod
13860 65 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  e).struct lemon 
13870 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66  *lemp;.char *suf
13880 66 69 78 3b 0a 63 68 61 72 20 2a 6d 6f 64 65 3b  fix;.char *mode;
13890 0a 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a  .{.  FILE *fp;..
138a0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e    if( lemp->outn
138b0 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d  ame ) free(lemp-
138c0 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d  >outname);.  lem
138d0 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c  p->outname = fil
138e0 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
138f0 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d   suffix);.  fp =
13900 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74   fopen(lemp->out
13910 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66  name,mode);.  if
13920 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65  ( fp==0 && *mode
13930 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72  =='w' ){.    fpr
13940 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
13950 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25  't open file \"%
13960 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75  s\".\n",lemp->ou
13970 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70  tname);.    lemp
13980 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
13990 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
139a0 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a    return fp;.}..
139b0 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65  /* Duplicate the
139c0 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68   input file with
139d0 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64  out comments and
139e0 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73   without actions
139f0 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f   .** on rules */
13a00 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 6c 65  .void Reprint(le
13a10 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
13a20 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
13a30 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73  ct rule *rp;.  s
13a40 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
13a50 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61  ;.  int i, j, ma
13a60 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75  xlen, len, ncolu
13a70 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69  mns, skip;.  pri
13a80 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e 74 20  ntf("// Reprint 
13a90 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 5c 22  of input file \"
13aa0 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c  %s\".\n// Symbol
13ab0 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65  s:\n",lemp->file
13ac0 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20  name);.  maxlen 
13ad0 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = 10;.  for(i=0;
13ae0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
13af0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d  ; i++){.    sp =
13b00 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
13b10 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  ];.    len = str
13b20 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  len(sp->name);. 
13b30 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65     if( len>maxle
13b40 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e  n ) maxlen = len
13b50 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73  ;.  }.  ncolumns
13b60 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29   = 76/(maxlen+5)
13b70 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73  ;.  if( ncolumns
13b80 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20  <1 ) ncolumns = 
13b90 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d  1;.  skip = (lem
13ba0 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f  p->nsymbol + nco
13bb0 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75  lumns - 1)/ncolu
13bc0 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  mns;.  for(i=0; 
13bd0 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<skip; i++){.  
13be0 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a    printf("//");.
13bf0 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c      for(j=i; j<l
13c00 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b  emp->nsymbol; j+
13c10 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70  =skip){.      sp
13c20 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
13c30 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [j];.      asser
13c40 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20  t( sp->index==j 
13c50 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  );.      printf(
13c60 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c  " %3d %-*.*s",j,
13c70 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70  maxlen,maxlen,sp
13c80 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  ->name);.    }. 
13c90 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
13ca0 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
13cb0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
13cc0 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
13cd0 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e  printf("%s",rp->
13ce0 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 2f 2a 20 20  lhs->name);./*  
13cf0 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
13d00 61 73 20 29 20 70 72 69 6e 74 66 28 22 28 25 73  as ) printf("(%s
13d10 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  )",rp->lhsalias)
13d20 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28  ; */.    printf(
13d30 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66 6f 72  " ::=");.    for
13d40 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
13d50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 72  ; i++){.      pr
13d60 69 6e 74 66 28 22 20 25 73 22 2c 72 70 2d 3e 72  intf(" %s",rp->r
13d70 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 2f 2a  hs[i]->name);./*
13d80 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68        if( rp->rh
13d90 73 61 6c 69 61 73 5b 69 5d 20 29 20 70 72 69 6e  salias[i] ) prin
13da0 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 72 68  tf("(%s)",rp->rh
13db0 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20  salias[i]); */. 
13dc0 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28     }.    printf(
13dd0 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20 72 70  ".");.    if( rp
13de0 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72 69 6e  ->precsym ) prin
13df0 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e 70  tf(" [%s]",rp->p
13e00 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 2f  recsym->name);./
13e10 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64  *    if( rp->cod
13e20 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 20 20  e ) printf("\n  
13e30 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b    %s",rp->code);
13e40 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22   */.    printf("
13e50 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69  \n");.  }.}..voi
13e60 64 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66 70  d ConfigPrint(fp
13e70 2c 63 66 70 29 0a 46 49 4c 45 20 2a 66 70 3b 0a  ,cfp).FILE *fp;.
13e80 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
13e90 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  fp;.{.  struct r
13ea0 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20 69  ule *rp;.  int i
13eb0 3b 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70  ;.  rp = cfp->rp
13ec0 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22  ;.  fprintf(fp,"
13ed0 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d  %s ::=",rp->lhs-
13ee0 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  >name);.  for(i=
13ef0 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20  0; i<=rp->nrhs; 
13f00 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d  i++){.    if( i=
13f10 3d 63 66 70 2d 3e 64 6f 74 20 29 20 66 70 72 69  =cfp->dot ) fpri
13f20 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20  ntf(fp," *");.  
13f30 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
13f40 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 66  s ) break;.    f
13f50 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c  printf(fp," %s",
13f60 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65  rp->rhs[i]->name
13f70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65  );.  }.}../* #de
13f80 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66  fine TEST */.#if
13f90 64 65 66 20 54 45 53 54 0a 2f 2a 20 50 72 69 6e  def TEST./* Prin
13fa0 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49 56 41  t a set */.PRIVA
13fb0 54 45 20 76 6f 69 64 20 53 65 74 50 72 69 6e 74  TE void SetPrint
13fc0 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a 46  (out,set,lemp).F
13fd0 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20 2a  ILE *out;.char *
13fe0 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  set;.struct lemo
13ff0 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
14000 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70 61 63   i;.  char *spac
14010 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d 20 22  er;.  spacer = "
14020 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  ";.  fprintf(out
14030 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20 20  ,"%12s[","");.  
14040 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
14050 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
14060 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46 69 6e  {.    if( SetFin
14070 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20 20 20  d(set,i) ){.    
14080 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
14090 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d 70  s%s",spacer,lemp
140a0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  ->symbols[i]->na
140b0 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61 63 65  me);.      space
140c0 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a 20  r = " ";.    }. 
140d0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
140e0 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50  ,"]\n");.}../* P
140f0 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68 61  rint a plink cha
14100 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  in */.PRIVATE vo
14110 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f 75  id PlinkPrint(ou
14120 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45 20  t,plp,tag).FILE 
14130 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70 6c 69  *out;.struct pli
14140 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a 74  nk *plp;.char *t
14150 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20 70  ag;.{.  while( p
14160 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  lp ){.    fprint
14170 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20 28 73  f(out,"%12s%s (s
14180 74 61 74 65 20 25 32 64 29 20 22 2c 22 22 2c 74  tate %2d) ","",t
14190 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 70  ag,plp->cfp->stp
141a0 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 43 6f  ->index);.    Co
141b0 6e 66 69 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c  nfigPrint(out,pl
141c0 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66 70 72  p->cfp);.    fpr
141d0 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a  intf(out,"\n");.
141e0 20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e      plp = plp->n
141f0 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ext;.  }.}.#endi
14200 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61  f../* Print an a
14210 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67 69 76  ction to the giv
14220 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
14230 6f 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  or.  Return FALS
14240 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20  E if.** nothing 
14250 77 61 73 20 61 63 74 75 61 6c 6c 79 20 70 72 69  was actually pri
14260 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69  nted..*/.int Pri
14270 6e 74 41 63 74 69 6f 6e 28 73 74 72 75 63 74 20  ntAction(struct 
14280 61 63 74 69 6f 6e 20 2a 61 70 2c 20 46 49 4c 45  action *ap, FILE
14290 20 2a 66 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74   *fp, int indent
142a0 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20  ){.  int result 
142b0 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28 20 61  = 1;.  switch( a
142c0 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63  p->type ){.    c
142d0 61 73 65 20 53 48 49 46 54 3a 0a 20 20 20 20 20  ase SHIFT:.     
142e0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
142f0 20 73 68 69 66 74 20 20 25 64 22 2c 69 6e 64 65   shift  %d",inde
14300 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
14310 61 70 2d 3e 78 2e 73 74 70 2d 3e 69 6e 64 65 78  ap->x.stp->index
14320 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14330 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45 3a      case REDUCE:
14340 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
14350 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25 64  p,"%*s reduce %d
14360 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
14370 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
14380 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72  index);.      br
14390 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43  eak;.    case AC
143a0 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72 69  CEPT:.      fpri
143b0 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63 65  ntf(fp,"%*s acce
143c0 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  pt",indent,ap->s
143d0 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
143e0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
143f0 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70 72  ERROR:.      fpr
14400 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72 72  intf(fp,"%*s err
14410 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  or",indent,ap->s
14420 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
14430 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
14440 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20  CONFLICT:.      
14450 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
14460 72 65 64 75 63 65 20 25 2d 33 64 20 2a 2a 20 50  reduce %-3d ** P
14470 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20  arsing conflict 
14480 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64  **",.        ind
14490 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
144a0 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78  ,ap->x.rp->index
144b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
144c0 20 20 20 20 63 61 73 65 20 53 48 5f 52 45 53 4f      case SH_RESO
144d0 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 52  LVED:.    case R
144e0 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20  D_RESOLVED:.    
144f0 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a 0a 20  case NOT_USED:. 
14500 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b       result = 0;
14510 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14520 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c  }.  return resul
14530 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  t;.}../* Generat
14540 65 20 74 68 65 20 22 79 2e 6f 75 74 70 75 74 22  e the "y.output"
14550 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76 6f 69   log file */.voi
14560 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 6c  d ReportOutput(l
14570 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
14580 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
14590 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
145a0 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
145b0 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
145c0 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
145d0 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a  ap;.  FILE *fp;.
145e0 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f 70 65  .  fp = file_ope
145f0 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c 22 77  n(lemp,".out","w
14600 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20  ");.  if( fp==0 
14610 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 70 72 69  ) return;.  fpri
14620 6e 74 66 28 66 70 2c 22 20 5c 62 22 29 3b 0a 20  ntf(fp," \b");. 
14630 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
14640 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
14650 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
14660 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
14670 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65  printf(fp,"State
14680 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 69 6e 64   %d:\n",stp->ind
14690 65 78 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d  ex);.    if( lem
146a0 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63  p->basisflag ) c
146b0 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20  fp=stp->bp;.    
146c0 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
146d0 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e 63        cfp=stp->c
146e0 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63  fp;.    while( c
146f0 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  fp ){.      char
14700 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20   buf[20];.      
14710 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66  if( cfp->dot==cf
14720 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20  p->rp->nrhs ){. 
14730 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 62         sprintf(b
14740 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e 72  uf,"(%d)",cfp->r
14750 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
14760 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
14770 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a 20     %5s ",buf);. 
14780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14790 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
147a0 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20 20            ");.  
147b0 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66      }.      Conf
147c0 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29 3b  igPrint(fp,cfp);
147d0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
147e0 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 64 65 66 20  p,"\n");.#ifdef 
147f0 54 45 53 54 0a 20 20 20 20 20 20 53 65 74 50 72  TEST.      SetPr
14800 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 77 73 2c  int(fp,cfp->fws,
14810 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20 50 6c 69  lemp);.      Pli
14820 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e  nkPrint(fp,cfp->
14830 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b 0a 20 20  fplp,"To  ");.  
14840 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66      PlinkPrint(f
14850 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22 46 72 6f  p,cfp->bplp,"Fro
14860 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  m");.#endif.    
14870 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69    if( lemp->basi
14880 73 66 6c 61 67 20 29 20 63 66 70 3d 63 66 70 2d  sflag ) cfp=cfp-
14890 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c 73 65 20  >bp;.      else 
148a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148b0 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a   cfp=cfp->next;.
148c0 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
148d0 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20  f(fp,"\n");.    
148e0 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
148f0 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
14900 7b 0a 20 20 20 20 20 20 69 66 28 20 50 72 69 6e  {.      if( Prin
14910 74 41 63 74 69 6f 6e 28 61 70 2c 66 70 2c 33 30  tAction(ap,fp,30
14920 29 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22  ) ) fprintf(fp,"
14930 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
14940 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
14950 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
14960 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  p);.  return;.}.
14970 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74  ./* Search for t
14980 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20 77  he file "name" w
14990 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20 73  hich is in the s
149a0 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
149b0 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61 62  .** the exacutab
149c0 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  le */.PRIVATE ch
149d0 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28 61  ar *pathsearch(a
149e0 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d 61  rgv0,name,modema
149f0 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76 30 3b  sk).char *argv0;
14a00 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e 74  .char *name;.int
14a10 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20 63   modemask;.{.  c
14a20 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20  har *pathlist;. 
14a30 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b   char *path,*cp;
14a40 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 65 78 74  .  char c;.  ext
14a50 65 72 6e 20 69 6e 74 20 61 63 63 65 73 73 28 29  ern int access()
14a60 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33  ;..#ifdef __WIN3
14a70 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72 63  2__.  cp = strrc
14a80 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b 0a  hr(argv0,'\\');.
14a90 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74 72  #else.  cp = str
14aa0 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29 3b  rchr(argv0,'/');
14ab0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63 70  .#endif.  if( cp
14ac0 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b   ){.    c = *cp;
14ad0 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  .    *cp = 0;.  
14ae0 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a    path = (char *
14af0 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28  )malloc( strlen(
14b00 61 72 67 76 30 29 20 2b 20 73 74 72 6c 65 6e 28  argv0) + strlen(
14b10 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20 20 20  name) + 2 );.   
14b20 20 69 66 28 20 70 61 74 68 20 29 20 73 70 72 69   if( path ) spri
14b30 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22  ntf(path,"%s/%s"
14b40 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20 20  ,argv0,name);.  
14b50 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65 6c    *cp = c;.  }el
14b60 73 65 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 63  se{.    extern c
14b70 68 61 72 20 2a 67 65 74 65 6e 76 28 29 3b 0a 20  har *getenv();. 
14b80 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20 67 65     pathlist = ge
14b90 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a 20 20  tenv("PATH");.  
14ba0 20 20 69 66 28 20 70 61 74 68 6c 69 73 74 3d 3d    if( pathlist==
14bb0 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22  0 ) pathlist = "
14bc0 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22  .:/bin:/usr/bin"
14bd0 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68  ;.    path = (ch
14be0 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72  ar *)malloc( str
14bf0 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b 73 74  len(pathlist)+st
14c00 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a  rlen(name)+2 );.
14c10 20 20 20 20 69 66 28 20 70 61 74 68 21 3d 30 20      if( path!=0 
14c20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
14c30 2a 70 61 74 68 6c 69 73 74 20 29 7b 0a 20 20 20  *pathlist ){.   
14c40 20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68 72       cp = strchr
14c50 28 70 61 74 68 6c 69 73 74 2c 27 3a 27 29 3b 0a  (pathlist,':');.
14c60 20 20 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d          if( cp==
14c70 30 20 29 20 63 70 20 3d 20 26 70 61 74 68 6c 69  0 ) cp = &pathli
14c80 73 74 5b 73 74 72 6c 65 6e 28 70 61 74 68 6c 69  st[strlen(pathli
14c90 73 74 29 5d 3b 0a 20 20 20 20 20 20 20 20 63 20  st)];.        c 
14ca0 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20 2a  = *cp;.        *
14cb0 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  cp = 0;.        
14cc0 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
14cd0 2f 25 73 22 2c 70 61 74 68 6c 69 73 74 2c 6e 61  /%s",pathlist,na
14ce0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63 70  me);.        *cp
14cf0 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66   = c;.        if
14d00 28 20 63 3d 3d 30 20 29 20 70 61 74 68 6c 69 73  ( c==0 ) pathlis
14d10 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  t = "";.        
14d20 65 6c 73 65 20 70 61 74 68 6c 69 73 74 20 3d 20  else pathlist = 
14d30 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  &cp[1];.        
14d40 69 66 28 20 61 63 63 65 73 73 28 70 61 74 68 2c  if( access(path,
14d50 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62  modemask)==0 ) b
14d60 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
14d70 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
14d80 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76   path;.}../* Giv
14d90 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f  en an action, co
14da0 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65 67 65  mpute the intege
14db0 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74  r value for that
14dc0 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68   action.** which
14dd0 20 69 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e   is to be put in
14de0 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
14df0 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  e of the generat
14e00 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52  ed machine..** R
14e10 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69  eturn negative i
14e20 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75  f no action shou
14e30 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e  ld be generated.
14e40 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20  .*/.PRIVATE int 
14e50 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
14e60 65 6d 70 2c 61 70 29 0a 73 74 72 75 63 74 20 6c  emp,ap).struct l
14e70 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72 75  emon *lemp;.stru
14e80 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 7b  ct action *ap;.{
14e90 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20 73 77  .  int act;.  sw
14ea0 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29  itch( ap->type )
14eb0 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54  {.    case SHIFT
14ec0 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73  :  act = ap->x.s
14ed0 74 70 2d 3e 69 6e 64 65 78 3b 20 20 20 20 20 20  tp->index;      
14ee0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14ef0 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45 3a      case REDUCE:
14f00 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70 2d   act = ap->x.rp-
14f10 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d 3e 6e  >index + lemp->n
14f20 73 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a 20 20  state; break;.  
14f30 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20 20 61    case ERROR:  a
14f40 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ct = lemp->nstat
14f50 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b  e + lemp->nrule;
14f60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14f70 63 61 73 65 20 41 43 43 45 50 54 3a 20 61 63 74  case ACCEPT: act
14f80 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20   = lemp->nstate 
14f90 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20  + lemp->nrule + 
14fa0 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  1; break;.    de
14fb0 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20 3d  fault:     act =
14fc0 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   -1; break;.  }.
14fd0 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a    return act;.}.
14fe0 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a  .#define LINESIZ
14ff0 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65  E 1000./* The ne
15000 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72 6f  xt cluster of ro
15010 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20 72  utines are for r
15020 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70 6c  eading the templ
15030 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20  ate file.** and 
15040 77 72 69 74 69 6e 67 20 74 68 65 20 72 65 73 75  writing the resu
15050 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65 72  lts to the gener
15060 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f  ated parser */./
15070 2a 20 54 68 65 20 66 69 72 73 74 20 66 75 6e 63  * The first func
15080 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20 64  tion transfers d
15090 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f  ata from "in" to
150a0 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20   "out" until.** 
150b0 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20 77  a line is seen w
150c0 68 69 63 68 20 62 65 67 69 6e 73 20 77 69 74 68  hich begins with
150d0 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e 65   "%%".  The line
150e0 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72   number is.** tr
150f0 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  acked..**.** if 
15100 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e  name!=0, then an
15110 79 20 77 6f 72 64 20 74 68 61 74 20 62 65 67 69  y word that begi
15120 6e 20 77 69 74 68 20 22 50 61 72 73 65 22 20 69  n with "Parse" i
15130 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20  s changed to.** 
15140 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65  begin with *name
15150 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49   instead..*/.PRI
15160 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 78  VATE void tplt_x
15170 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  fer(name,in,out,
15180 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20 2a 6e 61  lineno).char *na
15190 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b 0a 46 49  me;.FILE *in;.FI
151a0 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 2a 6c 69  LE *out;.int *li
151b0 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c  neno;.{.  int i,
151c0 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61 72 20   iStart;.  char 
151d0 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  line[LINESIZE];.
151e0 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 6c    while( fgets(l
151f0 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29  ine,LINESIZE,in)
15200 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d 27 25   && (line[0]!='%
15210 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27 25  ' || line[1]!='%
15220 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69 6e 65  ') ){.    (*line
15230 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74 61 72  no)++;.    iStar
15240 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e  t = 0;.    if( n
15250 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ame ){.      for
15260 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69  (i=0; line[i]; i
15270 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
15280 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20 26 26   line[i]=='P' &&
15290 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65 5b 69   strncmp(&line[i
152a0 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d 30 0a  ],"Parse",5)==0.
152b0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69 3d            && (i=
152c0 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61 28 6c  =0 || !isalpha(l
152d0 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20 20 20  ine[i-1])).     
152e0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
152f0 69 66 28 20 69 3e 69 53 74 61 72 74 20 29 20 66  if( i>iStart ) f
15300 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73  printf(out,"%.*s
15310 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69 6e 65  ",i-iStart,&line
15320 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20 20 20  [iStart]);.     
15330 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15340 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20 20 20  ,"%s",name);.   
15350 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20         i += 4;. 
15360 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20           iStart 
15370 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d  = i+1;.        }
15380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15390 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
153a0 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74  %s",&line[iStart
153b0 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68  ]);.  }.}../* Th
153c0 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20  e next function 
153d0 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70 6c 61  finds the templa
153e0 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  te file and open
153f0 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e 67 0a  s it, returning.
15400 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
15410 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 2e  the opened file.
15420 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c 45   */.PRIVATE FILE
15430 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70   *tplt_open(lemp
15440 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
15450 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61 74 69 63  lemp;.{.  static
15460 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65 6e 61   char templatena
15470 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e 63  me[] = "lempar.c
15480 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30  ";.  char buf[10
15490 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  00];.  FILE *in;
154a0 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e 61 6d  .  char *tpltnam
154b0 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a  e;.  char *cp;..
154c0 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 6c    cp = strrchr(l
154d0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e  emp->filename,'.
154e0 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 7b 0a  ');.  if( cp ){.
154f0 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c      sprintf(buf,
15500 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74 29 28  "%.*s.lt",(int)(
15510 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  cp-lemp->filenam
15520 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  e),lemp->filenam
15530 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
15540 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25 73   sprintf(buf,"%s
15550 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  .lt",lemp->filen
15560 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ame);.  }.  if( 
15570 61 63 63 65 73 73 28 62 75 66 2c 30 30 34 29 3d  access(buf,004)=
15580 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61  =0 ){.    tpltna
15590 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65 6c 73  me = buf;.  }els
155a0 65 20 69 66 28 20 61 63 63 65 73 73 28 74 65 6d  e if( access(tem
155b0 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d  platename,004)==
155c0 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d  0 ){.    tpltnam
155d0 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65  e = templatename
155e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
155f0 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68 73 65  pltname = pathse
15600 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67 76 30  arch(lemp->argv0
15610 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 29  ,templatename,0)
15620 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 70 6c 74  ;.  }.  if( tplt
15630 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  name==0 ){.    f
15640 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
15650 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70 61  an't find the pa
15660 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d 70  rser driver temp
15670 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
15680 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70 6c 61  .\n",.    templa
15690 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  tename);.    lem
156a0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
156b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
156c0 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 74 70  .  in = fopen(tp
156d0 6c 74 6e 61 6d 65 2c 22 72 22 29 3b 0a 20 20 69  ltname,"r");.  i
156e0 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
156f0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
15700 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74  Can't open the t
15710 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
15720 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61 74 65  s\".\n",template
15730 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  name);.    lemp-
15740 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
15750 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
15760 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f   return in;.}../
15770 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e 67  * Print a string
15780 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e 64   to the file and
15790 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e 75   keep the linenu
157a0 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74 65 20  mber up to date 
157b0 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
157c0 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
157d0 65 6d 70 2c 73 74 72 2c 73 74 72 6c 6e 2c 6c 69  emp,str,strln,li
157e0 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  neno).FILE *out;
157f0 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
15800 65 6d 70 3b 0a 63 68 61 72 20 2a 73 74 72 3b 0a  emp;.char *str;.
15810 69 6e 74 20 73 74 72 6c 6e 3b 0a 69 6e 74 20 2a  int strln;.int *
15820 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 66 28 20  lineno;.{.  if( 
15830 73 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  str==0 ) return;
15840 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
15850 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
15860 6e 22 2c 73 74 72 6c 6e 2c 6c 65 6d 70 2d 3e 66  n",strln,lemp->f
15870 69 6c 65 6e 61 6d 65 29 3b 20 28 2a 6c 69 6e 65  ilename); (*line
15880 6e 6f 29 2b 2b 3b 0a 20 20 77 68 69 6c 65 28 20  no)++;.  while( 
15890 2a 73 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20  *str ){.    if( 
158a0 2a 73 74 72 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c  *str=='\n' ) (*l
158b0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 70 75  ineno)++;.    pu
158c0 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20 20  tc(*str,out);.  
158d0 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 66    str++;.  }.  f
158e0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 23 6c  printf(out,"\n#l
158f0 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22  ine %d \"%s\"\n"
15900 2c 2a 6c 69 6e 65 6e 6f 2b 32 2c 6c 65 6d 70 2d  ,*lineno+2,lemp-
15910 3e 6f 75 74 6e 61 6d 65 29 3b 20 28 2a 6c 69 6e  >outname); (*lin
15920 65 6e 6f 29 2b 3d 32 3b 0a 20 20 72 65 74 75 72  eno)+=2;.  retur
15930 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  n;.}../*.** The 
15940 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
15950 65 20 65 6d 69 74 73 20 63 6f 64 65 20 66 6f 72  e emits code for
15960 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
15970 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f  for the.** symbo
15980 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69  l sp.*/.void emi
15990 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
159a0 65 28 6f 75 74 2c 73 70 2c 6c 65 6d 70 2c 6c 69  e(out,sp,lemp,li
159b0 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  neno).FILE *out;
159c0 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
159d0 73 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  sp;.struct lemon
159e0 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e   *lemp;.int *lin
159f0 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72 20 2a 63 70  eno;.{. char *cp
15a00 20 3d 20 30 3b 0a 0a 20 69 6e 74 20 6c 69 6e 65   = 0;.. int line
15a10 63 6e 74 20 3d 20 30 3b 0a 20 69 66 28 20 73 70  cnt = 0;. if( sp
15a20 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
15a30 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70   ){.   cp = lemp
15a40 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20  ->tokendest;.   
15a50 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75  if( cp==0 ) retu
15a60 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  rn;.   fprintf(o
15a70 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25  ut,"#line %d \"%
15a80 73 5c 22 5c 6e 7b 22 2c 6c 65 6d 70 2d 3e 74 6f  s\"\n{",lemp->to
15a90 6b 65 6e 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e  kendestln,lemp->
15aa0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73  filename);. }els
15ab0 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75  e if( sp->destru
15ac0 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20  ctor ){.   cp = 
15ad0 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
15ae0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
15af0 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
15b00 6e 7b 22 2c 73 70 2d 3e 64 65 73 74 72 75 63 74  n{",sp->destruct
15b10 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  orln,lemp->filen
15b20 61 6d 65 29 3b 0a 20 7d 65 6c 73 65 20 69 66 28  ame);. }else if(
15b30 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
15b40 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  {.   cp = lemp->
15b50 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20  vardest;.   if( 
15b60 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
15b70 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
15b80 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
15b90 6e 7b 22 2c 6c 65 6d 70 2d 3e 76 61 72 64 65 73  n{",lemp->vardes
15ba0 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  tln,lemp->filena
15bb0 6d 65 29 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20  me);. }else{.   
15bc0 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a  assert( 0 );  /*
15bd0 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a   Cannot happen *
15be0 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b  /. }. for(; *cp;
15bf0 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a   cp++){.   if( *
15c00 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b 31 5d  cp=='$' && cp[1]
15c10 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 66 70  =='$' ){.     fp
15c20 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79 70 6d  rintf(out,"(yypm
15c30 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d  inor->yy%d)",sp-
15c40 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70  >dtnum);.     cp
15c50 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75  ++;.     continu
15c60 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28 20 2a  e;.   }.   if( *
15c70 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 63  cp=='\n' ) linec
15c80 6e 74 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28 2a  nt++;.   fputc(*
15c90 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 28 2a 6c  cp,out);. }. (*l
15ca0 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b 20 6c 69  ineno) += 3 + li
15cb0 6e 65 63 6e 74 3b 0a 20 66 70 72 69 6e 74 66 28  necnt;. fprintf(
15cc0 6f 75 74 2c 22 7d 5c 6e 23 6c 69 6e 65 20 25 64  out,"}\n#line %d
15cd0 20 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c 69 6e 65   \"%s\"\n",*line
15ce0 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  no,lemp->outname
15cf0 29 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  );. return;.}../
15d00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
15d10 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74   (non-zero) if t
15d20 68 65 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20  he given symbol 
15d30 68 61 73 20 61 20 64 65 73 74 72 75 63 74 6f 72  has a destructor
15d40 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73  ..*/.int has_des
15d50 74 72 75 63 74 6f 72 28 73 70 2c 20 6c 65 6d 70  tructor(sp, lemp
15d60 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  ).struct symbol 
15d70 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  *sp;.struct lemo
15d80 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
15d90 20 72 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e   ret;.  if( sp->
15da0 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29  type==TERMINAL )
15db0 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70  {.    ret = lemp
15dc0 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a  ->tokendest!=0;.
15dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
15de0 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74   = lemp->vardest
15df0 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72  !=0 || sp->destr
15e00 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20  uctor!=0;.  }.  
15e10 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
15e20 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74  *.** Append text
15e30 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
15e40 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
15e50 6e 67 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73  ng.  If zText is
15e60 20 30 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74   0 then.** reset
15e70 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62   the string to b
15e80 65 20 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20  e empty again.  
15e90 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
15ea0 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a  e complete text.
15eb0 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ** of the string
15ec0 20 28 77 68 69 63 68 20 69 73 20 6f 76 65 72 77   (which is overw
15ed0 72 69 74 74 65 6e 20 77 69 74 68 20 65 61 63 68  ritten with each
15ee0 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20   call)..**.** n 
15ef0 62 79 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61  bytes of zText a
15f00 72 65 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e  re stored.  If n
15f10 3d 3d 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20  ==0 then all of 
15f20 7a 54 65 78 74 20 75 70 20 74 6f 20 74 68 65 20  zText up to the 
15f30 66 69 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65  first.** \000 te
15f40 72 6d 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72  rminator is stor
15f50 65 64 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63  ed.  zText can c
15f60 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f  ontain up to two
15f70 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a   instances of.**
15f80 20 25 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73   %d.  The values
15f90 20 6f 66 20 70 31 20 61 6e 64 20 70 32 20 61 72   of p1 and p2 ar
15fa0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
15fb0 68 65 20 66 69 72 73 74 20 61 6e 64 20 73 65 63  he first and sec
15fc0 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a  ond.** %d..**.**
15fd0 20 49 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20   If n==-1, then 
15fe0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 61  the previous cha
15ff0 72 61 63 74 65 72 20 69 73 20 6f 76 65 72 77 72  racter is overwr
16000 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  itten..*/.PRIVAT
16010 45 20 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73  E char *append_s
16020 74 72 28 63 68 61 72 20 2a 7a 54 65 78 74 2c 20  tr(char *zText, 
16030 69 6e 74 20 6e 2c 20 69 6e 74 20 70 31 2c 20 69  int n, int p1, i
16040 6e 74 20 70 32 29 7b 0a 20 20 73 74 61 74 69 63  nt p2){.  static
16050 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
16060 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
16070 65 64 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ed = 0;.  static
16080 20 69 6e 74 20 75 73 65 64 20 3d 20 30 3b 0a 20   int used = 0;. 
16090 20 69 6e 74 20 69 2c 20 63 3b 0a 20 20 63 68 61   int i, c;.  cha
160a0 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a 0a 20 20 69  r zInt[40];..  i
160b0 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20  f( zText==0 ){. 
160c0 20 20 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20     used = 0;.   
160d0 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20   return z;.  }. 
160e0 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20 20   if( n<=0 ){.   
160f0 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
16100 20 20 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20 20    used += n;.   
16110 20 20 20 61 73 73 65 72 74 28 20 75 73 65 64 3e     assert( used>
16120 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
16130 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 78 74  n = strlen(zText
16140 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 2b 73  );.  }.  if( n+s
16150 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73  izeof(zInt)*2+us
16160 65 64 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29 7b  ed >= alloced ){
16170 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20 6e  .    alloced = n
16180 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a   + sizeof(zInt)*
16190 32 20 2b 20 75 73 65 64 20 2b 20 32 30 30 3b 0a  2 + used + 200;.
161a0 20 20 20 20 7a 20 3d 20 72 65 61 6c 6c 6f 63 28      z = realloc(
161b0 7a 2c 20 20 61 6c 6c 6f 63 65 64 29 3b 0a 20 20  z,  alloced);.  
161c0 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  }.  if( z==0 ) r
161d0 65 74 75 72 6e 20 22 22 3b 0a 20 20 77 68 69 6c  eturn "";.  whil
161e0 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
161f0 20 20 63 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29    c = *(zText++)
16200 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27  ;.    if( c=='%'
16210 20 26 26 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 64   && zText[0]=='d
16220 27 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  ' ){.      sprin
16230 74 66 28 7a 49 6e 74 2c 20 22 25 64 22 2c 20 70  tf(zInt, "%d", p
16240 31 29 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 70  1);.      p1 = p
16250 32 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  2;.      strcpy(
16260 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b  &z[used], zInt);
16270 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 73  .      used += s
16280 74 72 6c 65 6e 28 26 7a 5b 75 73 65 64 5d 29 3b  trlen(&z[used]);
16290 0a 20 20 20 20 20 20 7a 54 65 78 74 2b 2b 3b 0a  .      zText++;.
162a0 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d        n--;.    }
162b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 75 73  else{.      z[us
162c0 65 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d  ed++] = c;.    }
162d0 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64 5d 20 3d  .  }.  z[used] =
162e0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a   0;.  return z;.
162f0 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 43 6f 64 65 20 69  }../*.** zCode i
16300 73 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  s a string that 
16310 69 73 20 74 68 65 20 61 63 74 69 6f 6e 20 61 73  is the action as
16320 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
16330 72 75 6c 65 2e 20 20 45 78 70 61 6e 64 0a 2a 2a  rule.  Expand.**
16340 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20   the symbols in 
16350 74 68 69 73 20 73 74 72 69 6e 67 20 73 6f 20 74  this string so t
16360 68 61 74 20 74 68 65 20 72 65 66 65 72 20 74 6f  hat the refer to
16370 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
16380 20 70 61 72 73 65 72 0a 2a 2a 20 73 74 61 63 6b   parser.** stack
16390 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20  .  Return a new 
163a0 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e  string stored in
163b0 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
163c0 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  from malloc..*/.
163d0 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 74 72  PRIVATE char *tr
163e0 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73 74 72  anslate_code(str
163f0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
16400 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
16410 29 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a  ){.  char *cp, *
16420 78 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  xp;.  int i;.  c
16430 68 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b  har lhsused = 0;
16440 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
16450 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68  he LHS element h
16460 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a  as been used */.
16470 20 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52    char used[MAXR
16480 48 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66  HS];   /* True f
16490 6f 72 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d  or each RHS elem
164a0 65 6e 74 20 77 68 69 63 68 20 69 73 20 75 73 65  ent which is use
164b0 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  d */..  for(i=0;
164c0 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
164d0 29 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20  ) used[i] = 0;. 
164e0 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20   lhsused = 0;.. 
164f0 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c   append_str(0,0,
16500 30 2c 30 29 3b 0a 20 20 66 6f 72 28 63 70 3d 72  0,0);.  for(cp=r
16510 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70  p->code; *cp; cp
16520 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 73 61  ++){.    if( isa
16530 6c 70 68 61 28 2a 63 70 29 20 26 26 20 28 63 70  lpha(*cp) && (cp
16540 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20 28 21  ==rp->code || (!
16550 69 73 61 6c 6e 75 6d 28 63 70 5b 2d 31 5d 29 20  isalnum(cp[-1]) 
16560 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27 29 29  && cp[-1]!='_'))
16570 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 73   ){.      char s
16580 61 76 65 64 3b 0a 20 20 20 20 20 20 66 6f 72 28  aved;.      for(
16590 78 70 3d 20 26 63 70 5b 31 5d 3b 20 69 73 61 6c  xp= &cp[1]; isal
165a0 6e 75 6d 28 2a 78 70 29 20 7c 7c 20 2a 78 70 3d  num(*xp) || *xp=
165b0 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20 20 20  ='_'; xp++);.   
165c0 20 20 20 73 61 76 65 64 20 3d 20 2a 78 70 3b 0a     saved = *xp;.
165d0 20 20 20 20 20 20 2a 78 70 20 3d 20 30 3b 0a 20        *xp = 0;. 
165e0 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
165f0 61 6c 69 61 73 20 26 26 20 73 74 72 63 6d 70 28  alias && strcmp(
16600 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  cp,rp->lhsalias)
16610 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
16620 70 70 65 6e 64 5f 73 74 72 28 22 79 79 67 6f 74  ppend_str("yygot
16630 6f 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 72  ominor.yy%d",0,r
16640 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 2c 30 29  p->lhs->dtnum,0)
16650 3b 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 78  ;.        cp = x
16660 70 3b 0a 20 20 20 20 20 20 20 20 6c 68 73 75 73  p;.        lhsus
16670 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ed = 1;.      }e
16680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
16690 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
166a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
166b0 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69    if( rp->rhsali
166c0 61 73 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28  as[i] && strcmp(
166d0 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  cp,rp->rhsalias[
166e0 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])==0 ){.      
166f0 20 20 20 20 20 20 69 66 28 20 63 70 21 3d 72 70        if( cp!=rp
16700 2d 3e 63 6f 64 65 20 26 26 20 63 70 5b 2d 31 5d  ->code && cp[-1]
16710 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20 20 20 20  =='@' ){.       
16720 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
16730 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20   argument is of 
16740 74 68 65 20 66 6f 72 6d 20 40 58 20 74 68 65 6e  the form @X then
16750 20 73 75 62 73 74 69 74 75 74 65 64 0a 20 20 20   substituted.   
16760 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
16770 65 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72 20 6f  e token number o
16780 66 20 58 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c  f X, not the val
16790 75 65 20 6f 66 20 58 20 2a 2f 0a 20 20 20 20 20  ue of X */.     
167a0 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f           append_
167b0 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d  str("yymsp[%d].m
167c0 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d 3e 6e  ajor",-1,i-rp->n
167d0 72 68 73 2b 31 2c 30 29 3b 0a 20 20 20 20 20 20  rhs+1,0);.      
167e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
167f0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
16800 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d  d_str("yymsp[%d]
16810 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 0a  .minor.yy%d",0,.
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 20 20 20 20 20 20 69 2d 72 70 2d 3e 6e           i-rp->n
16840 72 68 73 2b 31 2c 72 70 2d 3e 72 68 73 5b 69 5d  rhs+1,rp->rhs[i]
16850 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  ->dtnum);.      
16860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16870 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
16880 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d           used[i]
16890 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
168a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
168b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
168c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70       }.      *xp
168d0 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a   = saved;.    }.
168e0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63      append_str(c
168f0 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  p, 1, 0, 0);.  }
16900 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a   /* End loop */.
16910 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  /* Check to m
16920 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c 48 53  ake sure the LHS
16930 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a   has been used *
16940 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61  /.  if( rp->lhsa
16950 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73 65 64  lias && !lhsused
16960 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
16970 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
16980 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
16990 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c      "Label \"%s\
169a0 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22  " for \"%s(%s)\"
169b0 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22   is never used."
169c0 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  ,.        rp->lh
169d0 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e  salias,rp->lhs->
169e0 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  name,rp->lhsalia
169f0 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  s);.    lemp->er
16a00 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20  rorcnt++;.  }.. 
16a10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73   /* Generate des
16a20 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72  tructor code for
16a30 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69   RHS symbols whi
16a40 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
16a50 69 6e 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75  in the.  ** redu
16a60 63 65 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72  ce code */.  for
16a70 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
16a80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
16a90 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
16aa0 26 26 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20  && !used[i] ){. 
16ab0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
16ac0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
16ad0 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
16ae0 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72     "Label %s for
16af0 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e   \"%s(%s)\" is n
16b00 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20  ever used.",.   
16b10 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
16b20 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  s[i],rp->rhs[i]-
16b30 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69  >name,rp->rhsali
16b40 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65  as[i]);.      le
16b50 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
16b60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70      }else if( rp
16b70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30  ->rhsalias[i]==0
16b80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61   ){.      if( ha
16b90 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d  s_destructor(rp-
16ba0 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b  >rhs[i],lemp) ){
16bb0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f  .        append_
16bc0 73 74 72 28 22 20 20 79 79 5f 64 65 73 74 72 75  str("  yy_destru
16bd0 63 74 6f 72 28 25 64 2c 26 79 79 6d 73 70 5b 25  ctor(%d,&yymsp[%
16be0 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30  d].minor);\n", 0
16bf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  ,.           rp-
16c00 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69  >rhs[i]->index,i
16c10 2d 72 70 2d 3e 6e 72 68 73 2b 31 29 3b 0a 20 20  -rp->nrhs+1);.  
16c20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16c30 20 20 20 2f 2a 20 4e 6f 20 64 65 73 74 72 75 63     /* No destruc
16c40 74 6f 72 20 64 65 66 69 6e 65 64 20 66 6f 72 20  tor defined for 
16c50 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20  this term */.   
16c60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
16c70 20 63 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72   cp = append_str
16c80 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 72 70 2d  (0,0,0,0);.  rp-
16c90 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28  >code = Strsafe(
16ca0 63 70 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47  cp);.}../* .** G
16cb0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
16cc0 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
16cd0 20 74 68 65 20 72 75 6c 65 20 22 72 70 22 20 69   the rule "rp" i
16ce0 73 20 72 65 64 75 63 65 64 2e 20 20 57 72 69 74  s reduced.  Writ
16cf0 65 0a 2a 2a 20 74 68 65 20 63 6f 64 65 20 74 6f  e.** the code to
16d00 20 22 6f 75 74 22 2e 20 20 4d 61 6b 65 20 73 75   "out".  Make su
16d10 72 65 20 6c 69 6e 65 6e 6f 20 73 74 61 79 73 20  re lineno stays 
16d20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50  up-to-date..*/.P
16d30 52 49 56 41 54 45 20 76 6f 69 64 20 65 6d 69 74  RIVATE void emit
16d40 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d  _code(out,rp,lem
16d50 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a  p,lineno).FILE *
16d60 6f 75 74 3b 0a 73 74 72 75 63 74 20 72 75 6c 65  out;.struct rule
16d70 20 2a 72 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d   *rp;.struct lem
16d80 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 2a 6c  on *lemp;.int *l
16d90 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72 20 2a  ineno;.{. char *
16da0 63 70 3b 0a 20 69 6e 74 20 6c 69 6e 65 63 6e 74  cp;. int linecnt
16db0 20 3d 20 30 3b 0a 0a 20 2f 2a 20 47 65 6e 65 72   = 0;.. /* Gener
16dc0 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74  ate code to do t
16dd0 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
16de0 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64   */. if( rp->cod
16df0 65 20 29 7b 0a 20 20 20 66 70 72 69 6e 74 66 28  e ){.   fprintf(
16e00 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22  out,"#line %d \"
16e10 25 73 5c 22 5c 6e 7b 22 2c 72 70 2d 3e 6c 69 6e  %s\"\n{",rp->lin
16e20 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  e,lemp->filename
16e30 29 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  );.   fprintf(ou
16e40 74 2c 22 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29  t,"%s",rp->code)
16e50 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e  ;.   for(cp=rp->
16e60 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29  code; *cp; cp++)
16e70 7b 0a 20 20 20 20 20 69 66 28 20 2a 63 70 3d 3d  {.     if( *cp==
16e80 27 5c 6e 27 20 29 20 6c 69 6e 65 63 6e 74 2b 2b  '\n' ) linecnt++
16e90 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f  ;.   } /* End lo
16ea0 6f 70 20 2a 2f 0a 20 20 20 28 2a 6c 69 6e 65 6e  op */.   (*linen
16eb0 6f 29 20 2b 3d 20 33 20 2b 20 6c 69 6e 65 63 6e  o) += 3 + linecn
16ec0 74 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  t;.   fprintf(ou
16ed0 74 2c 22 7d 5c 6e 23 6c 69 6e 65 20 25 64 20 5c  t,"}\n#line %d \
16ee0 22 25 73 5c 22 5c 6e 22 2c 2a 6c 69 6e 65 6e 6f  "%s\"\n",*lineno
16ef0 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  ,lemp->outname);
16f00 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 72  . } /* End if( r
16f10 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 72  p->code ) */.. r
16f20 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
16f30 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69  Print the defini
16f40 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f  tion of the unio
16f50 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70  n used for the p
16f60 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74 61  arser's data sta
16f70 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f  ck..** This unio
16f80 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64  n contains field
16f90 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73  s for every poss
16fa0 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20 66  ible data type f
16fb0 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64  or tokens.** and
16fc0 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20   nonterminals.  
16fd0 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  In the process o
16fe0 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20  f computing and 
16ff0 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a  printing this.**
17000 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74   union, also set
17010 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   the ".dtnum" fi
17020 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65 72  eld of every ter
17030 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72  minal and nonter
17040 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e  minal.** symbol.
17050 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73  .*/.void print_s
17060 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c  tack_union(out,l
17070 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c  emp,plineno,mhfl
17080 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 20 20  ag).FILE *out;  
17090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170a0 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 73 74  /* The output st
170b0 72 65 61 6d 20 2a 2f 0a 73 74 72 75 63 74 20 6c  ream */.struct l
170c0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20 20 20 20 20  emon *lemp;     
170d0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
170e0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66  info structure f
170f0 6f 72 20 74 68 69 73 20 70 61 72 73 65 72 20 2a  or this parser *
17100 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20  /.int *plineno; 
17110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17120 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
17130 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 69  line number */.i
17140 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 20  nt mhflag;      
17150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
17160 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67  ue if generating
17170 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74   makeheaders out
17180 70 75 74 20 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c  put */.{.  int l
17190 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f  ineno = *plineno
171a0 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65  ;    /* The line
171b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f   number of the o
171c0 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20  utput */.  char 
171d0 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20 20  **types;        
171e0 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74       /* A hash t
171f0 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65  able of datatype
17200 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79  s */.  int array
17210 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
17220 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
17230 22 74 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f  "types" array */
17240 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67  .  int maxdtleng
17250 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  th;          /* 
17260 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f  Maximum length o
17270 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65  f any ".datatype
17280 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68  " field. */.  ch
17290 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20  ar *stddt;      
172a0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64          /* Stand
172b0 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72  ardized name for
172c0 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20   a datatype */. 
172d0 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20   int i,j;       
172e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
172f0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
17300 20 69 6e 74 20 68 61 73 68 3b 20 20 20 20 20 20   int hash;      
17310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
17320 72 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61  r hashing the na
17330 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a  me of a type */.
17340 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20    char *name;   
17350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17360 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ame of the parse
17370 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  r */..  /* Alloc
17380 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
17390 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61  ze types[] and a
173a0 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20  llocate stddt[] 
173b0 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d  */.  arraysize =
173c0 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a   lemp->nsymbol *
173d0 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63   2;.  types = (c
173e0 68 61 72 2a 2a 29 6d 61 6c 6c 6f 63 28 20 61 72  har**)malloc( ar
173f0 72 61 79 73 69 7a 65 20 2a 20 73 69 7a 65 6f 66  raysize * sizeof
17400 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 66 6f 72  (char*) );.  for
17410 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a  (i=0; i<arraysiz
17420 65 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69 5d  e; i++) types[i]
17430 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65 6e   = 0;.  maxdtlen
17440 67 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6c  gth = 0;.  if( l
17450 65 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b 0a  emp->vartype ){.
17460 20 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20      maxdtlength 
17470 3d 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76  = strlen(lemp->v
17480 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66  artype);.  }.  f
17490 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
174a0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
174b0 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
174c0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
174d0 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
174e0 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  s[i];.    if( sp
174f0 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20  ->datatype==0 ) 
17500 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65  continue;.    le
17510 6e 20 3d 20 73 74 72 6c 65 6e 28 73 70 2d 3e 64  n = strlen(sp->d
17520 61 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66  atatype);.    if
17530 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74  ( len>maxdtlengt
17540 68 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  h ) maxdtlength 
17550 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64  = len;.  }.  std
17560 64 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c  dt = (char*)mall
17570 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a  oc( maxdtlength*
17580 32 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 74  2 + 1 );.  if( t
17590 79 70 65 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74  ypes==0 || stddt
175a0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
175b0 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
175c0 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20  f memory.\n");. 
175d0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
175e0 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61 20 68 61  .  /* Build a ha
175f0 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61  sh table of data
17600 74 79 70 65 73 2e 20 54 68 65 20 22 2e 64 74 6e  types. The ".dtn
17610 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 61 63  um" field of eac
17620 68 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73  h symbol.  ** is
17630 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
17640 74 68 65 20 68 61 73 68 20 69 6e 64 65 78 20 70  the hash index p
17650 6c 75 73 20 31 2e 20 20 41 20 22 2e 64 74 6e 75  lus 1.  A ".dtnu
17660 6d 22 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73  m" value of 0 is
17670 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74  .  ** used for t
17680 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e  erminal symbols.
17690 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
176a0 20 25 64 65 66 61 75 6c 74 5f 74 79 70 65 20 64   %default_type d
176b0 65 66 69 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a  efined then.  **
176c0 20 30 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20   0 is also used 
176d0 61 73 20 74 68 65 20 2e 64 74 6e 75 6d 20 76 61  as the .dtnum va
176e0 6c 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69  lue for nontermi
176f0 6e 61 6c 73 20 77 68 69 63 68 20 64 6f 20 6e 6f  nals which do no
17700 74 20 73 70 65 63 69 66 79 0a 20 20 2a 2a 20 61  t specify.  ** a
17710 20 64 61 74 61 74 79 70 65 20 75 73 69 6e 67 20   datatype using 
17720 74 68 65 20 25 74 79 70 65 20 64 69 72 65 63 74  the %type direct
17730 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ive..  */.  for(
17740 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
17750 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
17760 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
17770 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
17780 73 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  s[i];.    char *
17790 63 70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d  cp;.    if( sp==
177a0 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a  lemp->errsym ){.
177b0 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
177c0 3d 20 61 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20  = arraysize+1;. 
177d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
177e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 70 2d     }.    if( sp-
177f0 3e 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e  >type!=NONTERMIN
17800 41 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74  AL || (sp->datat
17810 79 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e  ype==0 && lemp->
17820 76 61 72 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20  vartype==0) ){. 
17830 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
17840 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
17850 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 70  ue;.    }.    cp
17860 20 3d 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3b   = sp->datatype;
17870 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29  .    if( cp==0 )
17880 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74   cp = lemp->vart
17890 79 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a  ype;.    j = 0;.
178a0 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
178b0 63 65 28 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a  ce(*cp) ) cp++;.
178c0 20 20 20 20 77 68 69 6c 65 28 20 2a 63 70 20 29      while( *cp )
178d0 20 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63   stddt[j++] = *c
178e0 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  p++;.    while( 
178f0 6a 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 73  j>0 && isspace(s
17900 74 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d  tddt[j-1]) ) j--
17910 3b 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d  ;.    stddt[j] =
17920 20 30 3b 0a 20 20 20 20 68 61 73 68 20 3d 20 30   0;.    hash = 0
17930 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73  ;.    for(j=0; s
17940 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  tddt[j]; j++){. 
17950 20 20 20 20 20 68 61 73 68 20 3d 20 68 61 73 68       hash = hash
17960 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a  *53 + stddt[j];.
17970 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d      }.    hash =
17980 20 28 68 61 73 68 20 26 20 30 78 37 66 66 66 66   (hash & 0x7ffff
17990 66 66 66 29 25 61 72 72 61 79 73 69 7a 65 3b 0a  fff)%arraysize;.
179a0 20 20 20 20 77 68 69 6c 65 28 20 74 79 70 65 73      while( types
179b0 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20 20  [hash] ){.      
179c0 69 66 28 20 73 74 72 63 6d 70 28 74 79 70 65 73  if( strcmp(types
179d0 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30  [hash],stddt)==0
179e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d 3e   ){.        sp->
179f0 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31  dtnum = hash + 1
17a00 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
17a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68  .      }.      h
17a20 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ash++;.      if(
17a30 20 68 61 73 68 3e 3d 61 72 72 61 79 73 69 7a 65   hash>=arraysize
17a40 20 29 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20   ) hash = 0;.   
17a50 20 7d 0a 20 20 20 20 69 66 28 20 74 79 70 65 73   }.    if( types
17a60 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20  [hash]==0 ){.   
17a70 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68     sp->dtnum = h
17a80 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 74  ash + 1;.      t
17a90 79 70 65 73 5b 68 61 73 68 5d 20 3d 20 28 63 68  ypes[hash] = (ch
17aa0 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c  ar*)malloc( strl
17ab0 65 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20  en(stddt)+1 );. 
17ac0 20 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68       if( types[h
17ad0 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ash]==0 ){.     
17ae0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
17af0 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
17b00 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65  .\n");.        e
17b10 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a  xit(1);.      }.
17b20 20 20 20 20 20 20 73 74 72 63 70 79 28 74 79 70        strcpy(typ
17b30 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3b  es[hash],stddt);
17b40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17b50 20 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20 64   Print out the d
17b60 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54  efinition of YYT
17b70 4f 4b 45 4e 54 59 50 45 20 61 6e 64 20 59 59 4d  OKENTYPE and YYM
17b80 49 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61  INORTYPE */.  na
17b90 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me = lemp->name 
17ba0 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22  ? lemp->name : "
17bb0 50 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f  Parse";.  lineno
17bc0 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69   = *plineno;.  i
17bd0 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72  f( mhflag ){ fpr
17be0 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e  intf(out,"#if IN
17bf0 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e  TERFACE\n"); lin
17c00 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e  eno++; }.  fprin
17c10 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
17c20 25 73 54 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e  %sTOKENTYPE %s\n
17c30 22 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70  ",name,.    lemp
17c40 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70  ->tokentype?lemp
17c50 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69  ->tokentype:"voi
17c60 64 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  d*");  lineno++;
17c70 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
17c80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65   fprintf(out,"#e
17c90 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
17ca0 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ++; }.  fprintf(
17cb0 6f 75 74 2c 22 74 79 70 65 64 65 66 20 75 6e 69  out,"typedef uni
17cc0 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  on {\n"); lineno
17cd0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
17ce0 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45  t,"  %sTOKENTYPE
17cf0 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20   yy0;\n",name); 
17d00 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28  lineno++;.  for(
17d10 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65  i=0; i<arraysize
17d20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
17d30 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f  types[i]==0 ) co
17d40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69  ntinue;.    fpri
17d50 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79  ntf(out,"  %s yy
17d60 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c  %d;\n",types[i],
17d70 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i+1); lineno++;.
17d80 20 20 20 20 66 72 65 65 28 74 79 70 65 73 5b 69      free(types[i
17d90 5d 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  ]);.  }.  fprint
17da0 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25  f(out,"  int yy%
17db0 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  d;\n",lemp->errs
17dc0 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65  ym->dtnum); line
17dd0 6e 6f 2b 2b 3b 0a 20 20 66 72 65 65 28 73 74 64  no++;.  free(std
17de0 64 74 29 3b 0a 20 20 66 72 65 65 28 74 79 70 65  dt);.  free(type
17df0 73 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  s);.  fprintf(ou
17e00 74 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45  t,"} YYMINORTYPE
17e10 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
17e20 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69  .  *plineno = li
17e30 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  neno;.}../*.** R
17e40 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
17e50 66 20 61 20 43 20 64 61 74 61 74 79 70 65 20 61  f a C datatype a
17e60 62 6c 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74  ble to represent
17e70 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 0a   values between.
17e80 2a 2a 20 6c 77 72 20 61 6e 64 20 75 70 72 2c 20  ** lwr and upr, 
17e90 69 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73 74  inclusive..*/.st
17ea0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
17eb0 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79  *minimum_size_ty
17ec0 70 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20  pe(int lwr, int 
17ed0 75 70 72 29 7b 0a 20 20 69 66 28 20 6c 77 72 3e  upr){.  if( lwr>
17ee0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75 70  =0 ){.    if( up
17ef0 72 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20 20 20  r<=255 ){.      
17f00 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64  return "unsigned
17f10 20 63 68 61 72 22 3b 0a 20 20 20 20 7d 65 6c 73   char";.    }els
17f20 65 20 69 66 28 20 75 70 72 3c 36 35 35 33 35 20  e if( upr<65535 
17f30 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17f40 22 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20  "unsigned short 
17f50 69 6e 74 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  int";.    }else{
17f60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75  .      return "u
17f70 6e 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20  nsigned int";.  
17f80 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
17f90 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20 75 70 72  lwr>=-127 && upr
17fa0 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 72 65 74  <=127 ){.    ret
17fb0 75 72 6e 20 22 73 69 67 6e 65 64 20 63 68 61 72  urn "signed char
17fc0 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  ";.  }else if( l
17fd0 77 72 3e 3d 2d 33 32 37 36 37 20 26 26 20 75 70  wr>=-32767 && up
17fe0 72 3c 33 32 37 36 37 20 29 7b 0a 20 20 20 20 72  r<32767 ){.    r
17ff0 65 74 75 72 6e 20 22 73 68 6f 72 74 22 3b 0a 20  eturn "short";. 
18000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
18010 72 6e 20 22 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a  rn "int";.  }.}.
18020 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61 74  ./*.** Each stat
18030 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 74  e contains a set
18040 20 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61   of token transa
18050 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 74 20  ction and a set 
18060 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61  of.** nontermina
18070 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  l transactions. 
18080 20 45 61 63 68 20 6f 66 20 74 68 65 73 65 20 73   Each of these s
18090 65 74 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73  ets makes an ins
180a0 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20  tance.** of the 
180b0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
180c0 75 72 65 2e 20 20 41 6e 20 61 72 72 61 79 20 6f  ure.  An array o
180d0 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
180e0 65 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  es is used.** to
180f0 20 6f 72 64 65 72 20 74 68 65 20 63 72 65 61 74   order the creat
18100 69 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ion of entries i
18110 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b  n the yy_action[
18120 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  ] table..*/.stru
18130 63 74 20 61 78 73 65 74 20 7b 0a 20 20 73 74 72  ct axset {.  str
18140 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
18150 20 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74    /* A pointer t
18160 6f 20 61 20 73 74 61 74 65 20 2a 2f 0a 20 20 69  o a state */.  i
18170 6e 74 20 69 73 54 6b 6e 3b 20 20 20 20 20 20 20  nt isTkn;       
18180 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75      /* True to u
18190 73 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73  se tokens.  Fals
181a0 65 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e  e for non-termin
181b0 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63  als */.  int nAc
181c0 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  tion;         /*
181d0 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f   Number of actio
181e0 6e 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ns */.};../*.** 
181f0 43 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65 74  Compare to axset
18200 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
18210 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
18220 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
18230 78 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e  xset_compare(con
18240 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73  st void *a, cons
18250 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74  t void *b){.  st
18260 72 75 63 74 20 61 78 73 65 74 20 2a 70 31 20 3d  ruct axset *p1 =
18270 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a 29   (struct axset*)
18280 61 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65  a;.  struct axse
18290 74 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74 20  t *p2 = (struct 
182a0 61 78 73 65 74 2a 29 62 3b 0a 20 20 72 65 74 75  axset*)b;.  retu
182b0 72 6e 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d  rn p2->nAction -
182c0 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 7d 0a   p1->nAction;.}.
182d0 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73  ./* Generate C s
182e0 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74  ource code for t
182f0 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69  he parser */.voi
18300 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28 6c 65  d ReportTable(le
18310 6d 70 2c 20 6d 68 66 6c 61 67 29 0a 73 74 72 75  mp, mhflag).stru
18320 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
18330 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20  int mhflag;     
18340 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b  /* Output in mak
18350 65 68 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20  eheaders format 
18360 69 66 20 74 72 75 65 20 2a 2f 0a 7b 0a 20 20 46  if true */.{.  F
18370 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20  ILE *out, *in;. 
18380 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
18390 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e  IZE];.  int  lin
183a0 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74  eno;.  struct st
183b0 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
183c0 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20  ct action *ap;. 
183d0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
183e0 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 74 61  ;.  struct actta
183f0 62 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e  b *pActtab;.  in
18400 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68 61  t i, j, n;.  cha
18410 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d  r *name;.  int m
18420 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f  nTknOfst, mxTknO
18430 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f  fst;.  int mnNtO
18440 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20  fst, mxNtOfst;. 
18450 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 61   struct axset *a
18460 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f  x;..  in = tplt_
18470 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66  open(lemp);.  if
18480 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( in==0 ) return
18490 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f  ;.  out = file_o
184a0 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77  pen(lemp,".c","w
184b0 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30  ");.  if( out==0
184c0 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69   ){.    fclose(i
184d0 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  n);.    return;.
184e0 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31    }.  lineno = 1
184f0 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
18500 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
18510 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
18520 47 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63  Generate the inc
18530 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e  lude code, if an
18540 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  y */.  tplt_prin
18550 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
18560 3e 69 6e 63 6c 75 64 65 2c 6c 65 6d 70 2d 3e 69  >include,lemp->i
18570 6e 63 6c 75 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f  ncludeln,&lineno
18580 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  );.  if( mhflag 
18590 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d  ){.    char *nam
185a0 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d  e = file_makenam
185b0 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20  e(lemp, ".h");. 
185c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
185d0 23 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c  #include \"%s\"\
185e0 6e 22 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  n", name); linen
185f0 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e 61  o++;.    free(na
18600 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  me);.  }.  tplt_
18610 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
18620 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
18630 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
18640 23 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c  #defines for all
18650 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28   tokens */.  if(
18660 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63   mhflag ){.    c
18670 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20  har *prefix;.   
18680 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
18690 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
186a0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69   lineno++;.    i
186b0 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
186c0 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
186d0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
186e0 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  x;.    else     
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18700 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20  refix = "";.    
18710 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
18720 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
18730 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
18740 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
18750 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
18760 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
18770 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
18780 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
18790 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
187a0 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b  out,"#endif\n");
187b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
187c0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
187d0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
187e0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
187f0 65 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65  erate the define
18800 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  s */.  fprintf(o
18810 75 74 2c 22 2f 2a 20 5c 30 30 31 20 2a 2f 5c 6e  ut,"/* \001 */\n
18820 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ");.  fprintf(ou
18830 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44  t,"#define YYCOD
18840 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20  ETYPE %s\n",.   
18850 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
18860 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d  pe(0, lemp->nsym
18870 62 6f 6c 2b 35 29 29 3b 20 6c 69 6e 65 6e 6f 2b  bol+5)); lineno+
18880 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
18890 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f  ,"#define YYNOCO
188a0 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e  DE %d\n",lemp->n
188b0 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65  symbol+1);  line
188c0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
188d0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41  out,"#define YYA
188e0 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c  CTIONTYPE %s\n",
188f0 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a  .    minimum_siz
18900 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e  e_type(0, lemp->
18910 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75  nstate+lemp->nru
18920 6c 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b  le+5));  lineno+
18930 2b 3b 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b  +;.  print_stack
18940 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c  _union(out,lemp,
18950 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b  &lineno,mhflag);
18960 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61  .  if( lemp->sta
18970 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  cksize ){.    if
18980 28 20 61 74 6f 69 28 6c 65 6d 70 2d 3e 73 74 61  ( atoi(lemp->sta
18990 63 6b 73 69 7a 65 29 3c 3d 30 20 29 7b 0a 20 20  cksize)<=0 ){.  
189a0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
189b0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22  p->filename,0,."
189c0 49 6c 6c 65 67 61 6c 20 73 74 61 63 6b 20 73 69  Illegal stack si
189d0 7a 65 3a 20 5b 25 73 5d 2e 20 20 54 68 65 20 73  ze: [%s].  The s
189e0 74 61 63 6b 20 73 69 7a 65 20 73 68 6f 75 6c 64  tack size should
189f0 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 63   be an integer c
18a00 6f 6e 73 74 61 6e 74 2e 22 2c 0a 20 20 20 20 20  onstant.",.     
18a10 20 20 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69     lemp->stacksi
18a20 7a 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  ze);.      lemp-
18a30 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
18a40 20 20 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69     lemp->stacksi
18a50 7a 65 20 3d 20 22 31 30 30 22 3b 0a 20 20 20 20  ze = "100";.    
18a60 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
18a70 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41  t,"#define YYSTA
18a80 43 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65  CKDEPTH %s\n",le
18a90 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20  mp->stacksize); 
18aa0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c   lineno++;.  }el
18ab0 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
18ac0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53  out,"#define YYS
18ad0 54 41 43 4b 44 45 50 54 48 20 31 30 30 5c 6e 22  TACKDEPTH 100\n"
18ae0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
18af0 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  }.  if( mhflag )
18b00 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
18b10 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45  t,"#if INTERFACE
18b20 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
18b30 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d    }.  name = lem
18b40 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e  p->name ? lemp->
18b50 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a  name : "Parse";.
18b60 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20    if( lemp->arg 
18b70 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20  && lemp->arg[0] 
18b80 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
18b90 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 6c 65 6d    i = strlen(lem
18ba0 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77 68 69  p->arg);.    whi
18bb0 6c 65 28 20 69 3e 3d 31 20 26 26 20 69 73 73 70  le( i>=1 && issp
18bc0 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d  ace(lemp->arg[i-
18bd0 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77  1]) ) i--;.    w
18be0 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28 69  hile( i>=1 && (i
18bf0 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72 67  salnum(lemp->arg
18c00 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e  [i-1]) || lemp->
18c10 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29  arg[i-1]=='_') )
18c20 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74   i--;.    fprint
18c30 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
18c40 73 41 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e  sARG_SDECL %s;\n
18c50 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67  ",name,lemp->arg
18c60 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
18c70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
18c80 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45  define %sARG_PDE
18c90 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c  CL ,%s\n",name,l
18ca0 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65  emp->arg);  line
18cb0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
18cc0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
18cd0 73 41 52 47 5f 46 45 54 43 48 20 25 73 20 3d 20  sARG_FETCH %s = 
18ce0 79 79 70 50 61 72 73 65 72 2d 3e 25 73 5c 6e 22  yypParser->%s\n"
18cf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18d00 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72     name,lemp->ar
18d10 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29  g,&lemp->arg[i])
18d20 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
18d30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
18d40 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52  efine %sARG_STOR
18d50 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 20  E yypParser->%s 
18d60 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  = %s\n",.       
18d70 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 26            name,&
18d80 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c 65  lemp->arg[i],&le
18d90 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69  mp->arg[i]);  li
18da0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  neno++;.  }else{
18db0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
18dc0 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
18dd0 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20  SDECL\n",name); 
18de0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
18df0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
18e00 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c 5c  ine %sARG_PDECL\
18e10 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e  n",name);  linen
18e20 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
18e30 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
18e40 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d  ARG_FETCH\n",nam
18e50 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
18e60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
18e70 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f  define %sARG_STO
18e80 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e  RE\n",name); lin
18e90 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  eno++;.  }.  if(
18ea0 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66   mhflag ){.    f
18eb0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64  printf(out,"#end
18ec0 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  if\n"); lineno++
18ed0 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
18ee0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
18ef0 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65 6d 70  STATE %d\n",lemp
18f00 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69 6e 65  ->nstate);  line
18f10 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
18f20 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
18f30 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d  RULE %d\n",lemp-
18f40 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e 6f  >nrule);  lineno
18f50 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
18f60 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52  t,"#define YYERR
18f70 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c 6c  ORSYMBOL %d\n",l
18f80 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e 64  emp->errsym->ind
18f90 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ex);  lineno++;.
18fa0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
18fb0 64 65 66 69 6e 65 20 59 59 45 52 52 53 59 4d 44  define YYERRSYMD
18fc0 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  T yy%d\n",lemp->
18fd0 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20  errsym->dtnum); 
18fe0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
18ff0 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62   lemp->has_fallb
19000 61 63 6b 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ack ){.    fprin
19010 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
19020 59 59 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29  YYFALLBACK 1\n")
19030 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
19040 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
19050 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
19060 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
19070 65 6e 65 72 61 74 65 20 74 68 65 20 61 63 74 69  enerate the acti
19080 6f 6e 20 74 61 62 6c 65 20 61 6e 64 20 69 74 73  on table and its
19090 20 61 73 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a   associates:.  *
190a0 2a 0a 20 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f  *.  **  yy_actio
190b0 6e 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69 6e  n[]        A sin
190c0 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  gle table contai
190d0 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73  ning all actions
190e0 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61  ..  **  yy_looka
190f0 68 65 61 64 5b 5d 20 20 20 20 20 41 20 74 61 62  head[]     A tab
19100 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
19110 65 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20  e lookahead for 
19120 65 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 20 20  each entry in.  
19130 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19140 20 20 20 20 20 20 20 79 79 5f 61 63 74 69 6f 6e         yy_action
19150 2e 20 20 55 73 65 64 20 74 6f 20 64 65 74 65 63  .  Used to detec
19160 74 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e  t hash collision
19170 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69 66  s..  **  yy_shif
19180 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72 20  t_ofst[]    For 
19190 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20  each state, the 
191a0 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61  offset into yy_a
191b0 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20  ction for.  **  
191c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
191d0 20 20 20 73 68 69 66 74 69 6e 67 20 74 65 72 6d     shifting term
191e0 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f  inals..  **  yy_
191f0 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20  reduce_ofst[]   
19200 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20  For each state, 
19210 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
19220 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20  yy_action for.  
19230 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19240 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67 20         shifting 
19250 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66  non-terminals af
19260 74 65 72 20 61 20 72 65 64 75 63 65 2e 0a 20 20  ter a reduce..  
19270 2a 2a 20 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d  **  yy_default[]
19280 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 20 61         Default a
19290 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73  ction for each s
192a0 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  tate..  */..  /*
192b0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74   Compute the act
192c0 69 6f 6e 73 20 6f 6e 20 61 6c 6c 20 73 74 61 74  ions on all stat
192d0 65 73 20 61 6e 64 20 63 6f 75 6e 74 20 74 68 65  es and count the
192e0 6d 20 75 70 20 2a 2f 0a 20 20 61 78 20 3d 20 6d  m up */.  ax = m
192f0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 78  alloc( sizeof(ax
19300 5b 30 5d 29 2a 6c 65 6d 70 2d 3e 6e 73 74 61 74  [0])*lemp->nstat
19310 65 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 78 3d  e*2 );.  if( ax=
19320 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
19330 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63  f(stderr,"malloc
19340 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20   failed\n");.   
19350 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
19360 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
19370 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
19380 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
19390 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74  orted[i];.    st
193a0 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70  p->nTknAct = stp
193b0 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20  ->nNtAct = 0;.  
193c0 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 6c    stp->iDflt = l
193d0 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
193e0 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 73  mp->nrule;.    s
193f0 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e  tp->iTknOfst = N
19400 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74  O_OFFSET;.    st
19410 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f  p->iNtOfst = NO_
19420 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28  OFFSET;.    for(
19430 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
19440 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
19450 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74 65 5f      if( compute_
19460 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e  action(lemp,ap)>
19470 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
19480 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c  ( ap->sp->index<
19490 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
194a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70  ){.          stp
194b0 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20  ->nTknAct++;.   
194c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
194d0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d  p->sp->index<lem
194e0 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20  p->nsymbol ){.  
194f0 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74          stp->nNt
19500 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Act++;.        }
19510 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
19520 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f 6d  stp->iDflt = com
19530 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
19540 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  , ap);.        }
19550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19560 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20 3d     ax[i*2].stp =
19570 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32   stp;.    ax[i*2
19580 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20 20  ].isTkn = 1;.   
19590 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e   ax[i*2].nAction
195a0 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b   = stp->nTknAct;
195b0 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 73  .    ax[i*2+1].s
195c0 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78  tp = stp;.    ax
195d0 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20  [i*2+1].isTkn = 
195e0 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d  0;.    ax[i*2+1]
195f0 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e  .nAction = stp->
19600 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d 78  nNtAct;.  }.  mx
19610 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f  TknOfst = mnTknO
19620 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f  fst = 0;.  mxNtO
19630 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d  fst = mnNtOfst =
19640 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   0;..  /* Comput
19650 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  e the action tab
19660 6c 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  le.  In order to
19670 20 74 72 79 20 74 6f 20 6b 65 65 70 20 74 68 65   try to keep the
19680 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 20 20 2a   size of the.  *
19690 2a 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 74  * action table t
196a0 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 74 68 65  o a minimum, the
196b0 20 68 65 75 72 69 73 74 69 63 20 6f 66 20 70 6c   heuristic of pl
196c0 61 63 69 6e 67 20 74 68 65 20 6c 61 72 67 65 73  acing the larges
196d0 74 20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 73 65  t action.  ** se
196e0 74 73 20 66 69 72 73 74 20 69 73 20 75 73 65 64  ts first is used
196f0 2e 0a 20 20 2a 2f 0a 20 20 71 73 6f 72 74 28 61  ..  */.  qsort(a
19700 78 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a  x, lemp->nstate*
19710 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29  2, sizeof(ax[0])
19720 2c 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 29  , axset_compare)
19730 3b 0a 20 20 70 41 63 74 74 61 62 20 3d 20 61 63  ;.  pActtab = ac
19740 74 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20  ttab_alloc();.  
19750 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
19760 3e 6e 73 74 61 74 65 2a 32 20 26 26 20 61 78 5b  >nstate*2 && ax[
19770 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b  i].nAction>0; i+
19780 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 61 78  +){.    stp = ax
19790 5b 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69 66 28  [i].stp;.    if(
197a0 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a   ax[i].isTkn ){.
197b0 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70        for(ap=stp
197c0 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
197d0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
197e0 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  int action;.    
197f0 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
19800 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65  index>=lemp->nte
19810 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75  rminal ) continu
19820 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f  e;.        actio
19830 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  n = compute_acti
19840 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20  on(lemp, ap);.  
19850 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e        if( action
19860 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
19870 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63         acttab_ac
19880 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70  tion(pActtab, ap
19890 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74  ->sp->index, act
198a0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ion);.      }.  
198b0 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73      stp->iTknOfs
198c0 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72  t = acttab_inser
198d0 74 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20  t(pActtab);.    
198e0 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f    if( stp->iTknO
198f0 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20  fst<mnTknOfst ) 
19900 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d  mnTknOfst = stp-
19910 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20  >iTknOfst;.     
19920 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66   if( stp->iTknOf
19930 73 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d  st>mxTknOfst ) m
19940 78 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e  xTknOfst = stp->
19950 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65  iTknOfst;.    }e
19960 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 61  lse{.      for(a
19970 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
19980 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
19990 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b       int action;
199a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
199b0 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
199c0 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e  >nterminal ) con
199d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
199e0 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
199f0 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  ==lemp->nsymbol 
19a00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
19a10 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d      action = com
19a20 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
19a30 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69  , ap);.        i
19a40 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f  f( action<0 ) co
19a50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
19a60 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41  acttab_action(pA
19a70 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69  cttab, ap->sp->i
19a80 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20  ndex, action);. 
19a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70       }.      stp
19aa0 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63 74 74  ->iNtOfst = actt
19ab0 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61  ab_insert(pActta
19ac0 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  b);.      if( st
19ad0 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f  p->iNtOfst<mnNtO
19ae0 66 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d  fst ) mnNtOfst =
19af0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20   stp->iNtOfst;. 
19b00 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e       if( stp->iN
19b10 74 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29  tOfst>mxNtOfst )
19b20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d   mxNtOfst = stp-
19b30 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a  >iNtOfst;.    }.
19b40 20 20 7d 0a 20 20 66 72 65 65 28 61 78 29 3b 0a    }.  free(ax);.
19b50 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
19b60 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65   yy_action table
19b70 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
19b80 74 2c 22 73 74 61 74 69 63 20 59 59 41 43 54 49  t,"static YYACTI
19b90 4f 4e 54 59 50 45 20 79 79 5f 61 63 74 69 6f 6e  ONTYPE yy_action
19ba0 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65  [] = {\n"); line
19bb0 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 61 63 74 74  no++;.  n = actt
19bc0 61 62 5f 73 69 7a 65 28 70 41 63 74 74 61 62 29  ab_size(pActtab)
19bd0 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
19be0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
19bf0 74 20 61 63 74 69 6f 6e 20 3d 20 61 63 74 74 61  t action = actta
19c00 62 5f 79 79 61 63 74 69 6f 6e 28 70 41 63 74 74  b_yyaction(pActt
19c10 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ab, i);.    if( 
19c20 61 63 74 69 6f 6e 3c 30 20 29 20 61 63 74 69 6f  action<0 ) actio
19c30 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  n = lemp->nsymbo
19c40 6c 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20  l + lemp->nrule 
19c50 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  + 2;.    if( j==
19c60 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
19c70 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
19c80 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
19c90 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 61 63 74  ut, " %4d,", act
19ca0 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  ion);.    if( j=
19cb0 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
19cc0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
19cd0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
19ce0 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
19cf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19d00 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
19d10 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
19d20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
19d30 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
19d40 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  the yy_lookahead
19d50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
19d60 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20  ntf(out,"static 
19d70 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f  YYCODETYPE yy_lo
19d80 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22  okahead[] = {\n"
19d90 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
19da0 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
19db0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20  ++){.    int la 
19dc0 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61  = acttab_yylooka
19dd0 68 65 61 64 28 70 41 63 74 74 61 62 2c 20 69 29  head(pActtab, i)
19de0 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29  ;.    if( la<0 )
19df0 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d   la = lemp->nsym
19e00 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  bol;.    if( j==
19e10 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
19e20 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
19e30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
19e40 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29  ut, " %4d,", la)
19e50 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
19e60 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
19e70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
19e80 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
19e90 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
19ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
19eb0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
19ec0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
19ed0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  n"); lineno++;..
19ee0 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
19ef0 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20  yy_shift_ofst[] 
19f00 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e  table */.  fprin
19f10 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
19f20 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46   YY_SHIFT_USE_DF
19f30 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b  LT (%d)\n", mnTk
19f40 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f  nOfst-1); lineno
19f50 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
19f60 74 2c 20 22 73 74 61 74 69 63 20 25 73 20 79 79  t, "static %s yy
19f70 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20  _shift_ofst[] = 
19f80 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  {\n", .         
19f90 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
19fa0 70 65 28 6d 6e 54 6b 6e 4f 66 73 74 2d 31 2c 20  pe(mnTknOfst-1, 
19fb0 6d 78 54 6b 6e 4f 66 73 74 29 29 3b 20 6c 69 6e  mxTknOfst)); lin
19fc0 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d  eno++;.  n = lem
19fd0 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72  p->nstate;.  for
19fe0 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
19ff0 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b  ){.    int ofst;
1a000 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1a010 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1a020 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  ofst = stp->iTkn
1a030 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66  Ofst;.    if( of
1a040 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
1a050 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74  ofst = mnTknOfst
1a060 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d   - 1;.    if( j=
1a070 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1a080 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1a090 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1a0a0 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66  out, " %4d,", of
1a0b0 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  st);.    if( j==
1a0c0 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1a0d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1a0e0 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1a0f0 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1a100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a110 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1a120 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1a130 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1a140 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1a150 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73  he yy_reduce_ofs
1a160 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  t[] table */.  f
1a170 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1a180 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55  fine YY_REDUCE_U
1a190 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c  SE_DFLT (%d)\n",
1a1a0 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69   mnNtOfst-1); li
1a1b0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1a1c0 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 25  f(out, "static %
1a1d0 73 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74  s yy_reduce_ofst
1a1e0 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20  [] = {\n", .    
1a1f0 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69        minimum_si
1a200 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74  ze_type(mnNtOfst
1a210 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 29 29 3b 20  -1, mxNtOfst)); 
1a220 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20  lineno++;.  n = 
1a230 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20  lemp->nstate;.  
1a240 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1a250 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66  i++){.    int of
1a260 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  st;.    stp = le
1a270 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
1a280 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69     ofst = stp->i
1a290 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20  NtOfst;.    if( 
1a2a0 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  ofst==NO_OFFSET 
1a2b0 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73  ) ofst = mnNtOfs
1a2c0 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a  t - 1;.    if( j
1a2d0 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1a2e0 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1a2f0 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1a300 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f  (out, " %4d,", o
1a310 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  fst);.    if( j=
1a320 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1a330 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1a340 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1a350 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1a360 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a370 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1a380 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1a390 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1a3a0 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1a3b0 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74 69  the default acti
1a3c0 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  on table */.  fp
1a3d0 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
1a3e0 69 63 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20  ic YYACTIONTYPE 
1a3f0 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b  yy_default[] = {
1a400 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1a410 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61    n = lemp->nsta
1a420 74 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  te;.  for(i=j=0;
1a430 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1a440 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
1a450 65 64 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 6a  ed[i];.    if( j
1a460 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1a470 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1a480 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1a490 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 73  (out, " %4d,", s
1a4a0 74 70 2d 3e 69 44 66 6c 74 29 3b 0a 20 20 20 20  tp->iDflt);.    
1a4b0 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
1a4c0 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
1a4d0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
1a4e0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1a4f0 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
1a500 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1a510 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
1a520 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
1a530 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f  ineno++;.  tplt_
1a540 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1a550 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1a560 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1a570 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66 61 6c  the table of fal
1a580 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20  lback tokens..  
1a590 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68  */.  if( lemp->h
1a5a0 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  as_fallback ){. 
1a5b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
1a5c0 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69  mp->nterminal; i
1a5d0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
1a5e0 74 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65  t symbol *p = le
1a5f0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
1a600 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61 6c        if( p->fal
1a610 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  lback==0 ){.    
1a620 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a630 20 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31 30   "    0,  /* %10
1a640 73 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c  s => nothing */\
1a650 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  n", p->name);.  
1a660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a670 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1a680 22 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30 73  "  %3d,  /* %10s
1a690 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d   => %s */\n", p-
1a6a0 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78  >fallback->index
1a6b0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ,.          p->n
1a6c0 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b  ame, p->fallback
1a6d0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  ->name);.      }
1a6e0 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  .      lineno++;
1a6f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c  .    }.  }.  tpl
1a700 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1a710 65 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e  e, in, out, &lin
1a720 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1a730 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e  rate a table con
1a740 74 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62  taining the symb
1a750 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76 65  olic name of eve
1a760 72 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20  ry symbol.  */. 
1a770 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1a780 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
1a790 0a 20 20 20 20 73 70 72 69 6e 74 66 28 6c 69 6e  .    sprintf(lin
1a7a0 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70  e,"\"%s\",",lemp
1a7b0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  ->symbols[i]->na
1a7c0 6d 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  me);.    fprintf
1a7d0 28 6f 75 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c  (out,"  %-15s",l
1a7e0 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28 69  ine);.    if( (i
1a7f0 26 33 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74  &3)==3 ){ fprint
1a800 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e  f(out,"\n"); lin
1a810 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69  eno++; }.  }.  i
1a820 66 28 20 28 69 26 33 29 21 3d 30 20 29 7b 20 66  f( (i&3)!=0 ){ f
1a830 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
1a840 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20  ; lineno++; }.  
1a850 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1a860 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1a870 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1a880 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e  rate a table con
1a890 74 61 69 6e 69 6e 67 20 61 20 74 65 78 74 20 73  taining a text s
1a8a0 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
1a8b0 69 62 65 73 20 65 76 65 72 79 0a 20 20 2a 2a 20  ibes every.  ** 
1a8c0 72 75 6c 65 20 69 6e 20 74 68 65 20 72 75 6c 65  rule in the rule
1a8d0 20 73 65 74 20 6f 66 20 74 68 65 20 67 72 61 6d   set of the gram
1a8e0 6d 65 72 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  mer.  This infor
1a8f0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 20  mation is used. 
1a900 20 2a 2a 20 77 68 65 6e 20 74 72 61 63 69 6e 67   ** when tracing
1a910 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73 2e   REDUCE actions.
1a920 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
1a930 20 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20   rp=lemp->rule; 
1a940 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c  rp; rp=rp->next,
1a950 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72   i++){.    asser
1a960 74 28 20 72 70 2d 3e 69 6e 64 65 78 3d 3d 69 20  t( rp->index==i 
1a970 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1a980 75 74 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c  ut," /* %3d */ \
1a990 22 25 73 20 3a 3a 3d 22 2c 20 69 2c 20 72 70 2d  "%s ::=", i, rp-
1a9a0 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
1a9b0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e   for(j=0; j<rp->
1a9c0 6e 72 68 73 3b 20 6a 2b 2b 29 20 66 70 72 69 6e  nrhs; j++) fprin
1a9d0 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 72 70 2d  tf(out," %s",rp-
1a9e0 3e 72 68 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a  >rhs[j]->name);.
1a9f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1aa00 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  "\",\n"); lineno
1aa10 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
1aa20 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1aa30 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1aa40 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1aa50 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1aa60 65 73 20 65 76 65 72 79 20 74 69 6d 65 20 61 20  es every time a 
1aa70 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65 64  symbol is popped
1aa80 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73   from.  ** the s
1aa90 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f 63 65  tack while proce
1aaa0 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f 72 20  ssing errors or 
1aab0 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69 6e 67  while destroying
1aac0 20 74 68 65 20 70 61 72 73 65 72 2e 20 0a 20 20   the parser. .  
1aad0 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  ** (In other wor
1aae0 64 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65  ds, generate the
1aaf0 20 25 64 65 73 74 72 75 63 74 6f 72 20 61 63 74   %destructor act
1ab00 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ions).  */.  if(
1ab10 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74   lemp->tokendest
1ab20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
1ab30 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1ab40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1ab50 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1ab60 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1ab70 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  i];.      if( sp
1ab80 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21  ==0 || sp->type!
1ab90 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74  =TERMINAL ) cont
1aba0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 70 72 69  inue;.      fpri
1abb0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
1abc0 65 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64  e %d:\n",sp->ind
1abd0 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ex); lineno++;. 
1abe0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1abf0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
1ac00 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  l && lemp->symbo
1ac10 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52  ls[i]->type!=TER
1ac20 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20  MINAL; i++);.   
1ac30 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79   if( i<lemp->nsy
1ac40 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d  mbol ){.      em
1ac50 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
1ac60 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d  de(out,lemp->sym
1ac70 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69  bols[i],lemp,&li
1ac80 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72  neno);.      fpr
1ac90 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1aca0 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
1acb0 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  no++;.    }.  }.
1acc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1acd0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1ace0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
1acf0 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
1ad00 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
1ad10 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d  if( sp==0 || sp-
1ad20 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
1ad30 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  || sp->destructo
1ad40 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  r==0 ) continue;
1ad50 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ad60 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e  ,"    case %d:\n
1ad70 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69  ",sp->index); li
1ad80 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  neno++;..    /* 
1ad90 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63 61 74  Combine duplicat
1ada0 65 20 64 65 73 74 72 75 63 74 6f 72 73 20 69 6e  e destructors in
1adb0 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 61 73 65  to a single case
1adc0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   */.    for(j=i+
1add0 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  1; j<lemp->nsymb
1ade0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1adf0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1ae00 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  p2 = lemp->symbo
1ae10 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[j];.      if(
1ae20 20 73 70 32 20 26 26 20 73 70 32 2d 3e 74 79 70   sp2 && sp2->typ
1ae30 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26 20 73  e!=TERMINAL && s
1ae40 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 0a 20  p2->destructor. 
1ae50 20 20 20 20 20 20 20 20 20 26 26 20 73 70 32 2d           && sp2-
1ae60 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e 75  >dtnum==sp->dtnu
1ae70 6d 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  m.          && s
1ae80 74 72 63 6d 70 28 73 70 2d 3e 64 65 73 74 72 75  trcmp(sp->destru
1ae90 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74 72 75  ctor,sp2->destru
1aea0 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ctor)==0 ){.    
1aeb0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1aec0 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e  ,"    case %d:\n
1aed0 22 2c 73 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c  ",sp2->index); l
1aee0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
1aef0 20 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f    sp2->destructo
1af00 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  r = 0;.      }. 
1af10 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64     }..    emit_d
1af20 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
1af30 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ut,lemp->symbols
1af40 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  [i],lemp,&lineno
1af50 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1af60 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
1af70 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1af80 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
1af90 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73  vardest ){.    s
1afa0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66  truct symbol *df
1afb0 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 66  lt_sp = 0;.    f
1afc0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1afd0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1afe0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1aff0 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1b000 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
1b010 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1b020 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
1b030 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70   ||.          sp
1b040 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70  ->index<=0 || sp
1b050 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20  ->destructor!=0 
1b060 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1b070 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1b080 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73     case %d:\n",s
1b090 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e  p->index); linen
1b0a0 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f  o++;.      dflt_
1b0b0 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20  sp = sp;.    }. 
1b0c0 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d     if( dflt_sp!=
1b0d0 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f  0 ){.      emit_
1b0e0 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
1b0f0 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70  out,dflt_sp,lemp
1b100 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ,&lineno);.     
1b110 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1b120 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
1b130 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1b140 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1b150 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1b160 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1b170 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b180 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1b190 68 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73  henever the pars
1b1a0 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f  er stack overflo
1b1b0 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ws */.  tplt_pri
1b1c0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1b1d0 2d 3e 6f 76 65 72 66 6c 6f 77 2c 6c 65 6d 70 2d  ->overflow,lemp-
1b1e0 3e 6f 76 65 72 66 6c 6f 77 6c 6e 2c 26 6c 69 6e  >overflowln,&lin
1b1f0 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
1b200 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1b210 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1b220 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
1b230 20 74 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69   table of rule i
1b240 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a  nformation .  **
1b250 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73  .  ** Note: This
1b260 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
1b270 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 72   the fact that r
1b280 75 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a  ules are number.
1b290 20 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c    ** sequentuall
1b2a0 79 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  y beginning with
1b2b0 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72   0..  */.  for(r
1b2c0 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
1b2d0 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
1b2e0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b2f0 22 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e  "  { %d, %d },\n
1b300 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78  ",rp->lhs->index
1b310 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65  ,rp->nrhs); line
1b320 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
1b330 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1b340 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1b350 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1b360 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
1b370 75 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63  ution during eac
1b380 68 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20  h REDUCE action 
1b390 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
1b3a0 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
1b3b0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
1b3c0 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 74 72 61  ( rp->code ) tra
1b3d0 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70  nslate_code(lemp
1b3e0 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  , rp);.  }.  for
1b3f0 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
1b400 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
1b410 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c  {.    struct rul
1b420 65 20 2a 72 70 32 3b 0a 20 20 20 20 69 66 28 20  e *rp2;.    if( 
1b430 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f  rp->code==0 ) co
1b440 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69  ntinue;.    fpri
1b450 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63  ntf(out,"      c
1b460 61 73 65 20 25 64 3a 5c 6e 22 2c 72 70 2d 3e 69  ase %d:\n",rp->i
1b470 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ndex); lineno++;
1b480 0a 20 20 20 20 66 6f 72 28 72 70 32 3d 72 70 2d  .    for(rp2=rp-
1b490 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72 70 32 3d  >next; rp2; rp2=
1b4a0 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  rp2->next){.    
1b4b0 20 20 69 66 28 20 72 70 32 2d 3e 63 6f 64 65 3d    if( rp2->code=
1b4c0 3d 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20  =rp->code ){.   
1b4d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1b4e0 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a  ,"      case %d:
1b4f0 5c 6e 22 2c 72 70 32 2d 3e 69 6e 64 65 78 29 3b  \n",rp2->index);
1b500 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1b510 20 20 20 72 70 32 2d 3e 63 6f 64 65 20 3d 20 30     rp2->code = 0
1b520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b530 20 20 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75      emit_code(ou
1b540 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  t,rp,lemp,&linen
1b550 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  o);.    fprintf(
1b560 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62 72 65  out,"        bre
1b570 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
1b580 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
1b590 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1b5a0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1b5b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b5c0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1b5d0 73 20 69 66 20 61 20 70 61 72 73 65 20 66 61 69  s if a parse fai
1b5e0 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ls */.  tplt_pri
1b5f0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1b600 2d 3e 66 61 69 6c 75 72 65 2c 6c 65 6d 70 2d 3e  ->failure,lemp->
1b610 66 61 69 6c 75 72 65 6c 6e 2c 26 6c 69 6e 65 6e  failureln,&linen
1b620 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
1b630 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1b640 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1b650 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1b660 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1b670 68 65 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72  hen a syntax err
1b680 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74  or occurs */.  t
1b690 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1b6a0 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 6c  mp,lemp->error,l
1b6b0 65 6d 70 2d 3e 65 72 72 6f 72 6c 6e 2c 26 6c 69  emp->errorln,&li
1b6c0 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1b6d0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1b6e0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1b6f0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1b700 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1b710 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65  s when the parse
1b720 72 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e  r accepts its in
1b730 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  put */.  tplt_pr
1b740 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1b750 70 2d 3e 61 63 63 65 70 74 2c 6c 65 6d 70 2d 3e  p->accept,lemp->
1b760 61 63 63 65 70 74 6c 6e 2c 26 6c 69 6e 65 6e 6f  acceptln,&lineno
1b770 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
1b780 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1b790 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1b7a0 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69   Append any addi
1b7b0 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73  tion code the us
1b7c0 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20  er desires */.  
1b7d0 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1b7e0 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63  emp,lemp->extrac
1b7f0 6f 64 65 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63  ode,lemp->extrac
1b800 6f 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  odeln,&lineno);.
1b810 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
1b820 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
1b830 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65  return;.}../* Ge
1b840 6e 65 72 61 74 65 20 61 20 68 65 61 64 65 72 20  nerate a header 
1b850 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72  file for the par
1b860 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ser */.void Repo
1b870 72 74 48 65 61 64 65 72 28 6c 65 6d 70 29 0a 73  rtHeader(lemp).s
1b880 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1b890 70 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  p;.{.  FILE *out
1b8a0 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 70  , *in;.  char *p
1b8b0 72 65 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69  refix;.  char li
1b8c0 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  ne[LINESIZE];.  
1b8d0 63 68 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e  char pattern[LIN
1b8e0 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b  ESIZE];.  int i;
1b8f0 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f  ..  if( lemp->to
1b900 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66  kenprefix ) pref
1b910 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ix = lemp->token
1b920 70 72 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20  prefix;.  else  
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b940 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20    prefix = "";. 
1b950 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28   in = file_open(
1b960 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 22 29 3b 0a  lemp,".h","r");.
1b970 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20    if( in ){.    
1b980 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1b990 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66 67  >nterminal && fg
1b9a0 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a  ets(line,LINESIZ
1b9b0 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  E,in); i++){.   
1b9c0 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 74 65     sprintf(patte
1b9d0 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  rn,"#define %s%-
1b9e0 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69  30s %2d\n",prefi
1b9f0 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
1ba00 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
1ba10 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6c 69     if( strcmp(li
1ba20 6e 65 2c 70 61 74 74 65 72 6e 29 20 29 20 62 72  ne,pattern) ) br
1ba30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  eak;.    }.    f
1ba40 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69  close(in);.    i
1ba50 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72  f( i==lemp->nter
1ba60 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f  minal ){.      /
1ba70 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74  * No change in t
1ba80 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20  he file.  Don't 
1ba90 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20  rewrite it. */. 
1baa0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1bab0 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66   }.  }.  out = f
1bac0 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e  ile_open(lemp,".
1bad0 68 22 2c 22 77 22 29 3b 0a 20 20 69 66 28 20 6f  h","w");.  if( o
1bae0 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ut ){.    for(i=
1baf0 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
1bb00 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
1bb10 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1bb20 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
1bb30 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  2d\n",prefix,lem
1bb40 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
1bb50 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ame,i);.    }.  
1bb60 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20    fclose(out);  
1bb70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
1bb80 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20  ../* Reduce the 
1bb90 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69  size of the acti
1bba0 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f  on tables, if po
1bbb0 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e  ssible, by makin
1bbc0 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61  g use.** of defa
1bbd0 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ults..**.** In t
1bbe0 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20  his version, we 
1bbf0 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72  take the most fr
1bc00 65 71 75 65 6e 74 20 52 45 44 55 43 45 20 61 63  equent REDUCE ac
1bc10 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a  tion and make.**
1bc20 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e   it the default.
1bc30 20 20 4f 6e 6c 79 20 64 65 66 61 75 6c 74 20 61    Only default a
1bc40 20 72 65 64 75 63 65 20 69 66 20 74 68 65 72 65   reduce if there
1bc50 20 61 72 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f   are more than o
1bc60 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70  ne..*/.void Comp
1bc70 72 65 73 73 54 61 62 6c 65 73 28 6c 65 6d 70 29  ressTables(lemp)
1bc80 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
1bc90 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp;.{.  struct 
1bca0 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
1bcb0 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c  ruct action *ap,
1bcc0 20 2a 61 70 32 3b 0a 20 20 73 74 72 75 63 74 20   *ap2;.  struct 
1bcd0 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20  rule *rp, *rp2, 
1bce0 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62  *rbest;.  int nb
1bcf0 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b  est, n;.  int i;
1bd00 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
1bd10 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
1bd20 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1bd30 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1bd40 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a 20 20 20    nbest = 0;.   
1bd50 20 72 62 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20   rbest = 0;..   
1bd60 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1bd70 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1bd80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
1bd90 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20  >type!=REDUCE ) 
1bda0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1bdb0 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20  rp = ap->x.rp;. 
1bdc0 20 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65       if( rp==rbe
1bdd0 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
1bde0 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
1bdf0 20 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65    for(ap2=ap->ne
1be00 78 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32  xt; ap2; ap2=ap2
1be10 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
1be20 20 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d   if( ap2->type!=
1be30 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75  REDUCE ) continu
1be40 65 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d  e;.        rp2 =
1be50 20 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20   ap2->x.rp;.    
1be60 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65      if( rp2==rbe
1be70 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
1be80 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d         if( rp2==
1be90 72 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  rp ) n++;.      
1bea0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62  }.      if( n>nb
1beb0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  est ){.        n
1bec0 62 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  best = n;.      
1bed0 20 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20    rbest = rp;.  
1bee0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20      }.    }. .  
1bef0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65    /* Do not make
1bf00 20 61 20 64 65 66 61 75 6c 74 20 69 66 20 74 68   a default if th
1bf10 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65  e number of rule
1bf20 73 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20  s to default.   
1bf30 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c 65   ** is not at le
1bf40 61 73 74 20 32 20 2a 2f 0a 20 20 20 20 69 66 28  ast 2 */.    if(
1bf50 20 6e 62 65 73 74 3c 32 20 29 20 63 6f 6e 74 69   nbest<2 ) conti
1bf60 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f  nue;...    /* Co
1bf70 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e 67 20 52  mbine matching R
1bf80 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20 69 6e  EDUCE actions in
1bf90 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65 66 61  to a single defa
1bfa0 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61  ult */.    for(a
1bfb0 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
1bfc0 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
1bfd0 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
1bfe0 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78  =REDUCE && ap->x
1bff0 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 62 72 65  .rp==rbest ) bre
1c000 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ak;.    }.    as
1c010 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20 20 20  sert( ap );.    
1c020 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ap->sp = Symbol_
1c030 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29  new("{default}")
1c040 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d  ;.    for(ap=ap-
1c050 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70  >next; ap; ap=ap
1c060 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
1c070 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
1c080 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d  UCE && ap->x.rp=
1c090 3d 72 62 65 73 74 20 29 20 61 70 2d 3e 74 79 70  =rbest ) ap->typ
1c0a0 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20  e = NOT_USED;.  
1c0b0 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70 20    }.    stp->ap 
1c0c0 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74  = Action_sort(st
1c0d0 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  p->ap);.  }.}../
1c0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c0f0 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
1c100 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  "set.c" ********
1c110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
1c130 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61  .** Set manipula
1c140 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f  tion routines fo
1c150 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
1c160 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
1c170 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a  ..static int siz
1c180 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74  e = 0;../* Set t
1c190 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76  he set size */.v
1c1a0 6f 69 64 20 53 65 74 53 69 7a 65 28 6e 29 0a 69  oid SetSize(n).i
1c1b0 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69 7a 65 20 3d  nt n;.{.  size =
1c1c0 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f   n+1;.}../* Allo
1c1d0 63 61 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a  cate a new set *
1c1e0 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 29  /.char *SetNew()
1c1f0 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20 20 69  {.  char *s;.  i
1c200 6e 74 20 69 3b 0a 20 20 73 20 3d 20 28 63 68 61  nt i;.  s = (cha
1c210 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 20  r*)malloc( size 
1c220 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20 29 7b  );.  if( s==0 ){
1c230 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
1c240 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
1c250 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  .    memory_erro
1c260 72 28 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  r();.  }.  for(i
1c270 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
1c280 20 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74   s[i] = 0;.  ret
1c290 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61  urn s;.}../* Dea
1c2a0 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f  llocate a set */
1c2b0 0a 76 6f 69 64 20 53 65 74 46 72 65 65 28 73 29  .void SetFree(s)
1c2c0 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 66 72  .char *s;.{.  fr
1c2d0 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  ee(s);.}../* Add
1c2e0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
1c2f0 6f 20 74 68 65 20 73 65 74 2e 20 20 52 65 74 75  o the set.  Retu
1c300 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 65  rn TRUE if the e
1c310 6c 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64  lement was added
1c320 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66  .** and FALSE if
1c330 20 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20   it was already 
1c340 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65  there. */.int Se
1c350 74 41 64 64 28 73 2c 65 29 0a 63 68 61 72 20 2a  tAdd(s,e).char *
1c360 73 3b 0a 69 6e 74 20 65 3b 0a 7b 0a 20 20 69 6e  s;.int e;.{.  in
1c370 74 20 72 76 3b 0a 20 20 72 76 20 3d 20 73 5b 65  t rv;.  rv = s[e
1c380 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20  ];.  s[e] = 1;. 
1c390 20 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a   return !rv;.}..
1c3a0 2f 2a 20 41 64 64 20 65 76 65 72 79 20 65 6c 65  /* Add every ele
1c3b0 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31  ment of s2 to s1
1c3c0 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1c3d0 66 20 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f  f s1 changes. */
1c3e0 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 73 31  .int SetUnion(s1
1c3f0 2c 73 32 29 0a 63 68 61 72 20 2a 73 31 3b 0a 63  ,s2).char *s1;.c
1c400 68 61 72 20 2a 73 32 3b 0a 7b 0a 20 20 69 6e 74  har *s2;.{.  int
1c410 20 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20   i, progress;.  
1c420 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
1c430 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1c440 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1c450 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  2[i]==0 ) contin
1c460 75 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69  ue;.    if( s1[i
1c470 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  ]==0 ){.      pr
1c480 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20  ogress = 1;.    
1c490 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20    s1[i] = 1;.   
1c4a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c4b0 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a  progress;.}./***
1c4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4d0 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1c4e0 65 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a  e "table.c" ****
1c4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c500 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
1c510 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73  All code in this
1c520 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61   file has been a
1c530 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
1c540 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  erated.** from a
1c550 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69   specification i
1c560 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  n the file.**   
1c570 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c             "tabl
1c580 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61  e.q".** by the a
1c590 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1c5a0 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70   code building p
1c5b0 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a  rogram "aagen"..
1c5c0 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74  ** Do not edit t
1c5d0 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65  his file!  Inste
1c5e0 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65  ad, edit the spe
1c5f0 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69  cification.** fi
1c600 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61  le, then rerun a
1c610 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43  agen..*/./*.** C
1c620 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ode for processi
1c630 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ng tables in the
1c640 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
1c650 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49  nerator..*/..PRI
1c660 56 41 54 45 20 69 6e 74 20 73 74 72 68 61 73 68  VATE int strhash
1c670 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20  (x).char *x;.{. 
1c680 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 77 68   int h = 0;.  wh
1c690 69 6c 65 28 20 2a 78 29 20 68 20 3d 20 68 2a 31  ile( *x) h = h*1
1c6a0 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65  3 + *(x++);.  re
1c6b0 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f  turn h;.}../* Wo
1c6c0 72 6b 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c  rks like strdup,
1c6d0 20 73 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20   sort of.  Save 
1c6e0 61 20 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c  a string in mall
1c6f0 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74  oced memory, but
1c700 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73  .** keep strings
1c710 20 69 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74   in a table so t
1c720 68 61 74 20 74 68 65 20 73 61 6d 65 20 73 74 72  hat the same str
1c730 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f  ing is not in mo
1c740 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70  re.** than one p
1c750 6c 61 63 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 53  lace..*/.char *S
1c760 74 72 73 61 66 65 28 79 29 0a 63 68 61 72 20 2a  trsafe(y).char *
1c770 79 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  y;.{.  char *z;.
1c780 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66  .  z = Strsafe_f
1c790 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d  ind(y);.  if( z=
1c7a0 3d 30 20 26 26 20 28 7a 3d 6d 61 6c 6c 6f 63 28  =0 && (z=malloc(
1c7b0 20 73 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21   strlen(y)+1 ))!
1c7c0 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79  =0 ){.    strcpy
1c7d0 28 7a 2c 79 29 3b 0a 20 20 20 20 53 74 72 73 61  (z,y);.    Strsa
1c7e0 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20  fe_insert(z);.  
1c7f0 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  }.  MemoryCheck(
1c800 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  z);.  return z;.
1c810 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
1c820 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1c830 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1c840 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
1c850 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
1c860 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31  rray of type "x1
1c870 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
1c880 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  1 {.  int size; 
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c8a0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
1c8b0 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
1c8c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1c8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c8e0 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
1c8f0 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
1c900 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c920 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
1c930 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
1c940 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1c950 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
1c960 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
1c970 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
1c980 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x1node *tbl; 
1c990 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
1c9a0 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
1c9b0 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a  ruct s_x1node **
1c9c0 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
1c9d0 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
1c9e0 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
1c9f0 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1ca00 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1ca10 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
1ca20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
1ca30 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1ca40 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e  ay of type "x1".
1ca50 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1ca60 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20  ct s_x1node {.  
1ca70 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca90 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
1caa0 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e  ruct s_x1node *n
1cab0 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
1cac0 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
1cad0 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
1cae0 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66  uct s_x1node **f
1caf0 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
1cb00 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f  s link */.} x1no
1cb10 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
1cb20 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
1cb30 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
1cb40 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
1cb50 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
1cb60 63 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78  c struct s_x1 *x
1cb70 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  1a;../* Allocate
1cb80 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
1cb90 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
1cba0 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 7b   Strsafe_init(){
1cbb0 0a 20 20 69 66 28 20 78 31 61 20 29 20 72 65 74  .  if( x1a ) ret
1cbc0 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73 74  urn;.  x1a = (st
1cbd0 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f  ruct s_x1*)mallo
1cbe0 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
1cbf0 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28 20   s_x1) );.  if( 
1cc00 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e  x1a ){.    x1a->
1cc10 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
1cc20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x1a->count = 0;
1cc30 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20  .    x1a->tbl = 
1cc40 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x1node*)malloc(
1cc50 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28   .      (sizeof(
1cc60 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x1node) + sizeof
1cc70 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30 32 34 20  (x1node*))*1024 
1cc80 29 3b 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e  );.    if( x1a->
1cc90 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
1cca0 66 72 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20  free(x1a);.     
1ccb0 20 78 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x1a = 0;.    }e
1ccc0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1ccd0 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20  ;.      x1a->ht 
1cce0 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31  = (x1node**)&(x1
1ccf0 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20  a->tbl[1024]);. 
1cd00 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1cd10 31 30 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e  1024; i++) x1a->
1cd20 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
1cd30 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
1cd40 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
1cd50 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
1cd60 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
1cd70 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
1cd80 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
1cd90 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
1cda0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
1cdb0 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
1cdc0 72 74 28 64 61 74 61 29 0a 63 68 61 72 20 2a 64  rt(data).char *d
1cdd0 61 74 61 3b 0a 7b 0a 20 20 78 31 6e 6f 64 65 20  ata;.{.  x1node 
1cde0 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
1cdf0 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
1ce00 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  1a==0 ) return 0
1ce10 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68  ;.  ph = strhash
1ce20 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68  (data);.  h = ph
1ce30 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29   & (x1a->size-1)
1ce40 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74  ;.  np = x1a->ht
1ce50 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
1ce60 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
1ce70 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61  mp(np->data,data
1ce80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
1ce90 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
1cea0 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
1ceb0 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
1cec0 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
1ced0 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
1cee0 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
1cef0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1cf00 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
1cf10 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
1cf20 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e  .  if( x1a->coun
1cf30 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x1a->size ){.
1cf40 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
1cf50 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
1cf60 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
1cf70 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20   int i,size;.   
1cf80 20 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72   struct s_x1 arr
1cf90 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
1cfa0 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d  ze = size = x1a-
1cfb0 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
1cfc0 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e  ay.count = x1a->
1cfd0 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
1cfe0 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29  .tbl = (x1node*)
1cff0 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73  malloc(.      (s
1d000 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20  izeof(x1node) + 
1d010 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29  sizeof(x1node*))
1d020 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  *size );.    if(
1d030 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
1d040 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
1d050 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
1d060 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
1d070 61 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f  array.ht = (x1no
1d080 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
1d090 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  [size]);.    for
1d0a0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
1d0b0 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
1d0c0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
1d0d0 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x1a->count; i
1d0e0 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64  ++){.      x1nod
1d0f0 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
1d100 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
1d110 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x1a->tbl[i]);.
1d120 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73        h = strhas
1d130 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26  h(oldnp->data) &
1d140 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
1d150 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
1d160 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
1d170 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
1d180 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
1d190 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
1d1a0 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
1d1b0 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
1d1c0 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
1d1d0 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70  np->data = oldnp
1d1e0 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65  ->data;.      ne
1d1f0 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72  wnp->from = &(ar
1d200 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20  ray.ht[h]);.    
1d210 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20    array.ht[h] = 
1d220 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20  newnp;.    }.   
1d230 20 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b   free(x1a->tbl);
1d240 0a 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72 61  .    *x1a = arra
1d250 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65  y;.  }.  /* Inse
1d260 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20  rt the new data 
1d270 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  */.  h = ph & (x
1d280 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  1a->size-1);.  n
1d290 70 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78  p = &(x1a->tbl[x
1d2a0 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20  1a->count++]);. 
1d2b0 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
1d2c0 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b  ;.  if( x1a->ht[
1d2d0 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d  h] ) x1a->ht[h]-
1d2e0 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
1d2f0 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
1d300 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x1a->ht[h];.  
1d310 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x1a->ht[h] = np;
1d320 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
1d330 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x1a->ht[h]);.  r
1d340 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
1d350 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1d360 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
1d370 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
1d380 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
1d390 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
1d3a0 79 2e 20 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73  y. */.char *Strs
1d3b0 61 66 65 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68  afe_find(key).ch
1d3c0 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74  ar *key;.{.  int
1d3d0 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70   h;.  x1node *np
1d3e0 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20  ;..  if( x1a==0 
1d3f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
1d400 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26  = strhash(key) &
1d410 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
1d420 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68    np = x1a->ht[h
1d430 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
1d440 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
1d450 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d  (np->data,key)==
1d460 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
1d470 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
1d480 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
1d490 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
1d4a0 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
1d4b0 6e 74 65 72 20 74 6f 20 74 68 65 20 28 74 65 72  nter to the (ter
1d4c0 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d  minal or nonterm
1d4d0 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22  inal) symbol "x"
1d4e0 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  ..** Create a ne
1d4f0 77 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69 73  w symbol if this
1d500 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 69   is the first ti
1d510 6d 65 20 22 78 22 20 68 61 73 20 62 65 65 6e 20  me "x" has been 
1d520 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  seen..*/.struct 
1d530 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
1d540 65 77 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b  ew(x).char *x;.{
1d550 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1d560 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79   *sp;..  sp = Sy
1d570 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20  mbol_find(x);.  
1d580 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20  if( sp==0 ){.   
1d590 20 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79   sp = (struct sy
1d5a0 6d 62 6f 6c 20 2a 29 6d 61 6c 6c 6f 63 28 20 73  mbol *)malloc( s
1d5b0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
1d5c0 62 6f 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f  bol) );.    Memo
1d5d0 72 79 43 68 65 63 6b 28 73 70 29 3b 0a 20 20 20  ryCheck(sp);.   
1d5e0 20 73 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73   sp->name = Strs
1d5f0 61 66 65 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e  afe(x);.    sp->
1d600 74 79 70 65 20 3d 20 69 73 75 70 70 65 72 28 2a  type = isupper(*
1d610 78 29 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20  x) ? TERMINAL : 
1d620 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20  NONTERMINAL;.   
1d630 20 73 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20   sp->rule = 0;. 
1d640 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20     sp->fallback 
1d650 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65  = 0;.    sp->pre
1d660 63 20 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e  c = -1;.    sp->
1d670 61 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20  assoc = UNK;.   
1d680 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 3d 20   sp->firstset = 
1d690 30 3b 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64  0;.    sp->lambd
1d6a0 61 20 3d 20 42 5f 46 41 4c 53 45 3b 0a 20 20 20  a = B_FALSE;.   
1d6b0 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20   sp->destructor 
1d6c0 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74  = 0;.    sp->dat
1d6d0 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 53  atype = 0;.    S
1d6e0 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c  ymbol_insert(sp,
1d6f0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  sp->name);.  }. 
1d700 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f   return sp;.}../
1d710 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 79  * Compare two sy
1d720 6d 62 6f 6c 73 20 66 6f 72 20 77 6f 72 6b 69 6e  mbols for workin
1d730 67 20 70 75 72 70 6f 73 65 73 0a 2a 2a 0a 2a 2a  g purposes.**.**
1d740 20 53 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65   Symbols that be
1d750 67 69 6e 20 77 69 74 68 20 75 70 70 65 72 20 63  gin with upper c
1d760 61 73 65 20 6c 65 74 74 65 72 73 20 28 74 65 72  ase letters (ter
1d770 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73  minals or tokens
1d780 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20 62  ).** must sort b
1d790 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74 68  efore symbols th
1d7a0 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 6c 6f  at begin with lo
1d7b0 77 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73  wer case letters
1d7c0 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61  .** (non-termina
1d7d0 6c 73 29 2e 20 20 4f 74 68 65 72 20 74 68 61 6e  ls).  Other than
1d7e0 20 74 68 61 74 2c 20 74 68 65 20 6f 72 64 65 72   that, the order
1d7f0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
1d800 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20  ..**.** We find 
1d810 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74  experimentally t
1d820 68 61 74 20 6c 65 61 76 69 6e 67 20 74 68 65 20  hat leaving the 
1d830 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69 72  symbols in their
1d840 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64   original.** ord
1d850 65 72 20 28 74 68 65 20 6f 72 64 65 72 20 74 68  er (the order th
1d860 65 79 20 61 70 70 65 61 72 65 64 20 69 6e 20 74  ey appeared in t
1d870 68 65 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 29  he grammar file)
1d880 20 67 69 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d   gives the.** sm
1d890 61 6c 6c 65 73 74 20 70 61 72 73 65 72 20 74 61  allest parser ta
1d8a0 62 6c 65 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a  bles in SQLite..
1d8b0 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70  */.int Symbolcmp
1d8c0 70 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  p(struct symbol 
1d8d0 2a 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d 62  **a, struct symb
1d8e0 6f 6c 20 2a 2a 62 29 7b 0a 20 20 69 6e 74 20 69  ol **b){.  int i
1d8f0 31 20 3d 20 28 2a 2a 61 29 2e 69 6e 64 65 78 20  1 = (**a).index 
1d900 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a 61  + 10000000*((**a
1d910 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a  ).name[0]>'Z');.
1d920 20 20 69 6e 74 20 69 32 20 3d 20 28 2a 2a 62 29    int i2 = (**b)
1d930 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30 30 30  .index + 1000000
1d940 30 2a 28 28 2a 2a 62 29 2e 6e 61 6d 65 5b 30 5d  0*((**b).name[0]
1d950 3e 27 5a 27 29 3b 0a 20 20 72 65 74 75 72 6e 20  >'Z');.  return 
1d960 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  i1-i2;.}../* The
1d970 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1d980 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1d990 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
1d9a0 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
1d9b0 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
1d9c0 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72  ype "x2"..*/.str
1d9d0 75 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74  uct s_x2 {.  int
1d9e0 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
1d9f0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1da00 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
1da10 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da30 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
1da40 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
1da50 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
1da60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1da70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1da80 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
1da90 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
1daa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1dab0 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
1dac0 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
1dad0 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
1dae0 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
1daf0 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
1db00 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32  */.  struct s_x2
1db10 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
1db20 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
1db30 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
1db40 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1db50 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
1db60 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
1db70 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
1db80 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
1db90 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
1dba0 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x2"..*/.typed
1dbb0 65 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  ef struct s_x2no
1dbc0 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79  de {.  struct sy
1dbd0 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20 20  mbol *data;     
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dbf0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 68  The data */.  ch
1dc00 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20  ar *key;        
1dc10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1dc20 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
1dc30 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74  t s_x2node *next
1dc40 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
1dc50 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
1dc60 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
1dc70 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x2node **from
1dc80 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
1dc90 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b  ink */.} x2node;
1dca0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1dcb0 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
1dcc0 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
1dcd0 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
1dce0 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
1dcf0 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61 3b  truct s_x2 *x2a;
1dd00 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
1dd10 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
1dd20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79  array */.void Sy
1dd30 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69  mbol_init(){.  i
1dd40 66 28 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b  f( x2a ) return;
1dd50 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75 63 74  .  x2a = (struct
1dd60 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x2*)malloc( s
1dd70 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
1dd80 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20  2) );.  if( x2a 
1dd90 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65  ){.    x2a->size
1dda0 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d   = 128;.    x2a-
1ddb0 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
1ddc0 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f  x2a->tbl = (x2no
1ddd0 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20  de*)malloc( .   
1dde0 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64     (sizeof(x2nod
1ddf0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f  e) + sizeof(x2no
1de00 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20 20  de*))*128 );.   
1de10 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30   if( x2a->tbl==0
1de20 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
1de30 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d  2a);.      x2a =
1de40 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1de50 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1de60 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e    x2a->ht = (x2n
1de70 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c  ode**)&(x2a->tbl
1de80 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f  [128]);.      fo
1de90 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b  r(i=0; i<128; i+
1dea0 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x2a->ht[i] = 
1deb0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
1dec0 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
1ded0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
1dee0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
1def0 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
1df00 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
1df10 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
1df20 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
1df30 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  tten */.int Symb
1df40 6f 6c 5f 69 6e 73 65 72 74 28 64 61 74 61 2c 6b  ol_insert(data,k
1df50 65 79 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  ey).struct symbo
1df60 6c 20 2a 64 61 74 61 3b 0a 63 68 61 72 20 2a 6b  l *data;.char *k
1df70 65 79 3b 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a  ey;.{.  x2node *
1df80 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69  np;.  int h;.  i
1df90 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 32  nt ph;..  if( x2
1dfa0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1dfb0 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28  .  ph = strhash(
1dfc0 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26  key);.  h = ph &
1dfd0 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
1dfe0 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68    np = x2a->ht[h
1dff0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
1e000 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
1e010 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
1e020 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
1e030 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
1e040 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
1e050 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
1e060 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
1e070 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
1e080 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
1e090 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1e0a0 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
1e0b0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
1e0c0 66 28 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x2a->count>=x
1e0d0 32 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  2a->size ){.    
1e0e0 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
1e0f0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
1e100 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
1e110 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72   i,size;.    str
1e120 75 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b 0a  uct s_x2 array;.
1e130 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d      array.size =
1e140 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a   size = x2a->siz
1e150 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
1e160 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e  ount = x2a->coun
1e170 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
1e180 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x2node*)mall
1e190 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f  oc(.      (sizeo
1e1a0 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x2node) + size
1e1b0 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 73 69 7a  of(x2node*))*siz
1e1c0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  e );.    if( arr
1e1d0 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
1e1e0 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
1e1f0 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
1e200 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
1e210 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a  y.ht = (x2node**
1e220 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a  )&(array.tbl[siz
1e230 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
1e240 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
1e250 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
1e260 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
1e270 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  2a->count; i++){
1e280 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f  .      x2node *o
1e290 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
1e2a0 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32      oldnp = &(x2
1e2b0 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
1e2c0 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c    h = strhash(ol
1e2d0 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a  dnp->key) & (siz
1e2e0 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
1e2f0 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
1e300 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
1e310 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
1e320 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
1e330 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
1e340 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
1e350 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
1e360 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
1e370 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
1e380 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
1e390 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
1e3a0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
1e3b0 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
1e3c0 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
1e3d0 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
1e3e0 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
1e3f0 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x2a->tbl);.    *
1e400 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x2a = array;.  }
1e410 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
1e420 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
1e430 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69   = ph & (x2a->si
1e440 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
1e450 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f  x2a->tbl[x2a->co
1e460 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
1e470 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
1e480 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
1e490 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x2a->ht[h] ) 
1e4a0 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x2a->ht[h]->from
1e4b0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
1e4c0 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61    np->next = x2a
1e4d0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e  ->ht[h];.  x2a->
1e4e0 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
1e4f0 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e  ->from = &(x2a->
1e500 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
1e510 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
1e520 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1e530 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
1e540 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
1e550 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
1e560 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
1e570 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
1e580 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6b 65 79 29  Symbol_find(key)
1e590 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20  .char *key;.{.  
1e5a0 69 6e 74 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20  int h;.  x2node 
1e5b0 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d  *np;..  if( x2a=
1e5c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e5d0 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79   h = strhash(key
1e5e0 29 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  ) & (x2a->size-1
1e5f0 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68  );.  np = x2a->h
1e600 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1e610 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
1e620 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
1e630 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
1e640 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
1e650 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
1e660 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
1e670 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
1e680 20 6e 2d 74 68 20 64 61 74 61 2e 20 20 52 65 74   n-th data.  Ret
1e690 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73  urn NULL if n is
1e6a0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a   out of range. *
1e6b0 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
1e6c0 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 6e 29 0a 69  *Symbol_Nth(n).i
1e6d0 6e 74 20 6e 3b 0a 7b 0a 20 20 73 74 72 75 63 74  nt n;.{.  struct
1e6e0 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20   symbol *data;. 
1e6f0 20 69 66 28 20 78 32 61 20 26 26 20 6e 3e 30 20   if( x2a && n>0 
1e700 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74  && n<=x2a->count
1e710 20 29 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 78   ){.    data = x
1e720 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74  2a->tbl[n-1].dat
1e730 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
1e740 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  data = 0;.  }.  
1e750 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a  return data;.}..
1e760 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  /* Return the si
1e770 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
1e780 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  */.int Symbol_co
1e790 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e  unt().{.  return
1e7a0 20 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e   x2a ? x2a->coun
1e7b0 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  t : 0;.}../* Ret
1e7c0 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20  urn an array of 
1e7d0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
1e7e0 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c  data in the tabl
1e7f0 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20  e..** The array 
1e800 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
1e810 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e   malloc.  Return
1e820 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20   NULL if memory 
1e830 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72  allocation.** pr
1e840 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68  oblems, or if th
1e850 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79  e array is empty
1e860 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
1e870 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61  ol **Symbol_arra
1e880 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74  yof().{.  struct
1e890 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b   symbol **array;
1e8a0 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20  .  int i,size;. 
1e8b0 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
1e8c0 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d  turn 0;.  size =
1e8d0 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61   x2a->count;.  a
1e8e0 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73  rray = (struct s
1e8f0 79 6d 62 6f 6c 20 2a 2a 29 6d 61 6c 6c 6f 63 28  ymbol **)malloc(
1e900 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
1e910 79 6d 62 6f 6c 20 2a 29 2a 73 69 7a 65 20 29 3b  ymbol *)*size );
1e920 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
1e930 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1e940 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b  ize; i++) array[
1e950 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d  i] = x2a->tbl[i]
1e960 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74  .data;.  }.  ret
1e970 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  urn array;.}../*
1e980 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e   Compare two con
1e990 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69  figurations */.i
1e9a0 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 61 2c 62  nt Configcmp(a,b
1e9b0 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
1e9c0 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  *a;.struct confi
1e9d0 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b  g *b;.{.  int x;
1e9e0 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e  .  x = a->rp->in
1e9f0 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64  dex - b->rp->ind
1ea00 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20 29  ex;.  if( x==0 )
1ea10 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d   x = a->dot - b-
1ea20 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 78  >dot;.  return x
1ea30 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
1ea40 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50 52  two states */.PR
1ea50 49 56 41 54 45 20 69 6e 74 20 73 74 61 74 65 63  IVATE int statec
1ea60 6d 70 28 61 2c 62 29 0a 73 74 72 75 63 74 20 63  mp(a,b).struct c
1ea70 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75 63 74  onfig *a;.struct
1ea80 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20   config *b;.{.  
1ea90 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63  int rc;.  for(rc
1eaa0 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26  =0; rc==0 && a &
1eab0 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62  & b;  a=a->bp, b
1eac0 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20  =b->bp){.    rc 
1ead0 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d  = a->rp->index -
1eae0 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20   b->rp->index;. 
1eaf0 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1eb00 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e  c = a->dot - b->
1eb10 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  dot;.  }.  if( r
1eb20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
1eb30 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20  a ) rc = 1;.    
1eb40 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b  if( b ) rc = -1;
1eb50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1eb60 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73  ;.}../* Hash a s
1eb70 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  tate */.PRIVATE 
1eb80 69 6e 74 20 73 74 61 74 65 68 61 73 68 28 61 29  int statehash(a)
1eb90 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1eba0 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a  a;.{.  int h=0;.
1ebb0 20 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20 20    while( a ){.  
1ebc0 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d    h = h*571 + a-
1ebd0 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20  >rp->index*37 + 
1ebe0 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20  a->dot;.    a = 
1ebf0 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74  a->bp;.  }.  ret
1ec00 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c  urn h;.}../* All
1ec10 6f 63 61 74 65 20 61 20 6e 65 77 20 73 74 61 74  ocate a new stat
1ec20 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73  e structure */.s
1ec30 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61  truct state *Sta
1ec40 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72  te_new().{.  str
1ec50 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 3b 0a  uct state *new;.
1ec60 20 20 6e 65 77 20 3d 20 28 73 74 72 75 63 74 20    new = (struct 
1ec70 73 74 61 74 65 20 2a 29 6d 61 6c 6c 6f 63 28 20  state *)malloc( 
1ec80 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74  sizeof(struct st
1ec90 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79  ate) );.  Memory
1eca0 43 68 65 63 6b 28 6e 65 77 29 3b 0a 20 20 72 65  Check(new);.  re
1ecb0 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20  turn new;.}../* 
1ecc0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1ecd0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1ece0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1ecf0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
1ed00 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
1ed10 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a  f type "x3"..*/.
1ed20 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20  struct s_x3 {.  
1ed30 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
1ed40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1ed50 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1ed60 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed80 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
1ed90 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
1eda0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1edb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1edd0 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
1ede0 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
1edf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ee00 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
1ee10 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
1ee20 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
1ee30 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
1ee40 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
1ee50 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
1ee60 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x3node **ht;  /
1ee70 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
1ee80 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
1ee90 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
1eea0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1eeb0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
1eec0 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
1eed0 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
1eee0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
1eef0 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79  type "x3"..*/.ty
1ef00 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
1ef10 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  3node {.  struct
1ef20 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20   state *data;   
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ef40 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
1ef50 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
1ef60 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
1ef70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79        /* The key
1ef80 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1ef90 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  3node *next;   /
1efa0 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
1efb0 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
1efc0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
1efd0 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
1efe0 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
1eff0 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x3node;../* 
1f000 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
1f010 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1f020 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
1f030 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
1f040 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
1f050 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20   s_x3 *x3a;../* 
1f060 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
1f070 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1f080 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69   */.void State_i
1f090 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61  nit(){.  if( x3a
1f0a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61   ) return;.  x3a
1f0b0 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a   = (struct s_x3*
1f0c0 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
1f0d0 73 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a  struct s_x3) );.
1f0e0 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20    if( x3a ){.   
1f0f0 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38   x3a->size = 128
1f100 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74  ;.    x3a->count
1f110 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74   = 0;.    x3a->t
1f120 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61  bl = (x3node*)ma
1f130 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69  lloc( .      (si
1f140 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73  zeof(x3node) + s
1f150 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a  izeof(x3node*))*
1f160 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78  128 );.    if( x
1f170 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20  3a->tbl==0 ){.  
1f180 20 20 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20      free(x3a);. 
1f190 20 20 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20       x3a = 0;.  
1f1a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1f1b0 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d  nt i;.      x3a-
1f1c0 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29  >ht = (x3node**)
1f1d0 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29  &(x3a->tbl[128])
1f1e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1f1f0 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61   i<128; i++) x3a
1f200 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
1f210 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
1f220 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
1f230 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
1f240 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1f250 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
1f260 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
1f270 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
1f280 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
1f290 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  /.int State_inse
1f2a0 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72  rt(data,key).str
1f2b0 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b  uct state *data;
1f2c0 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1f2d0 6b 65 79 3b 0a 7b 0a 20 20 78 33 6e 6f 64 65 20  key;.{.  x3node 
1f2e0 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
1f2f0 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
1f300 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  3a==0 ) return 0
1f310 3b 0a 20 20 70 68 20 3d 20 73 74 61 74 65 68 61  ;.  ph = stateha
1f320 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70  sh(key);.  h = p
1f330 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  h & (x3a->size-1
1f340 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68  );.  np = x3a->h
1f350 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1f360 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  p ){.    if( sta
1f370 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  tecmp(np->key,ke
1f380 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  y)==0 ){.      /
1f390 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
1f3a0 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
1f3b0 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
1f3c0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
1f3d0 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
1f3e0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
1f3f0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
1f400 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
1f410 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
1f420 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75  }.  if( x3a->cou
1f430 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x3a->size ){
1f440 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
1f450 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1f460 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
1f470 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
1f480 20 20 73 74 72 75 63 74 20 73 5f 78 33 20 61 72    struct s_x3 ar
1f490 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
1f4a0 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 33 61  ize = size = x3a
1f4b0 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
1f4c0 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d  ray.count = x3a-
1f4d0 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
1f4e0 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a  y.tbl = (x3node*
1f4f0 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28  )malloc(.      (
1f500 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b  sizeof(x3node) +
1f510 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29   sizeof(x3node*)
1f520 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  )*size );.    if
1f530 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
1f540 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
1f550 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
1f560 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
1f570 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e   array.ht = (x3n
1f580 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
1f590 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  l[size]);.    fo
1f5a0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
1f5b0 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
1f5c0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
1f5d0 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x3a->count; 
1f5e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f  i++){.      x3no
1f5f0 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
1f600 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
1f610 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x3a->tbl[i]);
1f620 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61 74 65  .      h = state
1f630 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29  hash(oldnp->key)
1f640 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20   & (size-1);.   
1f650 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72     newnp = &(arr
1f660 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  ay.tbl[i]);.    
1f670 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68    if( array.ht[h
1f680 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d  ] ) array.ht[h]-
1f690 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d  >from = &(newnp-
1f6a0 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65  >next);.      ne
1f6b0 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61  wnp->next = arra
1f6c0 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e  y.ht[h];.      n
1f6d0 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e  ewnp->key = oldn
1f6e0 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65  p->key;.      ne
1f6f0 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
1f700 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
1f710 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
1f720 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
1f730 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
1f740 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
1f750 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29    free(x3a->tbl)
1f760 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72  ;.    *x3a = arr
1f770 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
1f780 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
1f790 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
1f7a0 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x3a->size-1);.  
1f7b0 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b  np = &(x3a->tbl[
1f7c0 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x3a->count++]);.
1f7d0 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b    np->key = key;
1f7e0 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61  .  np->data = da
1f7f0 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68  ta;.  if( x3a->h
1f800 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68  t[h] ) x3a->ht[h
1f810 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e  ]->from = &(np->
1f820 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78  next);.  np->nex
1f830 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  t = x3a->ht[h];.
1f840 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e    x3a->ht[h] = n
1f850 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20  p;.  np->from = 
1f860 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20  &(x3a->ht[h]);. 
1f870 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1f880 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1f890 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e  r to data assign
1f8a0 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  ed to the given 
1f8b0 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  key.  Return NUL
1f8c0 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20  L.** if no such 
1f8d0 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  key. */.struct s
1f8e0 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64  tate *State_find
1f8f0 28 6b 65 79 29 0a 73 74 72 75 63 74 20 63 6f 6e  (key).struct con
1f900 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e  fig *key;.{.  in
1f910 74 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  t h;.  x3node *n
1f920 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30  p;..  if( x3a==0
1f930 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
1f940 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79   = statehash(key
1f950 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  ) & (x3a->size-1
1f960 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68  );.  np = x3a->h
1f970 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1f980 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  p ){.    if( sta
1f990 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  tecmp(np->key,ke
1f9a0 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  y)==0 ) break;. 
1f9b0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
1f9c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
1f9d0 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30  p ? np->data : 0
1f9e0 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
1f9f0 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
1fa00 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20  ers to all data 
1fa10 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
1fa20 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62   The array is ob
1fa30 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
1fa40 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  oc.  Return NULL
1fa50 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   if memory alloc
1fa60 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d  ation.** problem
1fa70 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72  s, or if the arr
1fa80 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  ay is empty. */.
1fa90 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53  struct state **S
1faa0 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b  tate_arrayof().{
1fab0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
1fac0 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69  **array;.  int i
1fad0 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61  ,size;.  if( x3a
1fae0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1faf0 20 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f    size = x3a->co
1fb00 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28  unt;.  array = (
1fb10 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29  struct state **)
1fb20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
1fb30 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 2a 73  truct state *)*s
1fb40 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 61 72 72  ize );.  if( arr
1fb50 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ay ){.    for(i=
1fb60 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
1fb70 61 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e  array[i] = x3a->
1fb80 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d  tbl[i].data;.  }
1fb90 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b  .  return array;
1fba0 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f  .}../* Hash a co
1fbb0 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50  nfiguration */.P
1fbc0 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6e 66 69  RIVATE int confi
1fbd0 67 68 61 73 68 28 61 29 0a 73 74 72 75 63 74 20  ghash(a).struct 
1fbe0 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20 69  config *a;.{.  i
1fbf0 6e 74 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a  nt h=0;.  h = h*
1fc00 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
1fc10 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
1fc20 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
1fc30 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
1fc40 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1fc50 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1fc60 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
1fc70 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1fc80 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a   of type "x4"..*
1fc90 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a  /.struct s_x4 {.
1fca0 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
1fcb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1fcc0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1fcd0 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
1fd00 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
1fd10 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
1fd20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd40 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
1fd50 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
1fd60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd70 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
1fd80 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
1fd90 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1fda0 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  4node *tbl;  /* 
1fdb0 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
1fdc0 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
1fdd0 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x4node **ht; 
1fde0 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
1fdf0 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
1fe00 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1fe10 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1fe20 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
1fe30 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
1fe40 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
1fe50 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
1fe60 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a  f type "x4"..*/.
1fe70 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
1fe80 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x4node {.  stru
1fe90 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b  ct config *data;
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1feb0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
1fec0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
1fed0 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
1fee0 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
1fef0 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
1ff00 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
1ff10 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
1ff20 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
1ff30 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x4node;../* The
1ff40 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
1ff50 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
1ff60 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
1ff70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
1ff80 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
1ff90 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c  x4 *x4a;../* All
1ffa0 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
1ffb0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
1ffc0 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c  .void Configtabl
1ffd0 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
1ffe0 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x4a ) return;.  
1fff0 78 34 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x4a = (struct s_
20000 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x4*)malloc( size
20010 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34 29 20  of(struct s_x4) 
20020 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a  );.  if( x4a ){.
20030 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20      x4a->size = 
20040 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75  64;.    x4a->cou
20050 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d  nt = 0;.    x4a-
20060 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29  >tbl = (x4node*)
20070 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
20080 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b  sizeof(x4node) +
20090 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29   sizeof(x4node*)
200a0 29 2a 36 34 20 29 3b 0a 20 20 20 20 69 66 28 20  )*64 );.    if( 
200b0 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20  x4a->tbl==0 ){. 
200c0 20 20 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a       free(x4a);.
200d0 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20        x4a = 0;. 
200e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
200f0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61  int i;.      x4a
20100 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a  ->ht = (x4node**
20110 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29  )&(x4a->tbl[64])
20120 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
20130 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d   i<64; i++) x4a-
20140 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
20150 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
20160 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
20170 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
20180 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
20190 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
201a0 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
201b0 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
201c0 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
201d0 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65  .int Configtable
201e0 5f 69 6e 73 65 72 74 28 64 61 74 61 29 0a 73 74  _insert(data).st
201f0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74  ruct config *dat
20200 61 3b 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e  a;.{.  x4node *n
20210 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  p;.  int h;.  in
20220 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61  t ph;..  if( x4a
20230 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
20240 20 20 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73    ph = confighas
20250 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70  h(data);.  h = p
20260 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31  h & (x4a->size-1
20270 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68  );.  np = x4a->h
20280 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
20290 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e  p ){.    if( Con
202a0 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  figcmp(np->data,
202b0 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20  data)==0 ){.    
202c0 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
202d0 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
202e0 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
202f0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
20300 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
20310 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
20320 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
20330 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
20340 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
20350 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e  .  }.  if( x4a->
20360 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65  count>=x4a->size
20370 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
20380 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
20390 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
203a0 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  .    int i,size;
203b0 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 34  .    struct s_x4
203c0 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
203d0 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20  y.size = size = 
203e0 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x4a->size*2;.   
203f0 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
20400 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  4a->count;.    a
20410 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f  rray.tbl = (x4no
20420 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20  de*)malloc(.    
20430 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65    (sizeof(x4node
20440 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64  ) + sizeof(x4nod
20450 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20  e*))*size );.   
20460 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
20470 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
20480 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
20490 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
204a0 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
204b0 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x4node**)&(array
204c0 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20  .tbl[size]);.   
204d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
204e0 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
204f0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
20500 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e  i=0; i<x4a->coun
20510 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
20520 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  4node *oldnp, *n
20530 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
20540 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69  p = &(x4a->tbl[i
20550 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f  ]);.      h = co
20560 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e  nfighash(oldnp->
20570 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29  data) & (size-1)
20580 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
20590 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
205a0 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
205b0 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
205c0 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
205d0 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
205e0 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
205f0 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
20600 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
20610 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
20620 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
20630 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
20640 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
20650 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
20660 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61    }.    free(x4a
20670 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61  ->tbl);.    *x4a
20680 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
20690 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
206a0 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
206b0 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d  ph & (x4a->size-
206c0 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61  1);.  np = &(x4a
206d0 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74  ->tbl[x4a->count
206e0 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61  ++]);.  np->data
206f0 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
20700 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d  4a->ht[h] ) x4a-
20710 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
20720 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
20730 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74  ->next = x4a->ht
20740 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68  [h];.  x4a->ht[h
20750 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
20760 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68  om = &(x4a->ht[h
20770 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
20780 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
20790 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
207a0 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
207b0 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
207c0 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
207d0 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
207e0 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
207f0 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 6b 65 79  igtable_find(key
20800 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
20810 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b  *key;.{.  int h;
20820 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x4node *np;..
20830 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72    if( x4a==0 ) r
20840 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63  eturn 0;.  h = c
20850 6f 6e 66 69 67 68 61 73 68 28 6b 65 79 29 20 26  onfighash(key) &
20860 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
20870 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68    np = x4a->ht[h
20880 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
20890 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67  {.    if( Config
208a0 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79  cmp(np->data,key
208b0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
208c0 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
208d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
208e0 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
208f0 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c  .}../* Remove al
20900 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  l data from the 
20910 74 61 62 6c 65 2e 20 20 50 61 73 73 20 65 61 63  table.  Pass eac
20920 68 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 75  h data to the fu
20930 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73  nction "f".** as
20940 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 20   it is removed. 
20950 20 28 22 66 22 20 6d 61 79 20 62 65 20 6e 75 6c   ("f" may be nul
20960 6c 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  l to avoid this 
20970 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43  step.) */.void C
20980 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72  onfigtable_clear
20990 28 66 29 0a 69 6e 74 28 2a 66 29 28 2f 2a 20 73  (f).int(*f)(/* s
209a0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a  truct config * *
209b0 2f 29 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  /);.{.  int i;. 
209c0 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78   if( x4a==0 || x
209d0 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72  4a->count==0 ) r
209e0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29  eturn;.  if( f )
209f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d   for(i=0; i<x4a-
20a00 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66  >count; i++) (*f
20a10 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61  )(x4a->tbl[i].da
20a20 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ta);.  for(i=0; 
20a30 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b  i<x4a->size; i++
20a40 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
20a50 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d  ;.  x4a->count =
20a60 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.