/ Hex Artifact Content
Login

Artifact 26d271a753ef87fe1e6194f53c594ab5e6783d85:


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 76 6f 69 64 20 52 65  n * */);.void Re
0b80: 73 6f 72 74 53 74 61 74 65 73 28 2f 2a 20 73 74  sortStates(/* st
0b90: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29  ruct lemon * */)
0ba0: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ;../********** F
0bb0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65  rom the file "se
0bc0: 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.h" ***********
0bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76  *************/.v
0bf0: 6f 69 64 20 20 53 65 74 53 69 7a 65 28 2f 2a 20  oid  SetSize(/* 
0c00: 69 6e 74 20 4e 20 2a 2f 29 3b 20 20 20 20 20 20  int N */);      
0c10: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 73 65         /* All se
0c20: 74 73 20 77 69 6c 6c 20 62 65 20 6f 66 20 73 69  ts will be of si
0c30: 7a 65 20 4e 20 2a 2f 0a 63 68 61 72 20 2a 53 65  ze N */.char *Se
0c40: 74 4e 65 77 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  tNew(/* void */)
0c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0c60: 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66 6f 72  /* A new set for
0c70: 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a 2f   element 0..N */
0c80: 0a 76 6f 69 64 20 20 53 65 74 46 72 65 65 28 2f  .void  SetFree(/
0c90: 2a 20 63 68 61 72 2a 20 2a 2f 29 3b 20 20 20 20  * char* */);    
0ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61 6c           /* Deal
0cb0: 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a  locate a set */.
0cc0: 0a 69 6e 74 20 53 65 74 41 64 64 28 2f 2a 20 63  .int SetAdd(/* c
0cd0: 68 61 72 2a 2c 69 6e 74 20 2a 2f 29 3b 20 20 20  har*,int */);   
0ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
0cf0: 65 6c 65 6d 65 6e 74 20 74 6f 20 61 20 73 65 74  element to a set
0d00: 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e   */.int SetUnion
0d10: 28 2f 2a 20 63 68 61 72 20 2a 41 2c 63 68 61 72  (/* char *A,char
0d20: 20 2a 42 20 2a 2f 29 3b 20 20 20 20 2f 2a 20 41   *B */);    /* A
0d30: 20 3c 2d 20 41 20 55 20 42 2c 20 74 68 72 75 20   <- A U B, thru 
0d40: 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f 0a 0a 23 64  element N */..#d
0d50: 65 66 69 6e 65 20 53 65 74 46 69 6e 64 28 58 2c  efine SetFind(X,
0d60: 59 29 20 28 58 5b 59 5d 29 20 20 20 20 20 20 20  Y) (X[Y])       
0d70: 2f 2a 20 54 72 75 65 20 69 66 20 59 20 69 73 20  /* True if Y is 
0d80: 69 6e 20 73 65 74 20 58 20 2a 2f 0a 0a 2f 2a 2a  in set X */../**
0d90: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
0da0: 65 20 66 69 6c 65 20 22 73 74 72 75 63 74 2e 68  e file "struct.h
0db0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
0dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0dd0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50  *******/./*.** P
0de0: 72 69 6e 63 69 70 61 6c 20 64 61 74 61 20 73 74  rincipal data st
0df0: 72 75 63 74 75 72 65 73 20 66 6f 72 20 74 68 65  ructures for the
0e00: 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
0e10: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 74 79 70  nerator..*/..typ
0e20: 65 64 65 66 20 65 6e 75 6d 20 7b 42 5f 46 41 4c  edef enum {B_FAL
0e30: 53 45 3d 30 2c 20 42 5f 54 52 55 45 7d 20 42 6f  SE=0, B_TRUE} Bo
0e40: 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62 6f  olean;../* Symbo
0e50: 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 61 6e  ls (terminals an
0e60: 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 29 20  d nonterminals) 
0e70: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 61  of the grammar a
0e80: 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
0e90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
0ea0: 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
0eb0: 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20  {.  char *name; 
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0ed0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d 62  Name of the symb
0ee0: 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65  ol */.  int inde
0ef0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
0f00: 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65 72   /* Index number
0f10: 20 66 6f 72 20 74 68 69 73 20 73 79 6d 62 6f 6c   for this symbol
0f20: 20 2a 2f 0a 20 20 65 6e 75 6d 20 7b 0a 20 20 20   */.  enum {.   
0f30: 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 20 20 4e   TERMINAL,.    N
0f40: 4f 4e 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 20 20  ONTERMINAL,.    
0f50: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 0a 20 20  MULTITERMINAL.  
0f60: 7d 20 74 79 70 65 3b 20 20 20 20 20 20 20 20 20  } type;         
0f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62           /* Symb
0f80: 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68  ols are all eith
0f90: 65 72 20 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20  er TERMINALS or 
0fa0: 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  NTs */.  struct 
0fb0: 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20  rule *rule;     
0fc0: 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74    /* Linked list
0fd0: 20 6f 66 20 72 75 6c 65 73 20 6f 66 20 74 68 69   of rules of thi
0fe0: 73 20 28 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a  s (if an NT) */.
0ff0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1000: 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a 20 66 61  *fallback; /* fa
1010: 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 69 6e 20  llback token in 
1020: 63 61 73 65 20 74 68 69 73 20 74 6f 6b 65 6e 20  case this token 
1030: 64 6f 65 73 6e 27 74 20 70 61 72 73 65 20 2a 2f  doesn't parse */
1040: 0a 20 20 69 6e 74 20 70 72 65 63 3b 20 20 20 20  .  int prec;    
1050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1060: 72 65 63 65 64 65 6e 63 65 20 69 66 20 64 65 66  recedence if def
1070: 69 6e 65 64 20 28 2d 31 20 6f 74 68 65 72 77 69  ined (-1 otherwi
1080: 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f  se) */.  enum e_
1090: 61 73 73 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54  assoc {.    LEFT
10a0: 2c 0a 20 20 20 20 52 49 47 48 54 2c 0a 20 20 20  ,.    RIGHT,.   
10b0: 20 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 20   NONE,.    UNK. 
10c0: 20 7d 20 61 73 73 6f 63 3b 20 20 20 20 20 20 20   } assoc;       
10d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
10e0: 6f 63 69 61 74 69 76 69 74 79 20 69 66 20 70 72  ociativity if pr
10f0: 65 64 65 63 65 6e 63 65 20 69 73 20 64 65 66 69  edecence is defi
1100: 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66  ned */.  char *f
1110: 69 72 73 74 73 65 74 3b 20 20 20 20 20 20 20 20  irstset;        
1120: 20 20 2f 2a 20 46 69 72 73 74 2d 73 65 74 20 66    /* First-set f
1130: 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20 6f 66 20  or all rules of 
1140: 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20  this symbol */. 
1150: 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62 64 61 3b   Boolean lambda;
1160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1170: 65 20 69 66 20 4e 54 20 61 6e 64 20 63 61 6e 20  e if NT and can 
1180: 67 65 6e 65 72 61 74 65 20 61 6e 20 65 6d 70 74  generate an empt
1190: 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68  y string */.  ch
11a0: 61 72 20 2a 64 65 73 74 72 75 63 74 6f 72 3b 20  ar *destructor; 
11b0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 77         /* Code w
11c0: 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
11d0: 65 6e 65 76 65 72 20 74 68 69 73 20 73 79 6d 62  enever this symb
11e0: 6f 6c 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  ol is.          
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 2a 2a 20 70 6f 70 70 65 64 20 66 72 6f 6d 20   ** popped from 
1210: 74 68 65 20 73 74 61 63 6b 20 64 75 72 69 6e 67  the stack during
1220: 20 65 72 72 6f 72 20 70 72 6f 63 65 73 73 69 6e   error processin
1230: 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 72  g */.  int destr
1240: 75 63 74 6f 72 6c 6e 3b 20 20 20 20 20 20 20 20  uctorln;        
1250: 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f  /* Line number o
1260: 66 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64  f destructor cod
1270: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 61 74  e */.  char *dat
1280: 61 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20  atype;          
1290: 2f 2a 20 54 68 65 20 64 61 74 61 20 74 79 70 65  /* The data type
12a0: 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   of information 
12b0: 68 65 6c 64 20 62 79 20 74 68 69 73 0a 20 20 20  held by this.   
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63          ** objec
12e0: 74 2e 20 4f 6e 6c 79 20 75 73 65 64 20 69 66 20  t. Only used if 
12f0: 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type==NONTERMINA
1300: 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d  L */.  int dtnum
1310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1320: 2f 2a 20 54 68 65 20 64 61 74 61 20 74 79 70 65  /* The data type
1330: 20 6e 75 6d 62 65 72 2e 20 20 49 6e 20 74 68 65   number.  In the
1340: 20 70 61 72 73 65 72 2c 20 74 68 65 20 76 61 6c   parser, the val
1350: 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ue.             
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1370: 20 73 74 61 63 6b 20 69 73 20 61 20 75 6e 69 6f   stack is a unio
1380: 6e 2e 20 20 54 68 65 20 2e 79 79 25 64 20 65 6c  n.  The .yy%d el
1390: 65 6d 65 6e 74 20 6f 66 20 74 68 69 73 0a 20 20  ement of this.  
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f           ** unio
13c0: 6e 20 69 73 20 74 68 65 20 63 6f 72 72 65 63 74  n is the correct
13d0: 20 64 61 74 61 20 74 79 70 65 20 66 6f 72 20 74   data type for t
13e0: 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
13f0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1400: 20 66 69 65 6c 64 73 20 61 72 65 20 75 73 65 64   fields are used
1410: 20 62 79 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41   by MULTITERMINA
1420: 4c 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74  Ls only */.  int
1430: 20 6e 73 75 62 73 79 6d 3b 20 20 20 20 20 20 20   nsubsym;       
1440: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1450: 6f 66 20 63 6f 6e 73 74 69 74 75 65 6e 74 20 73  of constituent s
1460: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 4d 55  ymbols in the MU
1470: 4c 54 49 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  LTI */.  struct 
1480: 73 79 6d 62 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b  symbol **subsym;
1490: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f    /* Array of co
14a0: 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c  nstituent symbol
14b0: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68  s */.};../* Each
14c0: 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65   production rule
14d0: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
14e0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
14f0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
1500: 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72  ructure.  */.str
1510: 75 63 74 20 72 75 6c 65 20 7b 0a 20 20 73 74 72  uct rule {.  str
1520: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b  uct symbol *lhs;
1530: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61        /* Left-ha
1540: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 72  nd side of the r
1550: 75 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ule */.  char *l
1560: 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20 20 20  hsalias;        
1570: 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74    /* Alias for t
1580: 68 65 20 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20  he LHS (NULL if 
1590: 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 72  none) */.  int r
15a0: 75 6c 65 6c 69 6e 65 3b 20 20 20 20 20 20 20 20  uleline;        
15b0: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
15c0: 65 72 20 66 6f 72 20 74 68 65 20 72 75 6c 65 20  er for the rule 
15d0: 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20  */.  int nrhs;  
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15f0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 48 53 20 73   Number of RHS s
1600: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75  ymbols */.  stru
1610: 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 72 68 73 3b  ct symbol **rhs;
1620: 20 20 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20       /* The RHS 
1630: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61  symbols */.  cha
1640: 72 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20  r **rhsalias;   
1650: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 6c 69 61        /* An alia
1660: 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 73  s for each RHS s
1670: 79 6d 62 6f 6c 20 28 4e 55 4c 4c 20 69 66 20 6e  ymbol (NULL if n
1680: 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 69  one) */.  int li
1690: 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ne;             
16a0: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
16b0: 72 20 61 74 20 77 68 69 63 68 20 63 6f 64 65 20  r at which code 
16c0: 62 65 67 69 6e 73 20 2a 2f 0a 20 20 63 68 61 72  begins */.  char
16d0: 20 2a 63 6f 64 65 3b 20 20 20 20 20 20 20 20 20   *code;         
16e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
16f0: 20 65 78 65 63 75 74 65 64 20 77 68 65 6e 20 74   executed when t
1700: 68 69 73 20 72 75 6c 65 20 69 73 20 72 65 64 75  his rule is redu
1710: 63 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ced */.  struct 
1720: 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d 3b  symbol *precsym;
1730: 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20    /* Precedence 
1740: 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73 20  symbol for this 
1750: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  rule */.  int in
1760: 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1770: 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6e     /* An index n
1780: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 72  umber for this r
1790: 75 6c 65 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e  ule */.  Boolean
17a0: 20 63 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20   canReduce;     
17b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
17c0: 73 20 72 75 6c 65 20 69 73 20 65 76 65 72 20 72  s rule is ever r
17d0: 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74 72 75  educed */.  stru
17e0: 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 6c 68 73  ct rule *nextlhs
17f0: 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c  ;    /* Next rul
1800: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
1810: 4c 48 53 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  LHS */.  struct 
1820: 72 75 6c 65 20 2a 6e 65 78 74 3b 20 20 20 20 20  rule *next;     
1830: 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20 69    /* Next rule i
1840: 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73  n the global lis
1850: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 20 63 6f  t */.};../* A co
1860: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 61  nfiguration is a
1870: 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65   production rule
1880: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
1890: 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a  together with.**
18a0: 20 61 20 6d 61 72 6b 20 28 64 6f 74 29 20 73 68   a mark (dot) sh
18b0: 6f 77 69 6e 67 20 68 6f 77 20 6d 75 63 68 20 6f  owing how much o
18c0: 66 20 74 68 61 74 20 72 75 6c 65 20 68 61 73 20  f that rule has 
18d0: 62 65 65 6e 20 70 72 6f 63 65 73 73 65 64 20 73  been processed s
18e0: 6f 20 66 61 72 2e 0a 2a 2a 20 43 6f 6e 66 69 67  o far..** Config
18f0: 75 72 61 74 69 6f 6e 73 20 61 6c 73 6f 20 63 6f  urations also co
1900: 6e 74 61 69 6e 20 61 20 66 6f 6c 6c 6f 77 2d 73  ntain a follow-s
1910: 65 74 20 77 68 69 63 68 20 69 73 20 61 20 6c 69  et which is a li
1920: 73 74 20 6f 66 20 74 65 72 6d 69 6e 61 6c 0a 2a  st of terminal.*
1930: 2a 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  * symbols which 
1940: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 69  are allowed to i
1950: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
1960: 77 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  w the end of the
1970: 20 72 75 6c 65 2e 0a 2a 2a 20 45 76 65 72 79 20   rule..** Every 
1980: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73  configuration is
1990: 20 72 65 63 6f 72 64 65 64 20 61 73 20 61 6e 20   recorded as an 
19a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
19b0: 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73 74  following: */.st
19c0: 72 75 63 74 20 63 6f 6e 66 69 67 20 7b 0a 20 20  ruct config {.  
19d0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
19e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19f0: 72 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20  rule upon which 
1a00: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
1a10: 6e 20 69 73 20 62 61 73 65 64 20 2a 2f 0a 20 20  n is based */.  
1a20: 69 6e 74 20 64 6f 74 3b 20 20 20 20 20 20 20 20  int dot;        
1a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a40: 70 61 72 73 65 20 70 6f 69 6e 74 20 2a 2f 0a 20  parse point */. 
1a50: 20 63 68 61 72 20 2a 66 77 73 3b 20 20 20 20 20   char *fws;     
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 6c            /* Fol
1a70: 6c 6f 77 2d 73 65 74 20 66 6f 72 20 74 68 69 73  low-set for this
1a80: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
1a90: 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1aa0: 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b 20 20 20 20  plink *fplp;    
1ab0: 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20    /* Follow-set 
1ac0: 66 6f 72 77 61 72 64 20 70 72 6f 70 61 67 61 74  forward propagat
1ad0: 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73  ion links */.  s
1ae0: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 62 70 6c  truct plink *bpl
1af0: 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f  p;      /* Follo
1b00: 77 2d 73 65 74 20 62 61 63 6b 77 61 72 64 73 20  w-set backwards 
1b10: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
1b20: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  s */.  struct st
1b30: 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 20 20  ate *stp;       
1b40: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  /* Pointer to st
1b50: 61 74 65 20 77 68 69 63 68 20 63 6f 6e 74 61 69  ate which contai
1b60: 6e 73 20 74 68 69 73 20 2a 2f 0a 20 20 65 6e 75  ns this */.  enu
1b70: 6d 20 7b 0a 20 20 20 20 43 4f 4d 50 4c 45 54 45  m {.    COMPLETE
1b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1b90: 2a 20 54 68 65 20 73 74 61 74 75 73 20 69 73 20  * The status is 
1ba0: 75 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c  used during foll
1bb0: 6f 77 73 65 74 20 61 6e 64 20 2a 2f 0a 20 20 20  owset and */.   
1bc0: 20 49 4e 43 4f 4d 50 4c 45 54 45 20 20 20 20 20   INCOMPLETE     
1bd0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 73 68          /*    sh
1be0: 69 66 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 73  ift computations
1bf0: 20 2a 2f 0a 20 20 7d 20 73 74 61 74 75 73 3b 0a   */.  } status;.
1c00: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
1c10: 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65  *next;     /* Ne
1c20: 78 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  xt configuration
1c30: 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f   in the state */
1c40: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
1c50: 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *bp;       /* T
1c60: 68 65 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f  he next basis co
1c70: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d  nfiguration */.}
1c80: 3b 0a 0a 2f 2a 20 45 76 65 72 79 20 73 68 69 66  ;../* Every shif
1c90: 74 20 6f 72 20 72 65 64 75 63 65 20 6f 70 65 72  t or reduce oper
1ca0: 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20  ation is stored 
1cb0: 61 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  as one of the fo
1cc0: 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 72 75 63  llowing */.struc
1cd0: 74 20 61 63 74 69 6f 6e 20 7b 0a 20 20 73 74 72  t action {.  str
1ce0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20  uct symbol *sp; 
1cf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
1d00: 6b 2d 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 2a  k-ahead symbol *
1d10: 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f  /.  enum e_actio
1d20: 6e 20 7b 0a 20 20 20 20 53 48 49 46 54 2c 0a 20  n {.    SHIFT,. 
1d30: 20 20 20 41 43 43 45 50 54 2c 0a 20 20 20 20 52     ACCEPT,.    R
1d40: 45 44 55 43 45 2c 0a 20 20 20 20 45 52 52 4f 52  EDUCE,.    ERROR
1d50: 2c 0a 20 20 20 20 43 4f 4e 46 4c 49 43 54 2c 20  ,.    CONFLICT, 
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d70: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
1d80: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
1d90: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 53 48  nflict */.    SH
1da0: 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20  _RESOLVED,      
1db0: 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20         /* Was a 
1dc0: 73 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e  shift.  Preceden
1dd0: 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66  ce resolved conf
1de0: 6c 69 63 74 20 2a 2f 0a 20 20 20 20 52 44 5f 52  lict */.    RD_R
1df0: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
1e00: 20 20 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75       /* Was redu
1e10: 63 65 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20  ce.  Precedence 
1e20: 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63  resolved conflic
1e30: 74 20 2a 2f 0a 20 20 20 20 4e 4f 54 5f 55 53 45  t */.    NOT_USE
1e40: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
1e50: 20 20 2f 2a 20 44 65 6c 65 74 65 64 20 62 79 20    /* Deleted by 
1e60: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  compression */. 
1e70: 20 7d 20 74 79 70 65 3b 0a 20 20 75 6e 69 6f 6e   } type;.  union
1e80: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74   {.    struct st
1e90: 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a  ate *stp;     /*
1ea0: 20 54 68 65 20 6e 65 77 20 73 74 61 74 65 2c 20   The new state, 
1eb0: 69 66 20 61 20 73 68 69 66 74 20 2a 2f 0a 20 20  if a shift */.  
1ec0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1ed0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
1ee0: 72 75 6c 65 2c 20 69 66 20 61 20 72 65 64 75 63  rule, if a reduc
1ef0: 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20 20 73 74  e */.  } x;.  st
1f00: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78  ruct action *nex
1f10: 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61  t;     /* Next a
1f20: 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 73  ction for this s
1f30: 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  tate */.  struct
1f40: 20 61 63 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65   action *collide
1f50: 3b 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f  ;  /* Next actio
1f60: 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
1f70: 68 61 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45  hash */.};../* E
1f80: 61 63 68 20 73 74 61 74 65 20 6f 66 20 74 68 65  ach state of the
1f90: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
1fa0: 72 27 73 20 66 69 6e 69 74 65 20 73 74 61 74 65  r's finite state
1fb0: 20 6d 61 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65   machine.** is e
1fc0: 6e 63 6f 64 65 64 20 61 73 20 61 6e 20 69 6e 73  ncoded as an ins
1fd0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1fe0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1ff0: 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
2000: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  e {.  struct con
2010: 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f  fig *bp;       /
2020: 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66  * The basis conf
2030: 69 67 75 72 61 74 69 6f 6e 73 20 66 6f 72 20 74  igurations for t
2040: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
2050: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
2060: 70 3b 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63  p;      /* All c
2070: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 69 6e  onfigurations in
2080: 20 74 68 69 73 20 73 65 74 20 2a 2f 0a 20 20 69   this set */.  i
2090: 6e 74 20 73 74 61 74 65 6e 75 6d 3b 20 20 20 20  nt statenum;    
20a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65          /* Seque
20b0: 6e 63 69 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72  ncial number for
20c0: 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20   this state */. 
20d0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
20e0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ap;       /* Arr
20f0: 61 79 20 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f  ay of actions fo
2100: 72 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a  r this state */.
2110: 20 20 69 6e 74 20 6e 54 6b 6e 41 63 74 2c 20 6e    int nTknAct, n
2120: 4e 74 41 63 74 3b 20 20 20 20 20 2f 2a 20 4e 75  NtAct;     /* Nu
2130: 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
2140: 6f 6e 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  on terminals and
2150: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 2a 2f   nonterminals */
2160: 0a 20 20 69 6e 74 20 69 54 6b 6e 4f 66 73 74 2c  .  int iTknOfst,
2170: 20 69 4e 74 4f 66 73 74 3b 20 20 20 2f 2a 20 79   iNtOfst;   /* y
2180: 79 5f 61 63 74 69 6f 6e 5b 5d 20 6f 66 66 73 65  y_action[] offse
2190: 74 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 73 20  t for terminals 
21a0: 61 6e 64 20 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a  and nonterms */.
21b0: 20 20 69 6e 74 20 69 44 66 6c 74 3b 20 20 20 20    int iDflt;    
21c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
21d0: 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 2a 2f 0a  fault action */.
21e0: 7d 3b 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46  };.#define NO_OF
21f0: 46 53 45 54 20 28 2d 32 31 34 37 34 38 33 36 34  FSET (-214748364
2200: 37 29 0a 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73  7)../* A follows
2210: 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  et propagation l
2220: 69 6e 6b 20 69 6e 64 69 63 61 74 65 73 20 74 68  ink indicates th
2230: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
2240: 6f 66 20 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67  of one.** config
2250: 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65  uration followse
2260: 74 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 70  t should be prop
2270: 61 67 61 74 65 64 20 74 6f 20 61 6e 6f 74 68 65  agated to anothe
2280: 72 20 77 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68  r whenever.** th
2290: 65 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 2e  e first changes.
22a0: 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b   */.struct plink
22b0: 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
22c0: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
22d0: 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   The configurati
22e0: 6f 6e 20 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b  on to which link
22f0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70  ed */.  struct p
2300: 6c 69 6e 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20  link *next;     
2310: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 72 6f   /* The next pro
2320: 70 61 67 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d  pagate link */.}
2330: 3b 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20  ;../* The state 
2340: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 65  vector for the e
2350: 6e 74 69 72 65 20 70 61 72 73 65 72 20 67 65 6e  ntire parser gen
2360: 65 72 61 74 6f 72 20 69 73 20 72 65 63 6f 72 64  erator is record
2370: 65 64 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  ed as.** follows
2380: 2e 20 20 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e  .  (LEMON uses n
2390: 6f 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  o global variabl
23a0: 65 73 20 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74  es and makes lit
23b0: 74 6c 65 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74  tle use of.** st
23c0: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 2e 20  atic variables. 
23d0: 20 46 69 65 6c 64 73 20 69 6e 20 74 68 65 20 66   Fields in the f
23e0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
23f0: 72 65 20 63 61 6e 20 62 65 20 74 68 6f 75 67 68  re can be though
2400: 74 0a 2a 2a 20 6f 66 20 61 73 20 62 65 67 69 6e  t.** of as begin
2410: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
2420: 73 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d  s in the program
2430: 2e 29 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d  .) */.struct lem
2440: 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  on {.  struct st
2450: 61 74 65 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20  ate **sorted;   
2460: 2f 2a 20 54 61 62 6c 65 20 6f 66 20 73 74 61 74  /* Table of stat
2470: 65 73 20 73 6f 72 74 65 64 20 62 79 20 73 74 61  es sorted by sta
2480: 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  te number */.  s
2490: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65  truct rule *rule
24a0: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
24b0: 6f 66 20 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a  of all rules */.
24c0: 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20 20    int nstate;   
24d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24e0: 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20 2a  mber of states *
24f0: 2f 0a 20 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20  /.  int nrule;  
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2510: 4e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20  Number of rules 
2520: 2a 2f 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c  */.  int nsymbol
2530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2540: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 69   Number of termi
2550: 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69  nal and nontermi
2560: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  nal symbols */. 
2570: 20 69 6e 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20   int nterminal; 
2580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2590: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
25a0: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72  symbols */.  str
25b0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d  uct symbol **sym
25c0: 62 6f 6c 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20  bols; /* Sorted 
25d0: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
25e0: 73 20 74 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  s to symbols */.
25f0: 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
2600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2610: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a  mber of errors *
2620: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
2630: 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20  l *errsym;   /* 
2640: 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c  The error symbol
2650: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65   */.  char *name
2660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2670: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 67 65  * Name of the ge
2680: 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a  nerated parser *
2690: 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 20 20  /.  char *arg;  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b0: 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74  Declaration of t
26c0: 68 65 20 33 74 68 20 61 72 67 75 6d 65 6e 74 20  he 3th argument 
26d0: 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63  to parser */.  c
26e0: 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70 65 3b 20  har *tokentype; 
26f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
2700: 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  of terminal symb
2710: 6f 6c 73 20 69 6e 20 74 68 65 20 70 61 72 73 65  ols in the parse
2720: 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61  r stack */.  cha
2730: 72 20 2a 76 61 72 74 79 70 65 3b 20 20 20 20 20  r *vartype;     
2740: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 65 66        /* The def
2750: 61 75 6c 74 20 74 79 70 65 20 6f 66 20 6e 6f 6e  ault type of non
2760: 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  -terminal symbol
2770: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 61  s */.  char *sta
2780: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rt;             
2790: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
27a0: 74 61 72 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20  tart symbol for 
27b0: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
27c0: 20 63 68 61 72 20 2a 73 74 61 63 6b 73 69 7a 65   char *stacksize
27d0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ;         /* Siz
27e0: 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  e of the parser 
27f0: 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20  stack */.  char 
2800: 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20 20 20 20  *include;       
2810: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70      /* Code to p
2820: 75 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ut at the start 
2830: 6f 66 20 74 68 65 20 43 20 66 69 6c 65 20 2a 2f  of the C file */
2840: 0a 20 20 69 6e 74 20 20 69 6e 63 6c 75 64 65 6c  .  int  includel
2850: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  n;          /* L
2860: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  ine number for s
2870: 74 61 72 74 20 6f 66 20 69 6e 63 6c 75 64 65 20  tart of include 
2880: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
2890: 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  error;          
28a0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
28b0: 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65 72  ecute when an er
28c0: 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  ror is seen */. 
28d0: 20 69 6e 74 20 20 65 72 72 6f 72 6c 6e 3b 20 20   int  errorln;  
28e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
28f0: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61  e number for sta
2900: 72 74 20 6f 66 20 65 72 72 6f 72 20 63 6f 64 65  rt of error code
2910: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65 72   */.  char *over
2920: 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f  flow;          /
2930: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
2940: 65 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76 65  e on a stack ove
2950: 72 66 6c 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 20  rflow */.  int  
2960: 6f 76 65 72 66 6c 6f 77 6c 6e 3b 20 20 20 20 20  overflowln;     
2970: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
2980: 65 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  er for start of 
2990: 6f 76 65 72 66 6c 6f 77 20 63 6f 64 65 20 2a 2f  overflow code */
29a0: 0a 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65  .  char *failure
29b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
29c0: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
29d0: 6e 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65  n parser failure
29e0: 20 2a 2f 0a 20 20 69 6e 74 20 20 66 61 69 6c 75   */.  int  failu
29f0: 72 65 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  reln;          /
2a00: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
2a10: 72 20 73 74 61 72 74 20 6f 66 20 66 61 69 6c 75  r start of failu
2a20: 72 65 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  re code */.  cha
2a30: 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20  r *accept;      
2a40: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
2a50: 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 74 68   execute when th
2a60: 65 20 70 61 72 73 65 72 20 65 78 63 65 70 74 73  e parser excepts
2a70: 20 2a 2f 0a 20 20 69 6e 74 20 20 61 63 63 65 70   */.  int  accep
2a80: 74 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  tln;           /
2a90: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
2aa0: 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  r the start of a
2ab0: 63 63 65 70 74 20 63 6f 64 65 20 2a 2f 0a 20 20  ccept code */.  
2ac0: 63 68 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b  char *extracode;
2ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2ae0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2af0: 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20   generated file 
2b00: 2a 2f 0a 20 20 69 6e 74 20 20 65 78 74 72 61 63  */.  int  extrac
2b10: 6f 64 65 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a  odeln;        /*
2b20: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
2b30: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2b40: 65 20 65 78 74 72 61 20 63 6f 64 65 20 2a 2f 0a  e extra code */.
2b50: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65 73    char *tokendes
2b60: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  t;         /* Co
2b70: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74 6f  de to execute to
2b80: 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20 64   destroy token d
2b90: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 20 74 6f  ata */.  int  to
2ba0: 6b 65 6e 64 65 73 74 6c 6e 3b 20 20 20 20 20 20  kendestln;      
2bb0: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
2bc0: 20 66 6f 72 20 74 6f 6b 65 6e 20 64 65 73 74 72   for token destr
2bd0: 6f 79 65 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  oyer code */.  c
2be0: 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20 20  har *vardest;   
2bf0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2c00: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
2c10: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73  non-terminal des
2c20: 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  tructor */.  int
2c30: 20 20 76 61 72 64 65 73 74 6c 6e 3b 20 20 20 20    vardestln;    
2c40: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
2c50: 6d 62 65 72 20 66 6f 72 20 64 65 66 61 75 6c 74  mber for default
2c60: 20 6e 6f 6e 2d 74 65 72 6d 20 64 65 73 74 72 75   non-term destru
2c70: 63 74 6f 72 20 63 6f 64 65 2a 2f 0a 20 20 63 68  ctor code*/.  ch
2c80: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
2c90: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2ca0: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
2cb0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e   */.  char *outn
2cc0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
2cd0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  * Name of the cu
2ce0: 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c  rrent output fil
2cf0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
2d00: 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20  enprefix;       
2d10: 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65  /* A prefix adde
2d20: 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73  d to token names
2d30: 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20   in the .h file 
2d40: 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69  */.  int nconfli
2d50: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct;           /*
2d60: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69   Number of parsi
2d70: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ng conflicts */.
2d80: 20 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b    int tablesize;
2d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2da0: 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 20  ze of the parse 
2db0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  tables */.  int 
2dc0: 62 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20  basisflag;      
2dd0: 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e       /* Print on
2de0: 6c 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  ly basis configu
2df0: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
2e00: 20 68 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20   has_fallback;  
2e10: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e20: 20 61 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69   any %fallback i
2e30: 73 20 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72  s seen in the gr
2e40: 61 6d 6d 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  ammer */.  char 
2e50: 2a 61 72 67 76 30 3b 20 20 20 20 20 20 20 20 20  *argv0;         
2e60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2e70: 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b  he program */.};
2e80: 0a 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79  ..#define Memory
2e90: 43 68 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d  Check(X) if((X)=
2ea0: 3d 30 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20  =0){ \.  extern 
2eb0: 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
2ec0: 72 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f  r(); \.  memory_
2ed0: 65 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a  error(); \.}../*
2ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2ef0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
2f00: 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.h" ********
2f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
2f30: 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69   All code in thi
2f40: 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  s file has been 
2f50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
2f60: 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  nerated.** from 
2f70: 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  a specification 
2f80: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62              "tab
2fa0: 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20  le.q".** by the 
2fb0: 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
2fc0: 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20  y code building 
2fd0: 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e  program "aagen".
2fe0: 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20  .** Do not edit 
2ff0: 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74  this file!  Inst
3000: 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70  ead, edit the sp
3010: 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66  ecification.** f
3020: 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20  ile, then rerun 
3030: 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  aagen..*/./*.** 
3040: 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73  Code for process
3050: 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ing tables in th
3060: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
3070: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
3080: 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61   Routines for ha
3090: 6e 64 6c 69 6e 67 20 61 20 73 74 72 69 6e 67 73  ndling a strings
30a0: 20 2a 2f 0a 0a 63 68 61 72 20 2a 53 74 72 73 61   */..char *Strsa
30b0: 66 65 28 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73  fe();..void Strs
30c0: 61 66 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  afe_init(/* void
30d0: 20 2a 2f 29 3b 0a 69 6e 74 20 53 74 72 73 61 66   */);.int Strsaf
30e0: 65 5f 69 6e 73 65 72 74 28 2f 2a 20 63 68 61 72  e_insert(/* char
30f0: 20 2a 20 2a 2f 29 3b 0a 63 68 61 72 20 2a 53 74   * */);.char *St
3100: 72 73 61 66 65 5f 66 69 6e 64 28 2f 2a 20 63 68  rsafe_find(/* ch
3110: 61 72 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f  ar * */);../* Ro
3120: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
3130: 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74  ing symbols of t
3140: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73  he grammar */..s
3150: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
3160: 6d 62 6f 6c 5f 6e 65 77 28 29 3b 0a 69 6e 74 20  mbol_new();.int 
3170: 53 79 6d 62 6f 6c 63 6d 70 70 28 2f 2a 20 73 74  Symbolcmpp(/* st
3180: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 2c 20  ruct symbol **, 
3190: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
31a0: 20 2a 2f 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f   */);.void Symbo
31b0: 6c 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a  l_init(/* void *
31c0: 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69  /);.int Symbol_i
31d0: 6e 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74 20  nsert(/* struct 
31e0: 73 79 6d 62 6f 6c 20 2a 2c 20 63 68 61 72 20 2a  symbol *, char *
31f0: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 79 6d   */);.struct sym
3200: 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
3210: 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a  (/* char * */);.
3220: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
3230: 79 6d 62 6f 6c 5f 4e 74 68 28 2f 2a 20 69 6e 74  ymbol_Nth(/* int
3240: 20 2a 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c   */);.int Symbol
3250: 5f 63 6f 75 6e 74 28 2f 2a 20 20 2a 2f 29 3b 0a  _count(/*  */);.
3260: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3270: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 2f  Symbol_arrayof(/
3280: 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74  *  */);../* Rout
3290: 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67 65 20 74  ines to manage t
32a0: 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a  he state table *
32b0: 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70  /..int Configcmp
32c0: 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69  (/* struct confi
32d0: 67 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  g *, struct conf
32e0: 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ig * */);.struct
32f0: 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65   state *State_ne
3300: 77 28 29 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f  w();.void State_
3310: 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  init(/* void */)
3320: 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  ;.int State_inse
3330: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 73 74 61  rt(/* struct sta
3340: 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e  te *, struct con
3350: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
3360: 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66  t state *State_f
3370: 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63 6f  ind(/* struct co
3380: 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75  nfig * */);.stru
3390: 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65  ct state **State
33a0: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
33b0: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75  ;../* Routines u
33c0: 73 65 64 20 66 6f 72 20 65 66 66 69 63 69 65 6e  sed for efficien
33d0: 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74  cy in Configlist
33e0: 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f  _add */..void Co
33f0: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 2f  nfigtable_init(/
3400: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
3410: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65  Configtable_inse
3420: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e  rt(/* struct con
3430: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
3440: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
3450: 74 61 62 6c 65 5f 66 69 6e 64 28 2f 2a 20 73 74  table_find(/* st
3460: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f  ruct config * */
3470: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  );.void Configta
3480: 62 6c 65 5f 63 6c 65 61 72 28 2f 2a 20 69 6e 74  ble_clear(/* int
3490: 28 2a 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69  (*)(struct confi
34a0: 67 20 2a 29 20 2a 2f 29 3b 0a 2f 2a 2a 2a 2a 2a  g *) */);./*****
34b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
34c0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61 63 74  om the file "act
34d0: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
34e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34f0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
3500: 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
3510: 67 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73  g parser actions
3520: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
3530: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
3540: 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  */../* Allocate 
3550: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
3560: 69 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 61 63  ion */.struct ac
3570: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77  tion *Action_new
3580: 28 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  (){.  static str
3590: 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65 65  uct action *free
35a0: 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  list = 0;.  stru
35b0: 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a  ct action *new;.
35c0: 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d  .  if( freelist=
35d0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
35e0: 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31  .    int amt = 1
35f0: 30 30 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74  00;.    freelist
3600: 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f   = (struct actio
3610: 6e 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  n *)malloc( size
3620: 6f 66 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  of(struct action
3630: 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69 66 28  )*amt );.    if(
3640: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
3650: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
3660: 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20  derr,"Unable to 
3670: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
3680: 66 6f 72 20 61 20 6e 65 77 20 70 61 72 73 65 72  for a new parser
3690: 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20   action.");.    
36a0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
36b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
36c0: 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65  amt-1; i++) free
36d0: 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26  list[i].next = &
36e0: 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
36f0: 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d     freelist[amt-
3700: 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  1].next = 0;.  }
3710: 0a 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73  .  new = freelis
3720: 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20  t;.  freelist = 
3730: 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
3740: 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a    return new;.}.
3750: 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
3760: 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  actions */.stati
3770: 63 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28  c int actioncmp(
3780: 61 70 31 2c 61 70 32 29 0a 73 74 72 75 63 74 20  ap1,ap2).struct 
3790: 61 63 74 69 6f 6e 20 2a 61 70 31 3b 0a 73 74 72  action *ap1;.str
37a0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 32 3b  uct action *ap2;
37b0: 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  .{.  int rc;.  r
37c0: 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64  c = ap1->sp->ind
37d0: 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e  ex - ap2->sp->in
37e0: 64 65 78 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  dex;.  if( rc==0
37f0: 20 29 20 72 63 20 3d 20 28 69 6e 74 29 61 70 31   ) rc = (int)ap1
3800: 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61 70  ->type - (int)ap
3810: 32 2d 3e 74 79 70 65 3b 0a 20 20 69 66 28 20 72  2->type;.  if( r
3820: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  c==0 ){.    asse
3830: 72 74 28 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52  rt( ap1->type==R
3840: 45 44 55 43 45 20 7c 7c 20 61 70 31 2d 3e 74 79  EDUCE || ap1->ty
3850: 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20  pe==RD_RESOLVED 
3860: 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d 3d 43 4f  || ap1->type==CO
3870: 4e 46 4c 49 43 54 29 3b 0a 20 20 20 20 61 73 73  NFLICT);.    ass
3880: 65 72 74 28 20 61 70 32 2d 3e 74 79 70 65 3d 3d  ert( ap2->type==
3890: 52 45 44 55 43 45 20 7c 7c 20 61 70 32 2d 3e 74  REDUCE || ap2->t
38a0: 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44  ype==RD_RESOLVED
38b0: 20 7c 7c 20 61 70 32 2d 3e 74 79 70 65 3d 3d 43   || ap2->type==C
38c0: 4f 4e 46 4c 49 43 54 29 3b 0a 20 20 20 20 72 63  ONFLICT);.    rc
38d0: 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e   = ap1->x.rp->in
38e0: 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d  dex - ap2->x.rp-
38f0: 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 72 65  >index;.  }.  re
3900: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53  turn rc;.}../* S
3910: 6f 72 74 20 70 61 72 73 65 72 20 61 63 74 69 6f  ort parser actio
3920: 6e 73 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74  ns */.struct act
3930: 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74  ion *Action_sort
3940: 28 61 70 29 0a 73 74 72 75 63 74 20 61 63 74 69  (ap).struct acti
3950: 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20 61 70 20 3d  on *ap;.{.  ap =
3960: 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20   (struct action 
3970: 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29  *)msort((char *)
3980: 61 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70 2d  ap,(char **)&ap-
3990: 3e 6e 65 78 74 2c 61 63 74 69 6f 6e 63 6d 70 29  >next,actioncmp)
39a0: 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d  ;.  return ap;.}
39b0: 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64  ..void Action_ad
39c0: 64 28 61 70 70 2c 74 79 70 65 2c 73 70 2c 61 72  d(app,type,sp,ar
39d0: 67 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  g).struct action
39e0: 20 2a 2a 61 70 70 3b 0a 65 6e 75 6d 20 65 5f 61   **app;.enum e_a
39f0: 63 74 69 6f 6e 20 74 79 70 65 3b 0a 73 74 72 75  ction type;.stru
3a00: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 63  ct symbol *sp;.c
3a10: 68 61 72 20 2a 61 72 67 3b 0a 7b 0a 20 20 73 74  har *arg;.{.  st
3a20: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77  ruct action *new
3a30: 3b 0a 20 20 6e 65 77 20 3d 20 41 63 74 69 6f 6e  ;.  new = Action
3a40: 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e  _new();.  new->n
3a50: 65 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61  ext = *app;.  *a
3a60: 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d  pp = new;.  new-
3a70: 3e 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20 20  >type = type;.  
3a80: 6e 65 77 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20  new->sp = sp;.  
3a90: 69 66 28 20 74 79 70 65 3d 3d 53 48 49 46 54 20  if( type==SHIFT 
3aa0: 29 7b 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 73 74  ){.    new->x.st
3ab0: 70 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74  p = (struct stat
3ac0: 65 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65  e *)arg;.  }else
3ad0: 7b 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 72 70 20  {.    new->x.rp 
3ae0: 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  = (struct rule *
3af0: 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a  )arg;.  }.}./***
3b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b10: 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f 20  *** New code to 
3b20: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 61  implement the "a
3b30: 63 74 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a 2a  cttab" module **
3b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
3b50: 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70   This module imp
3b60: 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65 73  lements routines
3b70: 20 75 73 65 20 74 6f 20 63 6f 6e 73 74 72 75 63   use to construc
3b80: 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b  t the yy_action[
3b90: 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a  ] table..*/../*.
3ba0: 2a 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20  ** The state of 
3bb0: 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61  the yy_action ta
3bc0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
3bd0: 75 63 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73  uction is an ins
3be0: 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20  tance of.** the 
3bf0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
3c00: 75 72 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ure.*/.typedef s
3c10: 74 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74  truct acttab act
3c20: 74 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74  tab;.struct actt
3c30: 61 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69  ab {.  int nActi
3c40: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
3c50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3c60: 20 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61   used slots in a
3c70: 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e  Action[] */.  in
3c80: 74 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20  t nActionAlloc; 
3c90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c             /* Sl
3ca0: 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ots allocated fo
3cb0: 72 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20  r aAction[] */. 
3cc0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 69 6e   struct {.    in
3cd0: 74 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20  t lookahead;    
3ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
3cf0: 65 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65  e of the lookahe
3d00: 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  ad token */.    
3d10: 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20  int action;     
3d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
3d30: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20  tion to take on 
3d40: 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68  the given lookah
3d50: 65 61 64 20 2a 2f 0a 20 20 7d 20 2a 61 41 63 74  ead */.  } *aAct
3d60: 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
3d70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79 5f        /* The yy_
3d80: 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75  action[] table u
3d90: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
3da0: 6e 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61  n */.    *aLooka
3db0: 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  head;           
3dc0: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
3dd0: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
3de0: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c  set */.  int mnL
3df0: 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20  ookahead;       
3e00: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
3e10: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f   aLookahead[].lo
3e20: 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74  okahead */.  int
3e30: 20 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20   mnAction;      
3e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74            /* Act
3e50: 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
3e60: 69 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20  ith mnLookahead 
3e70: 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61  */.  int mxLooka
3e80: 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  head;           
3e90: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f    /* Maximum aLo
3ea0: 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68  okahead[].lookah
3eb0: 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  ead */.  int nLo
3ec0: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
3ed0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 6c        /* Used sl
3ee0: 6f 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61  ots in aLookahea
3ef0: 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f  d[] */.  int nLo
3f00: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20  okaheadAlloc;   
3f10: 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61        /* Slots a
3f20: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f  llocated in aLoo
3f30: 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a  kahead[] */.};..
3f40: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  /* Return the nu
3f50: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
3f60: 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  in the yy_action
3f70: 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e   table */.#defin
3f80: 65 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58 29  e acttab_size(X)
3f90: 20 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a   ((X)->nAction).
3fa0: 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f  ./* The value fo
3fb0: 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79  r the N-th entry
3fc0: 20 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f   in yy_action */
3fd0: 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f  .#define acttab_
3fe0: 79 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28  yyaction(X,N)  (
3ff0: 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e  (X)->aAction[N].
4000: 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20  action)../* The 
4010: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d  value for the N-
4020: 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c  th entry in yy_l
4030: 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65 66  ookahead */.#def
4040: 69 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f  ine acttab_yyloo
4050: 6b 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28 58  kahead(X,N)  ((X
4060: 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f  )->aAction[N].lo
4070: 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65  okahead)../* Fre
4080: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
4090: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
40a0: 20 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a 2f   given acttab */
40b0: 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72 65  .void acttab_fre
40c0: 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20  e(acttab *p){.  
40d0: 66 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e  free( p->aAction
40e0: 20 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61   );.  free( p->a
40f0: 4c 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20 66  Lookahead );.  f
4100: 72 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20  ree( p );.}../* 
4110: 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
4120: 63 74 74 61 62 20 73 74 72 75 63 74 75 72 65 20  cttab structure 
4130: 2a 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74 61  */.acttab *actta
4140: 62 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20  b_alloc(void){. 
4150: 20 61 63 74 74 61 62 20 2a 70 20 3d 20 6d 61 6c   acttab *p = mal
4160: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  loc( sizeof(*p) 
4170: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
4180: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
4190: 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61  err,"Unable to a
41a0: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
41b0: 6f 72 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e  or a new acttab.
41c0: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
41d0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c  .  }.  memset(p,
41e0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
41f0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
4200: 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63 74  /* Add a new act
4210: 69 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65  ion to the curre
4220: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
4230: 65 74 0a 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61  et.*/.void actta
4240: 62 5f 61 63 74 69 6f 6e 28 61 63 74 74 61 62 20  b_action(acttab 
4250: 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61  *p, int lookahea
4260: 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a  d, int action){.
4270: 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68    if( p->nLookah
4280: 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  ead>=p->nLookahe
4290: 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70  adAlloc ){.    p
42a0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f  ->nLookaheadAllo
42b0: 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e  c += 25;.    p->
42c0: 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 72 65 61  aLookahead = rea
42d0: 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68  lloc( p->aLookah
42e0: 65 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ead,.           
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f    sizeof(p->aLoo
4310: 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c  kahead[0])*p->nL
4320: 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b  ookaheadAlloc );
4330: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f  .    if( p->aLoo
4340: 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20  kahead==0 ){.   
4350: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
4360: 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  r,"malloc failed
4370: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  \n");.      exit
4380: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (1);.    }.  }. 
4390: 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65   if( p->nLookahe
43a0: 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ad==0 ){.    p->
43b0: 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f  mxLookahead = lo
43c0: 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e  okahead;.    p->
43d0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f  mnLookahead = lo
43e0: 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e  okahead;.    p->
43f0: 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f  mnAction = actio
4400: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
4410: 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65  if( p->mxLookahe
4420: 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70  ad<lookahead ) p
4430: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mxLookahead = 
4440: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 69  lookahead;.    i
4450: 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61  f( p->mnLookahea
4460: 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20  d>lookahead ){. 
4470: 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68       p->mnLookah
4480: 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b  ead = lookahead;
4490: 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69  .      p->mnActi
44a0: 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20  on = action;.   
44b0: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f   }.  }.  p->aLoo
44c0: 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61  kahead[p->nLooka
44d0: 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  head].lookahead 
44e0: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70  = lookahead;.  p
44f0: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e  ->aLookahead[p->
4500: 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69  nLookahead].acti
4510: 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70  on = action;.  p
4520: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a  ->nLookahead++;.
4530: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
4540: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
4550: 20 62 75 69 6c 74 20 75 70 20 77 69 74 68 20 70   built up with p
4560: 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61 63  rior calls to ac
4570: 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a  ttab_action().**
4580: 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
4590: 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20  t action table. 
45a0: 20 54 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   Then reset the 
45b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20  transaction set 
45c0: 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d  back.** to an em
45d0: 70 74 79 20 73 65 74 20 69 6e 20 70 72 65 70 61  pty set in prepa
45e0: 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77  ration for a new
45f0: 20 72 6f 75 6e 64 20 6f 66 20 61 63 74 74 61 62   round of acttab
4600: 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e  _action() calls.
4610: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
4620: 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  e offset into th
4630: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f  e action table o
4640: 66 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61  f the new transa
4650: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63  ction..*/.int ac
4660: 74 74 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74  ttab_insert(actt
4670: 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  ab *p){.  int i,
4680: 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65   j, k, n;.  asse
4690: 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  rt( p->nLookahea
46a0: 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  d>0 );..  /* Mak
46b0: 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 65  e sure we have e
46c0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 68  nough space to h
46d0: 6f 6c 64 20 74 68 65 20 65 78 70 61 6e 64 65 64  old the expanded
46e0: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20   action table.  
46f0: 2a 2a 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20  ** in the worst 
4700: 63 61 73 65 2e 20 20 54 68 65 20 77 6f 72 73 74  case.  The worst
4710: 20 63 61 73 65 20 6f 63 63 75 72 73 20 69 66 20   case occurs if 
4720: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
4730: 73 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  set.  ** must be
4740: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
4750: 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20   current action 
4760: 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d  table.  */.  n =
4770: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20   p->mxLookahead 
4780: 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41  + 1;.  if( p->nA
4790: 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e  ction + n >= p->
47a0: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a  nActionAlloc ){.
47b0: 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63      int oldAlloc
47c0: 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c   = p->nActionAll
47d0: 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69  oc;.    p->nActi
47e0: 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63  onAlloc = p->nAc
47f0: 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41  tion + n + p->nA
4800: 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b  ctionAlloc + 20;
4810: 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20  .    p->aAction 
4820: 3d 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41  = realloc( p->aA
4830: 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ction,.         
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4850: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69   sizeof(p->aActi
4860: 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f  on[0])*p->nActio
4870: 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
4880: 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29   p->aAction==0 )
4890: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
48a0: 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66  stderr,"malloc f
48b0: 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20  ailed\n");.     
48c0: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
48d0: 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c      for(i=oldAll
48e0: 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  oc; i<p->nAction
48f0: 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  Alloc; i++){.   
4900: 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d     p->aAction[i]
4910: 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b  .lookahead = -1;
4920: 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  .      p->aActio
4930: 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31  n[i].action = -1
4940: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
4950: 2a 20 53 63 61 6e 20 74 68 65 20 65 78 69 73 74  * Scan the exist
4960: 69 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ing action table
4970: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20   looking for an 
4980: 6f 66 66 73 65 74 20 77 68 65 72 65 20 77 65 20  offset where we 
4990: 63 61 6e 0a 20 20 2a 2a 20 69 6e 73 65 72 74 20  can.  ** insert 
49a0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
49b0: 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61  saction set.  Fa
49c0: 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ll out of the lo
49d0: 6f 70 20 77 68 65 6e 20 74 68 61 74 0a 20 20 2a  op when that.  *
49e0: 2a 20 6f 66 66 73 65 74 20 69 73 20 66 6f 75 6e  * offset is foun
49f0: 64 2e 20 20 49 6e 20 74 68 65 20 77 6f 72 73 74  d.  In the worst
4a00: 20 63 61 73 65 2c 20 77 65 20 66 61 6c 6c 20 6f   case, we fall o
4a10: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  ut of the loop w
4a20: 68 65 6e 0a 20 20 2a 2a 20 69 20 72 65 61 63 68  hen.  ** i reach
4a30: 65 73 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77  es p->nAction, w
4a40: 68 69 63 68 20 6d 65 61 6e 73 20 77 65 20 61 70  hich means we ap
4a50: 70 65 6e 64 20 74 68 65 20 6e 65 77 20 74 72 61  pend the new tra
4a60: 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a 20 20  nsaction set..  
4a70: 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65  **.  ** i is the
4a80: 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63   index in p->aAc
4a90: 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e  tion[] where p->
4aa0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69  mnLookahead is i
4ab0: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
4ac0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41  for(i=0; i<p->nA
4ad0: 63 74 69 6f 6e 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ction+p->mnLooka
4ae0: 68 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  head; i++){.    
4af0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69  if( p->aAction[i
4b00: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b  ].lookahead<0 ){
4b10: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
4b20: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b  j<p->nLookahead;
4b30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b   j++){.        k
4b40: 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64   = p->aLookahead
4b50: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20  [j].lookahead - 
4b60: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mnLookahead +
4b70: 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   i;.        if( 
4b80: 6b 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  k<0 ) break;.   
4b90: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
4ba0: 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[k].lookahead
4bb0: 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
4bc0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
4bd0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
4be0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
4bf0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
4c00: 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Action; j++){.  
4c10: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
4c20: 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[j].lookahea
4c30: 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68  d==j+p->mnLookah
4c40: 65 61 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ead-i ) break;. 
4c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4c60: 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29   j==p->nAction )
4c70: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
4c80: 20 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d 70    /* Fits in emp
4c90: 74 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20  ty slots */.    
4ca0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
4cb0: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e  ( p->aAction[i].
4cc0: 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e  lookahead==p->mn
4cd0: 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20  Lookahead ){.   
4ce0: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
4cf0: 6e 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e  n[i].action!=p->
4d00: 6d 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e 74 69  mnAction ) conti
4d10: 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nue;.      for(j
4d20: 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  =0; j<p->nLookah
4d30: 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ead; j++){.     
4d40: 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61     k = p->aLooka
4d50: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
4d60: 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  d - p->mnLookahe
4d70: 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20  ad + i;.        
4d80: 69 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d  if( k<0 || k>=p-
4d90: 3e 6e 41 63 74 69 6f 6e 20 29 20 62 72 65 61 6b  >nAction ) break
4da0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
4db0: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c  >aLookahead[j].l
4dc0: 6f 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61 41 63  ookahead!=p->aAc
4dd0: 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[k].lookahea
4de0: 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
4df0: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
4e00: 68 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d  head[j].action!=
4e10: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63  p->aAction[k].ac
4e20: 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20  tion ) break;.  
4e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4e40: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20  j<p->nLookahead 
4e50: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4e60: 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66    n = 0;.      f
4e70: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63  or(j=0; j<p->nAc
4e80: 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  tion; j++){.    
4e90: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
4ea0: 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c  on[j].lookahead<
4eb0: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
4ec0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
4ed0: 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[j].lookahea
4ee0: 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68  d==j+p->mnLookah
4ef0: 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20 20  ead-i ) n++;.   
4f00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
4f10: 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20  ==p->nLookahead 
4f20: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
4f30: 3b 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 61 20  ;  /* Same as a 
4f40: 70 72 69 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  prior transactio
4f50: 6e 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 7d  n set */.      }
4f60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
4f70: 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74 69  Insert transacti
4f80: 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78 20  on set at index 
4f90: 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  i. */.  for(j=0;
4fa0: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
4fb0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20  ; j++){.    k = 
4fc0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
4fd0: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
4fe0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
4ff0: 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  .    p->aAction[
5000: 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  k] = p->aLookahe
5010: 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b  ad[j];.    if( k
5020: 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70  >=p->nAction ) p
5030: 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b  ->nAction = k+1;
5040: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61  .  }.  p->nLooka
5050: 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  head = 0;..  /* 
5060: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
5070: 74 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20  t that is added 
5080: 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  to the lookahead
5090: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74   in order to get
50a0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
50b0: 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f  into yy_action o
50c0: 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a  f the action */.
50d0: 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e    return i - p->
50e0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a  mnLookahead;.}..
50f0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
5100: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
5110: 20 66 69 6c 65 20 22 61 73 73 65 72 74 2e 63 22   file "assert.c"
5120: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
5130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
5140: 2a 0a 2a 2a 20 41 20 6d 6f 72 65 20 65 66 66 69  *.** A more effi
5150: 63 69 65 6e 74 20 77 61 79 20 6f 66 20 68 61 6e  cient way of han
5160: 64 6c 69 6e 67 20 61 73 73 65 72 74 69 6f 6e 73  dling assertions
5170: 2e 0a 2a 2f 0a 76 6f 69 64 20 6d 79 61 73 73 65  ..*/.void myasse
5180: 72 74 28 66 69 6c 65 2c 6c 69 6e 65 29 0a 63 68  rt(file,line).ch
5190: 61 72 20 2a 66 69 6c 65 3b 0a 69 6e 74 20 6c 69  ar *file;.int li
51a0: 6e 65 3b 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28  ne;.{.  fprintf(
51b0: 73 74 64 65 72 72 2c 22 41 73 73 65 72 74 69 6f  stderr,"Assertio
51c0: 6e 20 66 61 69 6c 65 64 20 6f 6e 20 6c 69 6e 65  n failed on line
51d0: 20 25 64 20 6f 66 20 66 69 6c 65 20 5c 22 25 73   %d of file \"%s
51e0: 5c 22 5c 6e 22 2c 6c 69 6e 65 2c 66 69 6c 65 29  \"\n",line,file)
51f0: 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 2f  ;.  exit(1);.}./
5200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5210: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
5220: 66 69 6c 65 20 22 62 75 69 6c 64 2e 63 22 20 2a  file "build.c" *
5230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
5250: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
5260: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65  construction the
5270: 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61   finite state ma
5280: 63 68 69 6e 65 20 66 6f 72 20 74 68 65 20 4c 45  chine for the LE
5290: 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67 65  MON.** parser ge
52a0: 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
52b0: 46 69 6e 64 20 61 20 70 72 65 63 65 64 65 6e 63  Find a precedenc
52c0: 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72  e symbol of ever
52d0: 79 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72  y rule in the gr
52e0: 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  ammar..** .** Th
52f0: 6f 73 65 20 72 75 6c 65 73 20 77 68 69 63 68 20  ose rules which 
5300: 68 61 76 65 20 61 20 70 72 65 63 65 64 65 6e 63  have a precedenc
5310: 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69  e symbol coded i
5320: 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67  n the input.** g
5330: 72 61 6d 6d 61 72 20 75 73 69 6e 67 20 74 68 65  rammar using the
5340: 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73   "[symbol]" cons
5350: 74 72 75 63 74 20 77 69 6c 6c 20 61 6c 72 65 61  truct will alrea
5360: 64 79 20 68 61 76 65 20 74 68 65 0a 2a 2a 20 72  dy have the.** r
5370: 70 2d 3e 70 72 65 63 73 79 6d 20 66 69 65 6c 64  p->precsym field
5380: 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20   filled.  Other 
5390: 72 75 6c 65 73 20 74 61 6b 65 20 61 73 20 74 68  rules take as th
53a0: 65 69 72 20 70 72 65 63 65 64 65 6e 63 65 0a 2a  eir precedence.*
53b0: 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20 66 69 72  * symbol the fir
53c0: 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 77 69  st RHS symbol wi
53d0: 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65  th a defined pre
53e0: 63 65 64 65 6e 63 65 2e 20 20 49 66 20 74 68 65  cedence.  If the
53f0: 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48  re.** are not RH
5400: 53 20 73 79 6d 62 6f 6c 73 20 77 69 74 68 20 61  S symbols with a
5410: 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64 65   defined precede
5420: 6e 63 65 2c 20 74 68 65 20 70 72 65 63 65 64 65  nce, the precede
5430: 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69  nce.** symbol fi
5440: 65 6c 64 20 69 73 20 6c 65 66 74 20 62 6c 61 6e  eld is left blan
5450: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52  k..*/.void FindR
5460: 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28 78  ulePrecedences(x
5470: 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
5480: 2a 78 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  *xp;.{.  struct 
5490: 72 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28  rule *rp;.  for(
54a0: 72 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  rp=xp->rule; rp;
54b0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
54c0: 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73     if( rp->precs
54d0: 79 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ym==0 ){.      i
54e0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66  nt i, j;.      f
54f0: 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
5500: 68 73 20 26 26 20 72 70 2d 3e 70 72 65 63 73 79  hs && rp->precsy
5510: 6d 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  m==0; i++){.    
5520: 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
5530: 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b  l *sp = rp->rhs[
5540: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
5550: 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
5560: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
5570: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
5580: 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b  sp->nsubsym; j++
5590: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
55a0: 66 28 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d  f( sp->subsym[j]
55b0: 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20  ->prec>=0 ){.   
55c0: 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70             rp->p
55d0: 72 65 63 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62  recsym = sp->sub
55e0: 73 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  sym[j];.        
55f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5600: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
5620: 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 70 72 65  else if( sp->pre
5630: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
5640: 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20    rp->precsym = 
5650: 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 09 7d 0a 20  rp->rhs[i];..}. 
5660: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5670: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
5680: 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65 72   Find all nonter
5690: 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 77 69 6c  minals which wil
56a0: 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 65  l generate the e
56b0: 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20  mpty string..** 
56c0: 54 68 65 6e 20 67 6f 20 62 61 63 6b 20 61 6e 64  Then go back and
56d0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72   compute the fir
56e0: 73 74 20 73 65 74 73 20 6f 66 20 65 76 65 72 79  st sets of every
56f0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a   nonterminal..**
5700: 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20 69   The first set i
5710: 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c  s the set of all
5720: 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
5730: 73 20 77 68 69 63 68 20 63 61 6e 20 62 65 67 69  s which can begi
5740: 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20 67 65  n.** a string ge
5750: 6e 65 72 61 74 65 64 20 62 79 20 74 68 61 74 20  nerated by that 
5760: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a  nonterminal..*/.
5770: 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53 65  void FindFirstSe
5780: 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  ts(lemp).struct 
5790: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
57a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
57b0: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
57c0: 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20  int progress;.. 
57d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
57e0: 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
57f0: 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  .    lemp->symbo
5800: 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20  ls[i]->lambda = 
5810: 42 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66  B_FALSE;.  }.  f
5820: 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d  or(i=lemp->nterm
5830: 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  inal; i<lemp->ns
5840: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
5850: 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
5860: 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53 65  ]->firstset = Se
5870: 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tNew();.  }..  /
5880: 2a 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65 20  * First compute 
5890: 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20  all lambdas */. 
58a0: 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73   do{.    progres
58b0: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72  s = 0;.    for(r
58c0: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
58d0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
58e0: 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68        if( rp->lh
58f0: 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74  s->lambda ) cont
5900: 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
5910: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
5920: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
5930: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
5940: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
5950: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d           if( sp-
5960: 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20  >type!=TERMINAL 
5970: 7c 7c 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 42  || sp->lambda==B
5980: 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a  _FALSE ) break;.
5990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
59a0: 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 7b  ( i==rp->nrhs ){
59b0: 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73  .        rp->lhs
59c0: 2d 3e 6c 61 6d 62 64 61 20 3d 20 42 5f 54 52 55  ->lambda = B_TRU
59d0: 45 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 67 72  E;.        progr
59e0: 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ess = 1;.      }
59f0: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
5a00: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20   progress );..  
5a10: 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61  /* Now compute a
5a20: 6c 6c 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f  ll first sets */
5a30: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 74 72 75 63  .  do{.    struc
5a40: 74 20 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73  t symbol *s1, *s
5a50: 32 3b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20  2;.    progress 
5a60: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d  = 0;.    for(rp=
5a70: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
5a80: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
5a90: 20 20 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73      s1 = rp->lhs
5aa0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5ab0: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
5ac0: 29 7b 0a 20 20 20 20 20 20 20 20 73 32 20 3d 20  ){.        s2 = 
5ad0: 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
5ae0: 20 20 20 20 69 66 28 20 73 32 2d 3e 74 79 70 65      if( s2->type
5af0: 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
5b00: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
5b10: 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66   += SetAdd(s1->f
5b20: 69 72 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65  irstset,s2->inde
5b30: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  x);.          br
5b40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
5b50: 73 65 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d  se if( s2->type=
5b60: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
5b70: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
5b80: 6a 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73  j=0; j<s2->nsubs
5b90: 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ym; j++){.      
5ba0: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
5bb0: 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72  = SetAdd(s1->fir
5bc0: 73 74 73 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d  stset,s2->subsym
5bd0: 5b 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  [j]->index);.   
5be0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5bf0: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65     break;..}else
5c00: 20 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20   if( s1==s2 ){. 
5c10: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d           if( s1-
5c20: 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45  >lambda==B_FALSE
5c30: 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65   ) break;..}else
5c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67  {.          prog
5c50: 72 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e  ress += SetUnion
5c60: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
5c70: 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20  ->firstset);.   
5c80: 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 6c         if( s2->l
5c90: 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29  ambda==B_FALSE )
5ca0: 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 20   break;..}.     
5cb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
5cc0: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 20  e( progress );. 
5cd0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43   return;.}../* C
5ce0: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
5cf0: 20 73 74 61 74 65 73 20 66 6f 72 20 74 68 65 20   states for the 
5d00: 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a  grammar.  Links.
5d10: 2a 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ** are added to 
5d20: 62 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74 61  between some sta
5d30: 74 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  tes so that the 
5d40: 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74  LR(1) follow set
5d50: 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70  s.** can be comp
5d60: 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50  uted later..*/.P
5d70: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74  RIVATE struct st
5d80: 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 2f 2a  ate *getstate(/*
5d90: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20   struct lemon * 
5da0: 2a 2f 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64  */);  /* forward
5db0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f   reference */.vo
5dc0: 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 6c 65  id FindStates(le
5dd0: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
5de0: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
5df0: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
5e00: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
5e10: 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  ;..  Configlist_
5e20: 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69  init();..  /* Fi
5e30: 6e 64 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  nd the start sym
5e40: 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  bol */.  if( lem
5e50: 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20  p->start ){.    
5e60: 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
5e70: 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20  (lemp->start);. 
5e80: 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a     if( sp==0 ){.
5e90: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
5ea0: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c  emp->filename,0,
5eb0: 0a 22 54 68 65 20 73 70 65 63 69 66 69 65 64 20  ."The specified 
5ec0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25  start symbol \"%
5ed0: 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20  s\" is not \.in 
5ee0: 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66  a nonterminal of
5ef0: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c   the grammar.  \
5f00: 22 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73  "%s\" will be us
5f10: 65 64 20 61 73 20 74 68 65 20 73 74 61 72 74 20  ed as the start 
5f20: 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64  \.symbol instead
5f30: 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c  .",lemp->start,l
5f40: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e  emp->rule->lhs->
5f50: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d  name);.      lem
5f60: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
5f70: 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e       sp = lemp->
5f80: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d  rule->lhs;.    }
5f90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
5fa0: 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c   = lemp->rule->l
5fb0: 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  hs;.  }..  /* Ma
5fc0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 74 61 72  ke sure the star
5fd0: 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74  t symbol doesn't
5fe0: 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69   occur on the ri
5ff0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
6000: 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20  .  ** any rule. 
6010: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
6020: 20 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59   if it does.  (Y
6030: 41 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61  ACC would genera
6040: 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74  te a new.  ** st
6050: 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  art symbol in th
6060: 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66  is case.) */.  f
6070: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
6080: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
6090: 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  t){.    int i;. 
60a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
60b0: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
60c0: 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b      if( rp->rhs[
60d0: 69 5d 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20 46  i]==sp ){   /* F
60e0: 49 58 20 4d 45 3a 20 20 44 65 61 6c 20 77 69 74  IX ME:  Deal wit
60f0: 68 20 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c 73  h multiterminals
6100: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 72 72 6f   */.        Erro
6110: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
6120: 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 74 61 72  ame,0,."The star
6130: 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20  t symbol \"%s\" 
6140: 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a  occurs on the \.
6150: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
6160: 6f 66 20 61 20 72 75 6c 65 2e 20 54 68 69 73 20  of a rule. This 
6170: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
6180: 20 70 61 72 73 65 72 20 77 68 69 63 68 20 5c 0a   parser which \.
6190: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72  does not work pr
61a0: 6f 70 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d  operly.",sp->nam
61b0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70  e);.        lemp
61c0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
61d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
61e0: 0a 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20  .  /* The basis 
61f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  configuration se
6200: 74 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  t for the first 
6210: 73 74 61 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c  state.  ** is al
6220: 6c 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61  l rules which ha
6230: 76 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  ve the start sym
6240: 62 6f 6c 20 61 73 20 74 68 65 69 72 0a 20 20 2a  bol as their.  *
6250: 2a 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * left-hand side
6260: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d   */.  for(rp=sp-
6270: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
6280: 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20  ->nextlhs){.    
6290: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
62a0: 65 77 63 66 70 3b 0a 20 20 20 20 6e 65 77 63 66  ewcfp;.    newcf
62b0: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61  p = Configlist_a
62c0: 64 64 62 61 73 69 73 28 72 70 2c 30 29 3b 0a 20  ddbasis(rp,0);. 
62d0: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
62e0: 2d 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20  ->fws,0);.  }.. 
62f0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
6300: 66 69 72 73 74 20 73 74 61 74 65 2e 20 20 41 6c  first state.  Al
6310: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 20 77  l other states w
6320: 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70  ill be.  ** comp
6330: 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  uted automatical
6340: 6c 79 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  ly during the co
6350: 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mputation of the
6360: 20 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a   first one..  **
6370: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f   The returned po
6380: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72  inter to the fir
6390: 73 74 20 73 74 61 74 65 20 69 73 20 6e 6f 74 20  st state is not 
63a0: 75 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  used. */.  (void
63b0: 29 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b  )getstate(lemp);
63c0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
63d0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
63e0: 72 20 74 6f 20 61 20 73 74 61 74 65 20 77 68 69  r to a state whi
63f0: 63 68 20 69 73 20 64 65 73 63 72 69 62 65 64 20  ch is described 
6400: 62 79 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  by the configura
6410: 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69  tion.** list whi
6420: 63 68 20 68 61 73 20 62 65 65 6e 20 62 75 69 6c  ch has been buil
6430: 74 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20  t from calls to 
6440: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a  Configlist_add..
6450: 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
6460: 62 75 69 6c 64 73 68 69 66 74 73 28 2f 2a 20 73  buildshifts(/* s
6470: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73  truct lemon *, s
6480: 74 72 75 63 74 20 73 74 61 74 65 20 2a 20 2a 2f  truct state * */
6490: 29 3b 20 2f 2a 20 46 6f 72 77 64 20 72 65 66 20  ); /* Forwd ref 
64a0: 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63  */.PRIVATE struc
64b0: 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74  t state *getstat
64c0: 65 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  e(lemp).struct l
64d0: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
64e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
64f0: 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75 63  fp, *bp;.  struc
6500: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20  t state *stp;.. 
6510: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
6520: 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f 66 20  sorted basis of 
6530: 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e 20 20  the new state.  
6540: 54 68 65 20 62 61 73 69 73 20 77 61 73 20 63 6f  The basis was co
6550: 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 62  nstructed.  ** b
6560: 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  y prior calls to
6570: 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   "Configlist_add
6580: 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43  basis()". */.  C
6590: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61  onfiglist_sortba
65a0: 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f  sis();.  bp = Co
65b0: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29  nfiglist_basis()
65c0: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 73 74  ;..  /* Get a st
65d0: 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ate with the sam
65e0: 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73 74 70  e basis */.  stp
65f0: 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28 62 70   = State_find(bp
6600: 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29 7b 0a  );.  if( stp ){.
6610: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 20 77      /* A state w
6620: 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61 73  ith the same bas
6630: 69 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  is already exist
6640: 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74 68 65  s!  Copy all the
6650: 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20   follow-set.    
6660: 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  ** propagation l
6670: 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 74  inks from the st
6680: 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ate under constr
6690: 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a  uction into the.
66a0: 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69      ** preexisti
66b0: 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e 20 72  ng state, then r
66c0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
66d0: 74 6f 20 74 68 65 20 70 72 65 65 78 69 73 74 69  to the preexisti
66e0: 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  ng state */.    
66f0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 78  struct config *x
6700: 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d  , *y;.    for(x=
6710: 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78  bp, y=stp->bp; x
6720: 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20   && y; x=x->bp, 
6730: 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20  y=y->bp){.      
6740: 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62  Plink_copy(&y->b
6750: 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20  plp,x->bplp);.  
6760: 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65      Plink_delete
6770: 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20  (x->fplp);.     
6780: 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70   x->fplp = x->bp
6790: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  lp = 0;.    }.  
67a0: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69    cfp = Configli
67b0: 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20 20  st_return();.   
67c0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
67d0: 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  cfp);.  }else{. 
67e0: 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c     /* This reall
67f0: 79 20 69 73 20 61 20 6e 65 77 20 73 74 61 74 65  y is a new state
6800: 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c  .  Construct all
6810: 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a   the details */.
6820: 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63      Configlist_c
6830: 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20 20 20  losure(lemp);   
6840: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
6850: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c  configuration cl
6860: 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e  osure */.    Con
6870: 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20  figlist_sort(); 
6880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
6890: 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  t the configurat
68a0: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
68b0: 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c     cfp = Configl
68c0: 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20 20 20  ist_return();   
68d0: 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72  /* Get a pointer
68e0: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 20 6c   to the config l
68f0: 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  ist */.    stp =
6900: 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20 20 20   State_new();   
6910: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77          /* A new
6920: 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65   state structure
6930: 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68   */.    MemoryCh
6940: 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20 73 74  eck(stp);.    st
6950: 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20 20 20  p->bp = bp;     
6960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6970: 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69  member the confi
6980: 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73 20 2a  guration basis *
6990: 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70 20 3d  /.    stp->cfp =
69a0: 20 63 66 70 3b 20 20 20 20 20 20 20 20 20 20 20   cfp;           
69b0: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
69c0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
69d0: 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20   closure */.    
69e0: 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20  stp->statenum = 
69f0: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20  lemp->nstate++; 
6a00: 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65 20 67  /* Every state g
6a10: 65 74 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e  ets a sequence n
6a20: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70  umber */.    stp
6a30: 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  ->ap = 0;       
6a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
6a50: 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f  actions, yet. */
6a60: 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72  .    State_inser
6a70: 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20  t(stp,stp->bp); 
6a80: 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20    /* Add to the 
6a90: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20  state table */. 
6aa0: 20 20 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c     buildshifts(l
6ab0: 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20  emp,stp);       
6ac0: 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  /* Recursively c
6ad0: 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f 72  ompute successor
6ae0: 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20   states */.  }. 
6af0: 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a   return stp;.}..
6b00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
6b10: 65 20 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73  e if two symbols
6b20: 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a   are the same..*
6b30: 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f  /.int same_symbo
6b40: 6c 28 61 2c 62 29 0a 73 74 72 75 63 74 20 73 79  l(a,b).struct sy
6b50: 6d 62 6f 6c 20 2a 61 3b 0a 73 74 72 75 63 74 20  mbol *a;.struct 
6b60: 73 79 6d 62 6f 6c 20 2a 62 3b 0a 7b 0a 20 20 69  symbol *b;.{.  i
6b70: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62  nt i;.  if( a==b
6b80: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
6b90: 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54  f( a->type!=MULT
6ba0: 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75  ITERMINAL ) retu
6bb0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74  rn 0;.  if( b->t
6bc0: 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
6bd0: 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  AL ) return 0;. 
6be0: 20 69 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21   if( a->nsubsym!
6bf0: 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72 65  =b->nsubsym ) re
6c00: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
6c10: 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b  0; i<a->nsubsym;
6c20: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
6c30: 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e  ->subsym[i]!=b->
6c40: 73 75 62 73 79 6d 5b 69 5d 20 29 20 72 65 74 75  subsym[i] ) retu
6c50: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
6c60: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73  rn 1;.}../* Cons
6c70: 74 72 75 63 74 20 61 6c 6c 20 73 75 63 63 65 73  truct all succes
6c80: 73 6f 72 20 73 74 61 74 65 73 20 74 6f 20 74 68  sor states to th
6c90: 65 20 67 69 76 65 6e 20 73 74 61 74 65 2e 20 20  e given state.  
6ca0: 41 20 22 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a  A "successor".**
6cb0: 20 73 74 61 74 65 20 69 73 20 61 6e 79 20 73 74   state is any st
6cc0: 61 74 65 20 77 68 69 63 68 20 63 61 6e 20 62 65  ate which can be
6cd0: 20 72 65 61 63 68 65 64 20 62 79 20 61 20 73 68   reached by a sh
6ce0: 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50  ift action..*/.P
6cf0: 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c  RIVATE void buil
6d00: 64 73 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70  dshifts(lemp,stp
6d10: 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
6d20: 6c 65 6d 70 3b 0a 73 74 72 75 63 74 20 73 74 61  lemp;.struct sta
6d30: 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20  te *stp;     /* 
6d40: 54 68 65 20 73 74 61 74 65 20 66 72 6f 6d 20 77  The state from w
6d50: 68 69 63 68 20 73 75 63 63 65 73 73 6f 72 73 20  hich successors 
6d60: 61 72 65 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a  are computed */.
6d70: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
6d80: 67 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20  g *cfp;  /* For 
6d90: 6c 6f 6f 70 69 6e 67 20 74 68 72 75 20 74 68 65  looping thru the
6da0: 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20   config closure 
6db0: 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74  of "stp" */.  st
6dc0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 63 66  ruct config *bcf
6dd0: 70 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e  p; /* For the in
6de0: 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66  ner loop on conf
6df0: 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73  ig closure of "s
6e00: 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  tp" */.  struct 
6e10: 63 6f 6e 66 69 67 20 2a 6e 65 77 3b 20 20 2f 2a  config *new;  /*
6e20: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
6e30: 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79  bol *sp;   /* Sy
6e40: 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  mbol following t
6e50: 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67  he dot in config
6e60: 75 72 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f  uration "cfp" */
6e70: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
6e80: 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f   *bsp;  /* Symbo
6e90: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
6ea0: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
6eb0: 74 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20  tion "bcfp" */. 
6ec0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e   struct state *n
6ed0: 65 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e  ewstp; /* A poin
6ee0: 74 65 72 20 74 6f 20 61 20 73 75 63 63 65 73 73  ter to a success
6ef0: 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f  or state */..  /
6f00: 2a 20 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61  * Each configura
6f10: 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d  tion becomes com
6f20: 70 6c 65 74 65 20 61 66 74 65 72 20 69 74 20 63  plete after it c
6f30: 6f 6e 74 69 62 75 74 65 73 20 74 6f 20 61 20 73  ontibutes to a s
6f40: 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74  uccessor.  ** st
6f50: 61 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c  ate.  Initially,
6f60: 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   all configurati
6f70: 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65  ons are incomple
6f80: 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d  te */.  for(cfp=
6f90: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
6fa0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66  fp=cfp->next) cf
6fb0: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
6fc0: 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f  MPLETE;..  /* Lo
6fd0: 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
6fe0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66  onfigurations of
6ff0: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
7000: 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74   */.  for(cfp=st
7010: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
7020: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
7030: 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73   if( cfp->status
7040: 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e  ==COMPLETE ) con
7050: 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72  tinue;    /* Alr
7060: 65 61 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e  eady used by inn
7070: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  er loop */.    i
7080: 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70  f( cfp->dot>=cfp
7090: 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  ->rp->nrhs ) con
70a0: 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74  tinue;  /* Can't
70b0: 20 73 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66   shift this conf
70c0: 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  ig */.    Config
70d0: 6c 69 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20  list_reset();   
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20     /* Reset the 
7100: 6e 65 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a  new config set *
7110: 2f 0a 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e  /.    sp = cfp->
7120: 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74  rp->rhs[cfp->dot
7130: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
7140: 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74  * Symbol after t
7150: 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f  he dot */..    /
7160: 2a 20 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66  * For every conf
7170: 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65  iguration in the
7180: 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69   state "stp" whi
7190: 63 68 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f  ch has the symbo
71a0: 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f  l "sp".    ** fo
71b0: 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c  llowing its dot,
71c0: 20 61 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f   add the same co
71d0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74  nfiguration to t
71e0: 68 65 20 62 61 73 69 73 20 73 65 74 20 75 6e 64  he basis set und
71f0: 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  er.    ** constr
7200: 75 63 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20  uction but with 
7210: 74 68 65 20 64 6f 74 20 73 68 69 66 74 65 64 20  the dot shifted 
7220: 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68  one symbol to th
7230: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
7240: 66 6f 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63  for(bcfp=cfp; bc
7250: 66 70 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e  fp; bcfp=bcfp->n
7260: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
7270: 62 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f  bcfp->status==CO
7280: 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75  MPLETE ) continu
7290: 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79  e;    /* Already
72a0: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69   used */.      i
72b0: 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63  f( bcfp->dot>=bc
72c0: 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63  fp->rp->nrhs ) c
72d0: 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27  ontinue; /* Can'
72e0: 74 20 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65  t shift this one
72f0: 20 2a 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20   */.      bsp = 
7300: 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63  bcfp->rp->rhs[bc
7310: 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20  fp->dot];       
7320: 20 20 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f      /* Get symbo
7330: 6c 20 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20  l after dot */. 
7340: 20 20 20 20 20 69 66 28 20 21 73 61 6d 65 5f 73       if( !same_s
7350: 79 6d 62 6f 6c 28 62 73 70 2c 73 70 29 20 29 20  ymbol(bsp,sp) ) 
7360: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 2f  continue;      /
7370: 2a 20 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61  * Must be same a
7380: 73 20 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20  s for "cfp" */. 
7390: 20 20 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75       bcfp->statu
73a0: 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20  s = COMPLETE;   
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
73c0: 2a 20 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66  * Mark this conf
73d0: 69 67 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20  ig as used */.  
73e0: 20 20 20 20 6e 65 77 20 3d 20 43 6f 6e 66 69 67      new = Config
73f0: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 62 63  list_addbasis(bc
7400: 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74  fp->rp,bcfp->dot
7410: 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  +1);.      Plink
7420: 5f 61 64 64 28 26 6e 65 77 2d 3e 62 70 6c 70 2c  _add(&new->bplp,
7430: 62 63 66 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  bcfp);.    }..  
7440: 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
7450: 65 72 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  er to the state 
7460: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 68 65  described by the
7470: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
7480: 74 69 6f 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20  tion set.    ** 
7490: 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
74a0: 68 65 20 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f  he preceding loo
74b0: 70 20 2a 2f 0a 20 20 20 20 6e 65 77 73 74 70 20  p */.    newstp 
74c0: 3d 20 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29  = getstate(lemp)
74d0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74  ;..    /* The st
74e0: 61 74 65 20 22 6e 65 77 73 74 70 22 20 69 73 20  ate "newstp" is 
74f0: 72 65 61 63 68 65 64 20 66 72 6f 6d 20 74 68 65  reached from the
7500: 20 73 74 61 74 65 20 22 73 74 70 22 20 62 79 20   state "stp" by 
7510: 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e 0a 20  a shift action. 
7520: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d     ** on the sym
7530: 62 6f 6c 20 22 73 70 22 20 2a 2f 0a 20 20 20 20  bol "sp" */.    
7540: 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
7550: 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
7560: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
7570: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 70 2d    for(i=0; i<sp-
7580: 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a  >nsubsym; i++){.
7590: 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61          Action_a
75a0: 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46  dd(&stp->ap,SHIF
75b0: 54 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 69 5d 2c  T,sp->subsym[i],
75c0: 28 63 68 61 72 2a 29 6e 65 77 73 74 70 29 3b 0a  (char*)newstp);.
75d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
75e0: 65 7b 0a 20 20 20 20 20 20 41 63 74 69 6f 6e 5f  e{.      Action_
75f0: 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49  add(&stp->ap,SHI
7600: 46 54 2c 73 70 2c 28 63 68 61 72 20 2a 29 6e 65  FT,sp,(char *)ne
7610: 77 73 74 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  wstp);.    }.  }
7620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
7630: 75 63 74 20 74 68 65 20 70 72 6f 70 61 67 61 74  uct the propagat
7640: 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69  ion links.*/.voi
7650: 64 20 46 69 6e 64 4c 69 6e 6b 73 28 6c 65 6d 70  d FindLinks(lemp
7660: 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
7670: 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp;.{.  int i;
7680: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
7690: 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20   *cfp, *other;. 
76a0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
76b0: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  tp;.  struct pli
76c0: 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48  nk *plp;..  /* H
76d0: 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61  ousekeeping deta
76e0: 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20  il:.  ** Add to 
76f0: 65 76 65 72 79 20 70 72 6f 70 61 67 61 74 65 20  every propagate 
7700: 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62  link a pointer b
7710: 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65  ack to the state
7720: 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74   to.  ** which t
7730: 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63  he link is attac
7740: 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  hed. */.  for(i=
7750: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7760: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
7770: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
7780: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  i];.    for(cfp=
7790: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
77a0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
77b0: 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20       cfp->stp = 
77c0: 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  stp;.    }.  }..
77d0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c    /* Convert all
77e0: 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20   backlinks into 
77f0: 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20  forward links.  
7800: 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64  Only the forward
7810: 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20  .  ** links are 
7820: 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  used in the foll
7830: 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69  ow-set computati
7840: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
7850: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
7860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
7870: 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
7880: 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73  ];.    for(cfp=s
7890: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
78a0: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
78b0: 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d      for(plp=cfp-
78c0: 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d  >bplp; plp; plp=
78d0: 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  plp->next){.    
78e0: 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d      other = plp-
78f0: 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c  >cfp;.        Pl
7900: 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e  ink_add(&other->
7910: 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20  fplp,cfp);.     
7920: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
7930: 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66  /* Compute all f
7940: 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a  ollowsets..**.**
7950: 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20   A followset is 
7960: 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73  the set of all s
7970: 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e  ymbols which can
7980: 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c   come immediatel
7990: 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e  y.** after a con
79a0: 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  figuration..*/.v
79b0: 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65  oid FindFollowSe
79c0: 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  ts(lemp).struct 
79d0: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
79e0: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
79f0: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20   config *cfp;.  
7a00: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
7a10: 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73  p;.  int progres
7a20: 73 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 3b  s;.  int change;
7a30: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
7a40: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
7a50: 29 7b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 6c  ){.    for(cfp=l
7a60: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
7a70: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
7a80: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
7a90: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e  cfp->status = IN
7aa0: 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a  COMPLETE;.    }.
7ab0: 20 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20 20 20    }.  .  do{.   
7ac0: 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
7ad0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
7ae0: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
7af0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 63 66 70 3d  {.      for(cfp=
7b00: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
7b10: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
7b20: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
7b30: 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74     if( cfp->stat
7b40: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
7b50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7b60: 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70   for(plp=cfp->fp
7b70: 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70  lp; plp; plp=plp
7b80: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
7b90: 20 20 20 63 68 61 6e 67 65 20 3d 20 53 65 74 55     change = SetU
7ba0: 6e 69 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66  nion(plp->cfp->f
7bb0: 77 73 2c 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ws,cfp->fws);.  
7bc0: 20 20 20 20 20 20 20 20 69 66 28 20 63 68 61 6e          if( chan
7bd0: 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
7be0: 20 20 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74    plp->cfp->stat
7bf0: 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b  us = INCOMPLETE;
7c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f  .            pro
7c10: 67 72 65 73 73 20 3d 20 31 3b 0a 09 20 20 7d 0a  gress = 1;..  }.
7c20: 09 7d 0a 20 20 20 20 20 20 20 20 63 66 70 2d 3e  .}.        cfp->
7c30: 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54  status = COMPLET
7c40: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
7c50: 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72  .  }while( progr
7c60: 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ess );.}..static
7c70: 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e   int resolve_con
7c80: 66 6c 69 63 74 28 29 3b 0a 0a 2f 2a 20 43 6f 6d  flict();../* Com
7c90: 70 75 74 65 20 74 68 65 20 72 65 64 75 63 65 20  pute the reduce 
7ca0: 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72 65 73  actions, and res
7cb0: 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 2e 0a  olve conflicts..
7cc0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69  */.void FindActi
7cd0: 6f 6e 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  ons(lemp).struct
7ce0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
7cf0: 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72    int i,j;.  str
7d00: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
7d10: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
7d20: 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73  *stp;.  struct s
7d30: 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72  ymbol *sp;.  str
7d40: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20  uct rule *rp;.. 
7d50: 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74   /* Add all of t
7d60: 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
7d70: 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65  s .  ** A reduce
7d80: 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64   action is added
7d90: 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e   for each elemen
7da0: 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73  t of the follows
7db0: 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e  et of.  ** a con
7dc0: 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68  figuration which
7dd0: 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74 20   has its dot at 
7de0: 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
7df0: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
7e00: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7e10: 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f  e; i++){   /* Lo
7e20: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74  op over all stat
7e30: 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20  es */.    stp = 
7e40: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
7e50: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
7e60: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
7e70: 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20  cfp->next){  /* 
7e80: 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f  Loop over all co
7e90: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
7ea0: 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72        if( cfp->r
7eb0: 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f  p->nrhs==cfp->do
7ec0: 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49  t ){        /* I
7ed0: 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65  s dot at extreme
7ee0: 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20   right? */.     
7ef0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65     for(j=0; j<le
7f00: 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a  mp->nterminal; j
7f10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
7f20: 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e  f( SetFind(cfp->
7f30: 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20  fws,j) ){.      
7f40: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72        /* Add a r
7f50: 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20  educe action to 
7f60: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
7f70: 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63  which will reduc
7f80: 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20 20  e by the.       
7f90: 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66       ** rule "cf
7fa0: 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f  p->rp" if the lo
7fb0: 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69  okahead symbol i
7fc0: 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  s "lemp->symbols
7fd0: 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  [j]" */.        
7fe0: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
7ff0: 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c  stp->ap,REDUCE,l
8000: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c  emp->symbols[j],
8010: 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70 29  (char *)cfp->rp)
8020: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 09 7d  ;.          }..}
8030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8040: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
8050: 20 61 63 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e   accepting token
8060: 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
8070: 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20  start ){.    sp 
8080: 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65  = Symbol_find(le
8090: 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20  mp->start);.    
80a0: 69 66 28 20 73 70 3d 3d 30 20 29 20 73 70 20 3d  if( sp==0 ) sp =
80b0: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
80c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
80d0: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
80e0: 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64  lhs;.  }.  /* Ad
80f0: 64 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  d to the first s
8100: 74 61 74 65 20 28 77 68 69 63 68 20 69 73 20 61  tate (which is a
8110: 6c 77 61 79 73 20 74 68 65 20 73 74 61 72 74 69  lways the starti
8120: 6e 67 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  ng state of the.
8130: 20 20 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74    ** finite stat
8140: 65 20 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63  e machine) an ac
8150: 74 69 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69  tion to ACCEPT i
8160: 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  f the lookahead 
8170: 69 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72  is the.  ** star
8180: 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20  t nonterminal.  
8190: 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28  */.  Action_add(
81a0: 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d  &lemp->sorted[0]
81b0: 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30  ->ap,ACCEPT,sp,0
81c0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  );..  /* Resolve
81d0: 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20   conflicts */.  
81e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
81f0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
8200: 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e     struct action
8210: 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20   *ap, *nap;.    
8220: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
8230: 70 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  p;.    stp = lem
8240: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
8250: 20 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61    assert( stp->a
8260: 70 20 29 3b 0a 20 20 20 20 73 74 70 2d 3e 61 70  p );.    stp->ap
8270: 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73   = Action_sort(s
8280: 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72  tp->ap);.    for
8290: 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20  (ap=stp->ap; ap 
82a0: 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d  && ap->next; ap=
82b0: 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
82c0: 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78   for(nap=ap->nex
82d0: 74 3b 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73  t; nap && nap->s
82e0: 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e  p==ap->sp; nap=n
82f0: 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
8300: 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61      /* The two a
8310: 63 74 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20  ctions "ap" and 
8320: 22 6e 61 70 22 20 68 61 76 65 20 74 68 65 20 73  "nap" have the s
8330: 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20  ame lookahead.. 
8340: 20 20 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72          ** Figur
8350: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
8360: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a  should be used *
8370: 2f 0a 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d  /.         lemp-
8380: 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65  >nconflict += re
8390: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61  solve_conflict(a
83a0: 70 2c 6e 61 70 2c 6c 65 6d 70 2d 3e 65 72 72 73  p,nap,lemp->errs
83b0: 79 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ym);.      }.   
83c0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
83d0: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  ort an error for
83e0: 20 65 61 63 68 20 72 75 6c 65 20 74 68 61 74 20   each rule that 
83f0: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72 65 64  can never be red
8400: 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72  uced. */.  for(r
8410: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
8420: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72  ; rp=rp->next) r
8430: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 42  p->canReduce = B
8440: 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d  _FALSE;.  for(i=
8450: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
8460: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
8470: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
8480: 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d      for(ap=lemp-
8490: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20  >sorted[i]->ap; 
84a0: 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
84b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
84c0: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61  type==REDUCE ) a
84d0: 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75  p->x.rp->canRedu
84e0: 63 65 20 3d 20 42 5f 54 52 55 45 3b 0a 20 20 20  ce = B_TRUE;.   
84f0: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d   }.  }.  for(rp=
8500: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
8510: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
8520: 20 20 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64    if( rp->canRed
8530: 75 63 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  uce ) continue;.
8540: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
8550: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
8560: 72 75 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72  ruleline,"This r
8570: 75 6c 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72  ule can not be r
8580: 65 64 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20  educed.\n");.   
8590: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
85a0: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73  +;.  }.}../* Res
85b0: 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20  olve a conflict 
85c0: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20  between the two 
85d0: 67 69 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20  given actions.  
85e0: 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69  If the.** confli
85f0: 63 74 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f  ct can't be reso
8600: 6c 76 65 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  lve, return non-
8610: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c  zero..**.** NO L
8620: 4f 4e 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20  ONGER TRUE:.**  
8630: 20 54 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f   To resolve a co
8640: 6e 66 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f  nflict, first lo
8650: 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 65 69 74  ok to see if eit
8660: 68 65 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  her action.**   
8670: 69 73 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72  is on an error r
8680: 75 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ule.  In that ca
8690: 73 65 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74  se, take the act
86a0: 69 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69  ion which.**   i
86b0: 73 20 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64  s not associated
86c0: 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72 20   with the error 
86d0: 72 75 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65  rule.  If neithe
86e0: 72 20 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61  r or both.**   a
86f0: 63 74 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63  ctions are assoc
8700: 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  iated with an er
8710: 72 6f 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74  ror rule, then t
8720: 72 79 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70  ry to.**   use p
8730: 72 65 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73  recedence to res
8740: 6f 6c 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63  olve the conflic
8750: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  t..**.** If eith
8760: 65 72 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53  er action is a S
8770: 48 49 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  HIFT, then it mu
8780: 73 74 20 62 65 20 61 70 78 2e 20 20 54 68 69 73  st be apx.  This
8790: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e  .** function won
87a0: 27 74 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e  't work if apx->
87b0: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64  type==REDUCE and
87c0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46   apy->type==SHIF
87d0: 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
87e0: 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63   resolve_conflic
87f0: 74 28 61 70 78 2c 61 70 79 2c 65 72 72 73 79 6d  t(apx,apy,errsym
8800: 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ).struct action 
8810: 2a 61 70 78 3b 0a 73 74 72 75 63 74 20 61 63 74  *apx;.struct act
8820: 69 6f 6e 20 2a 61 70 79 3b 0a 73 74 72 75 63 74  ion *apy;.struct
8830: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b   symbol *errsym;
8840: 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
8850: 73 79 6d 62 6f 6c 20 28 69 66 20 64 65 66 69 6e  symbol (if defin
8860: 65 64 2e 20 20 4e 55 4c 4c 20 6f 74 68 65 72 77  ed.  NULL otherw
8870: 69 73 65 29 20 2a 2f 0a 7b 0a 20 20 73 74 72 75  ise) */.{.  stru
8880: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20  ct symbol *spx, 
8890: 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65 72 72 63  *spy;.  int errc
88a0: 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  nt = 0;.  assert
88b0: 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e  ( apx->sp==apy->
88c0: 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77  sp );  /* Otherw
88d0: 69 73 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20  ise there would 
88e0: 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a  be no conflict *
88f0: 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70  /.  if( apx->typ
8900: 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d  e==SHIFT && apy-
8910: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b  >type==REDUCE ){
8920: 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e  .    spx = apx->
8930: 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70  sp;.    spy = ap
8940: 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d  y->x.rp->precsym
8950: 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d 3d 30  ;.    if( spy==0
8960: 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20   || spx->prec<0 
8970: 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 29  || spy->prec<0 )
8980: 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65  {.      /* Not e
8990: 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e 63 65  nough precedence
89a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f   information. */
89b0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
89c0: 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   = CONFLICT;.   
89d0: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
89e0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
89f0: 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29  prec>spy->prec )
8a00: 7b 20 20 20 20 2f 2a 20 4c 6f 77 65 72 20 70 72  {    /* Lower pr
8a10: 65 63 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f  ecedence wins */
8a20: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8a30: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a   = RD_RESOLVED;.
8a40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
8a50: 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65  x->prec<spy->pre
8a60: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e  c ){.      apx->
8a70: 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56  type = SH_RESOLV
8a80: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
8a90: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
8aa0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
8ab0: 73 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f  ssoc==RIGHT ){ /
8ac0: 2a 20 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a  * Use operator *
8ad0: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
8ae0: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8b10: 61 73 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f  associativity */
8b20: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
8b30: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
8b40: 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f  rec && spx->asso
8b50: 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74  c==LEFT ){  /* t
8b60: 6f 20 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20  o break tie */. 
8b70: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
8b80: 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   SH_RESOLVED;.  
8b90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
8ba0: 73 73 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63  ssert( spx->prec
8bb0: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
8bc0: 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20  px->assoc==NONE 
8bd0: 29 3b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  );.      apy->ty
8be0: 70 65 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20  pe = CONFLICT;. 
8bf0: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
8c00: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
8c10: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apx->type==REDU
8c20: 43 45 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d  CE && apy->type=
8c30: 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73  =REDUCE ){.    s
8c40: 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e  px = apx->x.rp->
8c50: 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 73 70 79  precsym;.    spy
8c60: 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72   = apy->x.rp->pr
8c70: 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73  ecsym;.    if( s
8c80: 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20  px==0 || spy==0 
8c90: 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c  || spx->prec<0 |
8ca0: 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72 65 63 3c  |.    spy->prec<
8cb0: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d  0 || spx->prec==
8cc0: 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20  spy->prec ){.   
8cd0: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 43     apy->type = C
8ce0: 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65  ONFLICT;.      e
8cf0: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c  rrcnt++;.    }el
8d00: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
8d10: 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20  >spy->prec ){.  
8d20: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
8d30: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  RD_RESOLVED;.   
8d40: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
8d50: 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29  prec<spy->prec )
8d60: 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  {.      apx->typ
8d70: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
8d80: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
8d90: 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
8da0: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48     apx->type==SH
8db0: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
8dc0: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44     apx->type==RD
8dd0: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
8de0: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 43 4f     apx->type==CO
8df0: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
8e00: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45  apy->type==SH_RE
8e10: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
8e20: 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45  apy->type==RD_RE
8e30: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
8e40: 61 70 79 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c  apy->type==CONFL
8e50: 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f  ICT.    );.    /
8e60: 2a 20 54 68 65 20 52 45 44 55 43 45 2f 53 48 49  * The REDUCE/SHI
8e70: 46 54 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68  FT case cannot h
8e80: 61 70 70 65 6e 20 62 65 63 61 75 73 65 20 53 48  appen because SH
8e90: 49 46 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65  IFTs come before
8ea0: 0a 20 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20  .    ** REDUCEs 
8eb0: 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66  on the list.  If
8ec0: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
8ed0: 6f 69 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20  oint it must be 
8ee0: 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  because.    ** t
8ef0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69  he parser confli
8f00: 63 74 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  ct had already b
8f10: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
8f20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
8f30: 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  rcnt;.}./*******
8f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
8f50: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f  rom the file "co
8f60: 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a  nfiglist.c" ****
8f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f80: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75  *****/./*.** Rou
8f90: 74 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73  tines to process
8fa0: 69 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74  ing a configurat
8fb0: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69  ion list and bui
8fc0: 6c 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a  lding a state.**
8fd0: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
8fe0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
8ff0: 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  */..static struc
9000: 74 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69  t config *freeli
9010: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  st = 0;      /* 
9020: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e  List of free con
9030: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  figurations */.s
9040: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
9050: 66 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30  fig *current = 0
9060: 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f  ;       /* Top o
9070: 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67  f list of config
9080: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  urations */.stat
9090: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
90a0: 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20   **currentend = 
90b0: 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20  0;   /* Last on 
90c0: 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20  list of configs 
90d0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
90e0: 20 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d   config *basis =
90f0: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
9100: 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61  op of list of ba
9110: 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73  sis configs */.s
9120: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
9130: 66 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d  fig **basisend =
9140: 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f   0;     /* End o
9150: 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20  f list of basis 
9160: 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52  configs */../* R
9170: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
9180: 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75  to a new configu
9190: 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54  ration */.PRIVAT
91a0: 45 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  E struct config 
91b0: 2a 6e 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20  *newconfig(){.  
91c0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
91d0: 65 77 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69  ew;.  if( freeli
91e0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
91f0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
9200: 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  = 3;.    freelis
9210: 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  t = (struct conf
9220: 69 67 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  ig *)malloc( siz
9230: 65 6f 66 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eof(struct confi
9240: 67 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69 66  g)*amt );.    if
9250: 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  ( freelist==0 ){
9260: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
9270: 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f  tderr,"Unable to
9280: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
9290: 20 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66 69   for a new confi
92a0: 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20  guration.");.   
92b0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
92c0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
92d0: 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65  <amt-1; i++) fre
92e0: 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20  elist[i].next = 
92f0: 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a  &freelist[i+1];.
9300: 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74      freelist[amt
9310: 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  -1].next = 0;.  
9320: 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69  }.  new = freeli
9330: 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d  st;.  freelist =
9340: 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b   freelist->next;
9350: 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d  .  return new;.}
9360: 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75  ../* The configu
9370: 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20  ration "old" is 
9380: 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a  no longer used *
9390: 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 64  /.PRIVATE void d
93a0: 65 6c 65 74 65 63 6f 6e 66 69 67 28 6f 6c 64 29  eleteconfig(old)
93b0: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
93c0: 6f 6c 64 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65  old;.{.  old->ne
93d0: 78 74 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  xt = freelist;. 
93e0: 20 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b   freelist = old;
93f0: 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  .}../* Initializ
9400: 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  ed the configura
9410: 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65  tion list builde
9420: 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  r */.void Config
9430: 6c 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63  list_init(){.  c
9440: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75  urrent = 0;.  cu
9450: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72  rrentend = &curr
9460: 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  ent;.  basis = 0
9470: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26  ;.  basisend = &
9480: 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74  basis;.  Configt
9490: 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72  able_init();.  r
94a0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69  eturn;.}../* Ini
94b0: 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e  tialized the con
94c0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
94d0: 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20  builder */.void 
94e0: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
94f0: 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20  (){.  current = 
9500: 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20  0;.  currentend 
9510: 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61  = &current;.  ba
9520: 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73  sis = 0;.  basis
9530: 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20  end = &basis;.  
9540: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61  Configtable_clea
9550: 72 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  r(0);.  return;.
9560: 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65  }../* Add anothe
9570: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  r configuration 
9580: 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  to the configura
9590: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72  tion list */.str
95a0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
95b0: 69 67 6c 69 73 74 5f 61 64 64 28 72 70 2c 64 6f  iglist_add(rp,do
95c0: 74 29 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a  t).struct rule *
95d0: 72 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 75  rp;    /* The ru
95e0: 6c 65 20 2a 2f 0a 69 6e 74 20 64 6f 74 3b 20 20  le */.int dot;  
95f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9600: 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20  ex into the RHS 
9610: 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72  of the rule wher
9620: 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a  e the dot goes *
9630: 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  /.{.  struct con
9640: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
9650: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72  ..  assert( curr
9660: 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d  entend!=0 );.  m
9670: 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20  odel.rp = rp;.  
9680: 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b  model.dot = dot;
9690: 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74  .  cfp = Configt
96a0: 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c  able_find(&model
96b0: 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20  );.  if( cfp==0 
96c0: 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77  ){.    cfp = new
96d0: 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66  config();.    cf
96e0: 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20  p->rp = rp;.    
96f0: 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a  cfp->dot = dot;.
9700: 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53      cfp->fws = S
9710: 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70  etNew();.    cfp
9720: 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63  ->stp = 0;.    c
9730: 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e  fp->fplp = cfp->
9740: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  bplp = 0;.    cf
9750: 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20  p->next = 0;.   
9760: 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20   cfp->bp = 0;.  
9770: 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20    *currentend = 
9780: 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74  cfp;.    current
9790: 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74  end = &cfp->next
97a0: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
97b0: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
97c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
97d0: 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73  .}../* Add a bas
97e0: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
97f0: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72   to the configur
9800: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74  ation list */.st
9810: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
9820: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
9830: 28 72 70 2c 64 6f 74 29 0a 73 74 72 75 63 74 20  (rp,dot).struct 
9840: 72 75 6c 65 20 2a 72 70 3b 0a 69 6e 74 20 64 6f  rule *rp;.int do
9850: 74 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  t;.{.  struct co
9860: 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c  nfig *cfp, model
9870: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 61 73  ;..  assert( bas
9880: 69 73 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73  isend!=0 );.  as
9890: 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64  sert( currentend
98a0: 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72  !=0 );.  model.r
98b0: 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e  p = rp;.  model.
98c0: 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70  dot = dot;.  cfp
98d0: 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66   = Configtable_f
98e0: 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69  ind(&model);.  i
98f0: 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20  f( cfp==0 ){.   
9900: 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67   cfp = newconfig
9910: 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20  ();.    cfp->rp 
9920: 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64  = rp;.    cfp->d
9930: 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66  ot = dot;.    cf
9940: 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28  p->fws = SetNew(
9950: 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20  );.    cfp->stp 
9960: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70  = 0;.    cfp->fp
9970: 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d  lp = cfp->bplp =
9980: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78   0;.    cfp->nex
9990: 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  t = 0;.    cfp->
99a0: 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72  bp = 0;.    *cur
99b0: 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20  rentend = cfp;. 
99c0: 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20     currentend = 
99d0: 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  &cfp->next;.    
99e0: 2a 62 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b  *basisend = cfp;
99f0: 0a 20 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20  .    basisend = 
9a00: 26 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f  &cfp->bp;.    Co
9a10: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
9a20: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
9a30: 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43  urn cfp;.}../* C
9a40: 6f 6d 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75  ompute the closu
9a50: 72 65 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67  re of the config
9a60: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
9a70: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
9a80: 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 0a 73 74  closure(lemp).st
9a90: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
9aa0: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
9ab0: 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66  fig *cfp, *newcf
9ac0: 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  p;.  struct rule
9ad0: 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20   *rp, *newrp;.  
9ae0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
9af0: 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69  p, *xsp;.  int i
9b00: 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74  , dot;..  assert
9b10: 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20  ( currentend!=0 
9b20: 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72  );.  for(cfp=cur
9b30: 72 65 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63  rent; cfp; cfp=c
9b40: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72  fp->next){.    r
9b50: 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20  p = cfp->rp;.   
9b60: 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b   dot = cfp->dot;
9b70: 0a 20 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70  .    if( dot>=rp
9b80: 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75  ->nrhs ) continu
9b90: 65 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e  e;.    sp = rp->
9ba0: 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66  rhs[dot];.    if
9bb0: 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54  ( sp->type==NONT
9bc0: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
9bd0: 20 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30   if( sp->rule==0
9be0: 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72   && sp!=lemp->er
9bf0: 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  rsym ){.        
9c00: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
9c10: 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65  ilename,rp->line
9c20: 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22  ,"Nonterminal \"
9c30: 25 73 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65  %s\" has no rule
9c40: 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73  s.",.          s
9c50: 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
9c60: 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
9c70: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
9c80: 20 20 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e    for(newrp=sp->
9c90: 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77  rule; newrp; new
9ca0: 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68  rp=newrp->nextlh
9cb0: 73 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63  s){.        newc
9cc0: 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fp = Configlist_
9cd0: 61 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20  add(newrp,0);.  
9ce0: 20 20 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b        for(i=dot+
9cf0: 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  1; i<rp->nrhs; i
9d00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78  ++){.          x
9d10: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
9d20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78  .          if( x
9d30: 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
9d40: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
9d50: 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d    SetAdd(newcfp-
9d60: 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29  >fws,xsp->index)
9d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
9d80: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
9d90: 65 6c 73 65 20 69 66 28 20 78 73 70 2d 3e 74 79  else if( xsp->ty
9da0: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
9db0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
9dc0: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
9dd0: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78      for(k=0; k<x
9de0: 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b  sp->nsubsym; k++
9df0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
9e00: 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e   SetAdd(newcfp->
9e10: 66 77 73 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d  fws, xsp->subsym
9e20: 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  [k]->index);.   
9e30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9e40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 20         break;.. 
9e50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9e60: 20 20 20 20 53 65 74 55 6e 69 6f 6e 28 6e 65 77      SetUnion(new
9e70: 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 66 69  cfp->fws,xsp->fi
9e80: 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20  rstset);.       
9e90: 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e 6c 61       if( xsp->la
9ea0: 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29 20  mbda==B_FALSE ) 
9eb0: 62 72 65 61 6b 3b 0a 09 20 20 7d 0a 09 7d 0a 20  break;..  }..}. 
9ec0: 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70         if( i==rp
9ed0: 2d 3e 6e 72 68 73 20 29 20 50 6c 69 6e 6b 5f 61  ->nrhs ) Plink_a
9ee0: 64 64 28 26 63 66 70 2d 3e 66 70 6c 70 2c 6e 65  dd(&cfp->fplp,ne
9ef0: 77 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  wcfp);.      }. 
9f00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9f10: 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68  n;.}../* Sort th
9f20: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
9f30: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
9f40: 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 7b 0a  figlist_sort(){.
9f50: 20 20 63 75 72 72 65 6e 74 20 3d 20 28 73 74 72    current = (str
9f60: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f  uct config *)mso
9f70: 72 74 28 28 63 68 61 72 20 2a 29 63 75 72 72 65  rt((char *)curre
9f80: 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26 28 63 75  nt,(char **)&(cu
9f90: 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c 43 6f 6e  rrent->next),Con
9fa0: 66 69 67 63 6d 70 29 3b 0a 20 20 63 75 72 72 65  figcmp);.  curre
9fb0: 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74  ntend = 0;.  ret
9fc0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20  urn;.}../* Sort 
9fd0: 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  the basis config
9fe0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
9ff0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
a000: 73 6f 72 74 62 61 73 69 73 28 29 7b 0a 20 20 62  sortbasis(){.  b
a010: 61 73 69 73 20 3d 20 28 73 74 72 75 63 74 20 63  asis = (struct c
a020: 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 28 63  onfig *)msort((c
a030: 68 61 72 20 2a 29 63 75 72 72 65 6e 74 2c 28 63  har *)current,(c
a040: 68 61 72 20 2a 2a 29 26 28 63 75 72 72 65 6e 74  har **)&(current
a050: 2d 3e 62 70 29 2c 43 6f 6e 66 69 67 63 6d 70 29  ->bp),Configcmp)
a060: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30  ;.  basisend = 0
a070: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
a080: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
a090: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
a0a0: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  f the configurat
a0b0: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  ion list and.** 
a0c0: 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20 2a  reset the list *
a0d0: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
a0e0: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75  *Configlist_retu
a0f0: 72 6e 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63  rn(){.  struct c
a100: 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c  onfig *old;.  ol
a110: 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a 20 20 63  d = current;.  c
a120: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75  urrent = 0;.  cu
a130: 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20  rrentend = 0;.  
a140: 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f  return old;.}../
a150: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
a160: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
a170: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  f the configurat
a180: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  ion list and.** 
a190: 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20 2a  reset the list *
a1a0: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
a1b0: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69  *Configlist_basi
a1c0: 73 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  s(){.  struct co
a1d0: 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64  nfig *old;.  old
a1e0: 20 3d 20 62 61 73 69 73 3b 0a 20 20 62 61 73 69   = basis;.  basi
a1f0: 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e  s = 0;.  basisen
a200: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
a210: 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20  old;.}../* Free 
a220: 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  all elements of 
a230: 74 68 65 20 67 69 76 65 6e 20 63 6f 6e 66 69 67  the given config
a240: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
a250: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
a260: 65 61 74 28 63 66 70 29 0a 73 74 72 75 63 74 20  eat(cfp).struct 
a270: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20  config *cfp;.{. 
a280: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
a290: 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f 72 28 3b  nextcfp;.  for(;
a2a0: 20 63 66 70 3b 20 63 66 70 3d 6e 65 78 74 63 66   cfp; cfp=nextcf
a2b0: 70 29 7b 0a 20 20 20 20 6e 65 78 74 63 66 70 20  p){.    nextcfp 
a2c0: 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  = cfp->next;.   
a2d0: 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 66 70   assert( cfp->fp
a2e0: 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  lp==0 );.    ass
a2f0: 65 72 74 28 20 63 66 70 2d 3e 62 70 6c 70 3d 3d  ert( cfp->bplp==
a300: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 63 66 70  0 );.    if( cfp
a310: 2d 3e 66 77 73 20 29 20 53 65 74 46 72 65 65 28  ->fws ) SetFree(
a320: 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 64  cfp->fws);.    d
a330: 65 6c 65 74 65 63 6f 6e 66 69 67 28 63 66 70 29  eleteconfig(cfp)
a340: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
a350: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
a360: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
a370: 6c 65 20 22 65 72 72 6f 72 2e 63 22 20 2a 2a 2a  le "error.c" ***
a380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
a3a0: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
a3b0: 72 69 6e 74 69 6e 67 20 65 72 72 6f 72 20 6d 65  rinting error me
a3c0: 73 73 61 67 65 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69  ssage..*/../* Fi
a3d0: 6e 64 20 61 20 67 6f 6f 64 20 70 6c 61 63 65 20  nd a good place 
a3e0: 74 6f 20 62 72 65 61 6b 20 22 6d 73 67 22 20 73  to break "msg" s
a3f0: 6f 20 74 68 61 74 20 69 74 73 20 6c 65 6e 67 74  o that its lengt
a400: 68 20 69 73 20 61 74 20 6c 65 61 73 74 20 22 6d  h is at least "m
a410: 69 6e 22 0a 2a 2a 20 62 75 74 20 6e 6f 20 6d 6f  in".** but no mo
a420: 72 65 20 74 68 61 6e 20 22 6d 61 78 22 2e 20 20  re than "max".  
a430: 4d 61 6b 65 20 74 68 65 20 70 6f 69 6e 74 20 61  Make the point a
a440: 73 20 63 6c 6f 73 65 20 74 6f 20 6d 61 78 20 61  s close to max a
a450: 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73  s possible..*/.s
a460: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 62 72  tatic int findbr
a470: 65 61 6b 28 6d 73 67 2c 6d 69 6e 2c 6d 61 78 29  eak(msg,min,max)
a480: 0a 63 68 61 72 20 2a 6d 73 67 3b 0a 69 6e 74 20  .char *msg;.int 
a490: 6d 69 6e 3b 0a 69 6e 74 20 6d 61 78 3b 0a 7b 0a  min;.int max;.{.
a4a0: 20 20 69 6e 74 20 69 2c 73 70 6f 74 3b 0a 20 20    int i,spot;.  
a4b0: 63 68 61 72 20 63 3b 0a 20 20 66 6f 72 28 69 3d  char c;.  for(i=
a4c0: 73 70 6f 74 3d 6d 69 6e 3b 20 69 3c 3d 6d 61 78  spot=min; i<=max
a4d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 20 3d 20  ; i++){.    c = 
a4e0: 6d 73 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  msg[i];.    if( 
a4f0: 63 3d 3d 27 5c 74 27 20 29 20 6d 73 67 5b 69 5d  c=='\t' ) msg[i]
a500: 20 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20   = ' ';.    if( 
a510: 63 3d 3d 27 5c 6e 27 20 29 7b 20 6d 73 67 5b 69  c=='\n' ){ msg[i
a520: 5d 20 3d 20 27 20 27 3b 20 73 70 6f 74 20 3d 20  ] = ' '; spot = 
a530: 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  i; break; }.    
a540: 69 66 28 20 63 3d 3d 30 20 29 7b 20 73 70 6f 74  if( c==0 ){ spot
a550: 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20   = i; break; }. 
a560: 20 20 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26     if( c=='-' &&
a570: 20 69 3c 6d 61 78 2d 31 20 29 20 73 70 6f 74 20   i<max-1 ) spot 
a580: 3d 20 69 2b 31 3b 0a 20 20 20 20 69 66 28 20 63  = i+1;.    if( c
a590: 3d 3d 27 20 27 20 29 20 73 70 6f 74 20 3d 20 69  ==' ' ) spot = i
a5a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
a5b0: 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pot;.}../*.** Th
a5c0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
a5d0: 69 73 20 73 70 6c 69 74 20 61 63 72 6f 73 73 20  is split across 
a5e0: 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 65 73 20 69  multiple lines i
a5f0: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
a600: 65 0a 2a 2a 20 73 70 6c 69 74 73 20 6f 63 63 75  e.** splits occu
a610: 72 20 61 74 20 61 20 73 70 61 63 65 2c 20 69 66  r at a space, if
a620: 20 74 68 65 72 65 20 69 73 20 61 20 73 70 61 63   there is a spac
a630: 65 20 61 76 61 69 6c 61 62 6c 65 20 6e 65 61 72  e available near
a640: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74   the end.** of t
a650: 68 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 23 64 65 66  he line..*/.#def
a660: 69 6e 65 20 45 52 52 4d 53 47 53 49 5a 45 20 20  ine ERRMSGSIZE  
a670: 31 30 30 30 30 20 2f 2a 20 48 6f 70 65 20 74 68  10000 /* Hope th
a680: 69 73 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  is is big enough
a690: 2e 20 20 4e 6f 20 77 61 79 20 74 6f 20 65 72 72  .  No way to err
a6a0: 6f 72 20 63 68 65 63 6b 20 2a 2f 0a 23 64 65 66  or check */.#def
a6b0: 69 6e 65 20 4c 49 4e 45 57 49 44 54 48 20 20 20  ine LINEWIDTH   
a6c0: 20 20 20 37 39 20 2f 2a 20 4d 61 78 20 77 69 64     79 /* Max wid
a6d0: 74 68 20 6f 66 20 61 6e 79 20 6f 75 74 70 75 74  th of any output
a6e0: 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65   line */.#define
a6f0: 20 50 52 45 46 49 58 4c 49 4d 49 54 20 20 20 20   PREFIXLIMIT    
a700: 33 30 20 2f 2a 20 4d 61 78 20 77 69 64 74 68 20  30 /* Max width 
a710: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 6f 6e  of the prefix on
a720: 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 76 6f   each line */.vo
a730: 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73  id ErrorMsg(cons
a740: 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
a750: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f  , int lineno, co
a760: 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74  nst char *format
a770: 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 65  , ...){.  char e
a780: 72 72 6d 73 67 5b 45 52 52 4d 53 47 53 49 5a 45  rrmsg[ERRMSGSIZE
a790: 5d 3b 0a 20 20 63 68 61 72 20 70 72 65 66 69 78  ];.  char prefix
a7a0: 5b 50 52 45 46 49 58 4c 49 4d 49 54 2b 31 30 5d  [PREFIXLIMIT+10]
a7b0: 3b 0a 20 20 69 6e 74 20 65 72 72 6d 73 67 73 69  ;.  int errmsgsi
a7c0: 7a 65 3b 0a 20 20 69 6e 74 20 70 72 65 66 69 78  ze;.  int prefix
a7d0: 73 69 7a 65 3b 0a 20 20 69 6e 74 20 61 76 61 69  size;.  int avai
a7e0: 6c 61 62 6c 65 77 69 64 74 68 3b 0a 20 20 76 61  lablewidth;.  va
a7f0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
a800: 65 6e 64 2c 20 72 65 73 74 61 72 74 2c 20 62 61  end, restart, ba
a810: 73 65 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28  se;..  va_start(
a820: 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 2f  ap, format);.  /
a830: 2a 20 50 72 65 70 61 72 65 20 61 20 70 72 65 66  * Prepare a pref
a840: 69 78 20 74 6f 20 62 65 20 70 72 65 70 65 6e 64  ix to be prepend
a850: 65 64 20 74 6f 20 65 76 65 72 79 20 6f 75 74 70  ed to every outp
a860: 75 74 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28  ut line */.  if(
a870: 20 6c 69 6e 65 6e 6f 3e 30 20 29 7b 0a 20 20 20   lineno>0 ){.   
a880: 20 73 70 72 69 6e 74 66 28 70 72 65 66 69 78 2c   sprintf(prefix,
a890: 22 25 2e 2a 73 3a 25 64 3a 20 22 2c 50 52 45 46  "%.*s:%d: ",PREF
a8a0: 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69 6c 65 6e  IXLIMIT-10,filen
a8b0: 61 6d 65 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d  ame,lineno);.  }
a8c0: 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74  else{.    sprint
a8d0: 66 28 70 72 65 66 69 78 2c 22 25 2e 2a 73 3a 20  f(prefix,"%.*s: 
a8e0: 22 2c 50 52 45 46 49 58 4c 49 4d 49 54 2d 31 30  ",PREFIXLIMIT-10
a8f0: 2c 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  ,filename);.  }.
a900: 20 20 70 72 65 66 69 78 73 69 7a 65 20 3d 20 73    prefixsize = s
a910: 74 72 6c 65 6e 28 70 72 65 66 69 78 29 3b 0a 20  trlen(prefix);. 
a920: 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68 20   availablewidth 
a930: 3d 20 4c 49 4e 45 57 49 44 54 48 20 2d 20 70 72  = LINEWIDTH - pr
a940: 65 66 69 78 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  efixsize;..  /* 
a950: 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 72 72  Generate the err
a960: 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20  or message */.  
a970: 76 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c  vsprintf(errmsg,
a980: 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61  format,ap);.  va
a990: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65 72 72 6d  _end(ap);.  errm
a9a0: 73 67 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28  sgsize = strlen(
a9b0: 65 72 72 6d 73 67 29 3b 0a 20 20 2f 2a 20 52 65  errmsg);.  /* Re
a9c0: 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67 20 27 5c  move trailing '\
a9d0: 6e 27 73 20 66 72 6f 6d 20 74 68 65 20 65 72 72  n's from the err
a9e0: 6f 72 20 6d 65 73 73 61 67 65 2e 20 2a 2f 0a 20  or message. */. 
a9f0: 20 77 68 69 6c 65 28 20 65 72 72 6d 73 67 73 69   while( errmsgsi
aa00: 7a 65 3e 30 20 26 26 20 65 72 72 6d 73 67 5b 65  ze>0 && errmsg[e
aa10: 72 72 6d 73 67 73 69 7a 65 2d 31 5d 3d 3d 27 5c  rrmsgsize-1]=='\
aa20: 6e 27 20 29 7b 0a 20 20 20 20 20 65 72 72 6d 73  n' ){.     errms
aa30: 67 5b 2d 2d 65 72 72 6d 73 67 73 69 7a 65 5d 20  g[--errmsgsize] 
aa40: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  = 0;.  }..  /* P
aa50: 72 69 6e 74 20 74 68 65 20 65 72 72 6f 72 20 6d  rint the error m
aa60: 65 73 73 61 67 65 20 2a 2f 0a 20 20 62 61 73 65  essage */.  base
aa70: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 65   = 0;.  while( e
aa80: 72 72 6d 73 67 5b 62 61 73 65 5d 21 3d 30 20 29  rrmsg[base]!=0 )
aa90: 7b 0a 20 20 20 20 65 6e 64 20 3d 20 72 65 73 74  {.    end = rest
aaa0: 61 72 74 20 3d 20 66 69 6e 64 62 72 65 61 6b 28  art = findbreak(
aab0: 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 2c 30 2c  &errmsg[base],0,
aac0: 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68 29 3b  availablewidth);
aad0: 0a 20 20 20 20 72 65 73 74 61 72 74 20 2b 3d 20  .    restart += 
aae0: 62 61 73 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  base;.    while(
aaf0: 20 65 72 72 6d 73 67 5b 72 65 73 74 61 72 74 5d   errmsg[restart]
ab00: 3d 3d 27 20 27 20 29 20 72 65 73 74 61 72 74 2b  ==' ' ) restart+
ab10: 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  +;.    fprintf(s
ab20: 74 64 6f 75 74 2c 22 25 73 25 2e 2a 73 5c 6e 22  tdout,"%s%.*s\n"
ab30: 2c 70 72 65 66 69 78 2c 65 6e 64 2c 26 65 72 72  ,prefix,end,&err
ab40: 6d 73 67 5b 62 61 73 65 5d 29 3b 0a 20 20 20 20  msg[base]);.    
ab50: 62 61 73 65 20 3d 20 72 65 73 74 61 72 74 3b 0a  base = restart;.
ab60: 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
ab70: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
ab80: 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a   file "main.c" *
ab90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
abb0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20  ***/./*.** Main 
abc0: 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72  program file for
abd0: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
abe0: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
abf0: 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75  ./* Report an ou
ac00: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64  t-of-memory cond
ac10: 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e  ition and abort.
ac20: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a    This function.
ac30: 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c  ** is used mostl
ac40: 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79  y by the "Memory
ac50: 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20  Check" macro in 
ac60: 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64  struct.h.*/.void
ac70: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b   memory_error(){
ac80: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
ac90: 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
aca0: 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e  .  Aborting...\n
acb0: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
acc0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 44 65  ..static int nDe
acd0: 66 69 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  fine = 0;      /
ace0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f  * Number of -D o
acf0: 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f  ptions on the co
ad00: 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74  mmand line */.st
ad10: 61 74 69 63 20 63 68 61 72 20 2a 2a 61 7a 44 65  atic char **azDe
ad20: 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61  fine = 0;  /* Na
ad30: 6d 65 20 6f 66 20 74 68 65 20 2d 44 20 6d 61 63  me of the -D mac
ad40: 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20  ros */../* This 
ad50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
ad60: 64 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d  d with the argum
ad70: 65 6e 74 20 74 6f 20 65 61 63 68 20 2d 44 20 63  ent to each -D c
ad80: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
ad90: 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d  on..** Add the m
ada0: 61 63 72 6f 20 64 65 66 69 6e 65 64 20 74 6f 20  acro defined to 
adb0: 74 68 65 20 61 7a 44 65 66 69 6e 65 20 61 72 72  the azDefine arr
adc0: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
add0: 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69  id handle_D_opti
ade0: 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  on(char *z){.  c
adf0: 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65  har **paz;.  nDe
ae00: 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69  fine++;.  azDefi
ae10: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 61 7a 44  ne = realloc(azD
ae20: 65 66 69 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a  efine, sizeof(az
ae30: 44 65 66 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69  Define[0])*nDefi
ae40: 6e 65 29 3b 0a 20 20 69 66 28 20 61 7a 44 65 66  ne);.  if( azDef
ae50: 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ine==0 ){.    fp
ae60: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75  rintf(stderr,"ou
ae70: 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
ae80: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
ae90: 7d 0a 20 20 70 61 7a 20 3d 20 26 61 7a 44 65 66  }.  paz = &azDef
aea0: 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a  ine[nDefine-1];.
aeb0: 20 20 2a 70 61 7a 20 3d 20 6d 61 6c 6c 6f 63 28    *paz = malloc(
aec0: 20 73 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a   strlen(z)+1 );.
aed0: 20 20 69 66 28 20 2a 70 61 7a 3d 3d 30 20 29 7b    if( *paz==0 ){
aee0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
aef0: 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  err,"out of memo
af00: 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ry\n");.    exit
af10: 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70  (1);.  }.  strcp
af20: 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f  y(*paz, z);.  fo
af30: 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26 20  r(z=*paz; *z && 
af40: 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a  *z!='='; z++){}.
af50: 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a    *z = 0;.}.../*
af60: 20 54 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   The main progra
af70: 6d 2e 20 20 50 61 72 73 65 20 74 68 65 20 63 6f  m.  Parse the co
af80: 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64 20 64  mmand line and d
af90: 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20 6d  o it... */.int m
afa0: 61 69 6e 28 61 72 67 63 2c 61 72 67 76 29 0a 69  ain(argc,argv).i
afb0: 6e 74 20 61 72 67 63 3b 0a 63 68 61 72 20 2a 2a  nt argc;.char **
afc0: 61 72 67 76 3b 0a 7b 0a 20 20 73 74 61 74 69 63  argv;.{.  static
afd0: 20 69 6e 74 20 76 65 72 73 69 6f 6e 20 3d 20 30   int version = 0
afe0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 72  ;.  static int r
aff0: 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  pflag = 0;.  sta
b000: 74 69 63 20 69 6e 74 20 62 61 73 69 73 66 6c 61  tic int basisfla
b010: 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  g = 0;.  static 
b020: 69 6e 74 20 63 6f 6d 70 72 65 73 73 20 3d 20 30  int compress = 0
b030: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 71  ;.  static int q
b040: 75 69 65 74 20 3d 20 30 3b 0a 20 20 73 74 61 74  uiet = 0;.  stat
b050: 69 63 20 69 6e 74 20 73 74 61 74 69 73 74 69 63  ic int statistic
b060: 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  s = 0;.  static 
b070: 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20 30 3b 0a  int mhflag = 0;.
b080: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
b090: 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69 6f 6e  s_options option
b0a0: 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f 50 54  s[] = {.    {OPT
b0b0: 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28 63 68 61  _FLAG, "b", (cha
b0c0: 72 2a 29 26 62 61 73 69 73 66 6c 61 67 2c 20 22  r*)&basisflag, "
b0d0: 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65 20 62  Print only the b
b0e0: 61 73 69 73 20 69 6e 20 72 65 70 6f 72 74 2e 22  asis in report."
b0f0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
b100: 2c 20 22 63 22 2c 20 28 63 68 61 72 2a 29 26 63  , "c", (char*)&c
b110: 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27 74 20  ompress, "Don't 
b120: 63 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74  compress the act
b130: 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a 20 20  ion table."},.  
b140: 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 44 22    {OPT_FSTR, "D"
b150: 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f  , (char*)handle_
b160: 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65 66 69 6e  D_option, "Defin
b170: 65 20 61 6e 20 25 69 66 64 65 66 20 6d 61 63 72  e an %ifdef macr
b180: 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  o."},.    {OPT_F
b190: 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a  LAG, "g", (char*
b1a0: 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74  )&rpflag, "Print
b1b0: 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74   grammar without
b1c0: 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20   actions."},.   
b1d0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c   {OPT_FLAG, "m",
b1e0: 20 28 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c   (char*)&mhflag,
b1f0: 20 22 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68   "Output a makeh
b200: 65 61 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c  eaders compatibl
b210: 65 20 66 69 6c 65 22 7d 2c 0a 20 20 20 20 7b 4f  e file"},.    {O
b220: 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28 63  PT_FLAG, "q", (c
b230: 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28 51  har*)&quiet, "(Q
b240: 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69 6e  uiet) Don't prin
b250: 74 20 74 68 65 20 72 65 70 6f 72 74 20 66 69 6c  t the report fil
b260: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
b270: 4c 41 47 2c 20 22 73 22 2c 20 28 63 68 61 72 2a  LAG, "s", (char*
b280: 29 26 73 74 61 74 69 73 74 69 63 73 2c 0a 20 20  )&statistics,.  
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 20 22 50 72 69 6e 74 20 70 61 72 73 65 72 20 73   "Print parser s
b2c0: 74 61 74 73 20 74 6f 20 73 74 61 6e 64 61 72 64  tats to standard
b2d0: 20 6f 75 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20   output."},.    
b2e0: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20  {OPT_FLAG, "x", 
b2f0: 28 63 68 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c  (char*)&version,
b300: 20 22 50 72 69 6e 74 20 74 68 65 20 76 65 72 73   "Print the vers
b310: 69 6f 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20  ion number."},. 
b320: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30     {OPT_FLAG,0,0
b330: 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  ,0}.  };.  int i
b340: 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ;.  struct lemon
b350: 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69 74   lem;..  OptInit
b360: 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74  (argv,options,st
b370: 64 65 72 72 29 3b 0a 20 20 69 66 28 20 76 65 72  derr);.  if( ver
b380: 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72 69  sion ){.     pri
b390: 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69  ntf("Lemon versi
b3a0: 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20  on 1.0\n");.    
b3b0: 20 65 78 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20   exit(0); .  }. 
b3c0: 20 69 66 28 20 4f 70 74 4e 41 72 67 73 28 29 21   if( OptNArgs()!
b3d0: 3d 31 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =1 ){.    fprint
b3e0: 66 28 73 74 64 65 72 72 2c 22 45 78 61 63 74 6c  f(stderr,"Exactl
b3f0: 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61  y one filename a
b400: 72 67 75 6d 65 6e 74 20 69 73 20 72 65 71 75 69  rgument is requi
b410: 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  red.\n");.    ex
b420: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d  it(1);.  }.  lem
b430: 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a  .errorcnt = 0;..
b440: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
b450: 74 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  the machine */. 
b460: 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 3b   Strsafe_init();
b470: 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29  .  Symbol_init()
b480: 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69 74 28 29  ;.  State_init()
b490: 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20  ;.  lem.argv0 = 
b4a0: 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66  argv[0];.  lem.f
b4b0: 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67  ilename = OptArg
b4c0: 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73  (0);.  lem.basis
b4d0: 66 6c 61 67 20 3d 20 62 61 73 69 73 66 6c 61 67  flag = basisflag
b4e0: 3b 0a 20 20 6c 65 6d 2e 68 61 73 5f 66 61 6c 6c  ;.  lem.has_fall
b4f0: 62 61 63 6b 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e  back = 0;.  lem.
b500: 6e 63 6f 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 20  nconflict = 0;. 
b510: 20 6c 65 6d 2e 6e 61 6d 65 20 3d 20 6c 65 6d 2e   lem.name = lem.
b520: 69 6e 63 6c 75 64 65 20 3d 20 6c 65 6d 2e 61 72  include = lem.ar
b530: 67 20 3d 20 6c 65 6d 2e 74 6f 6b 65 6e 74 79 70  g = lem.tokentyp
b540: 65 20 3d 20 6c 65 6d 2e 73 74 61 72 74 20 3d 20  e = lem.start = 
b550: 30 3b 0a 20 20 6c 65 6d 2e 76 61 72 74 79 70 65  0;.  lem.vartype
b560: 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 73 74 61 63   = 0;.  lem.stac
b570: 6b 73 69 7a 65 20 3d 20 30 3b 0a 20 20 6c 65 6d  ksize = 0;.  lem
b580: 2e 65 72 72 6f 72 20 3d 20 6c 65 6d 2e 6f 76 65  .error = lem.ove
b590: 72 66 6c 6f 77 20 3d 20 6c 65 6d 2e 66 61 69 6c  rflow = lem.fail
b5a0: 75 72 65 20 3d 20 6c 65 6d 2e 61 63 63 65 70 74  ure = lem.accept
b5b0: 20 3d 20 6c 65 6d 2e 74 6f 6b 65 6e 64 65 73 74   = lem.tokendest
b5c0: 20 3d 0a 20 20 20 20 20 6c 65 6d 2e 74 6f 6b 65   =.     lem.toke
b5d0: 6e 70 72 65 66 69 78 20 3d 20 6c 65 6d 2e 6f 75  nprefix = lem.ou
b5e0: 74 6e 61 6d 65 20 3d 20 6c 65 6d 2e 65 78 74 72  tname = lem.extr
b5f0: 61 63 6f 64 65 20 3d 20 30 3b 0a 20 20 6c 65 6d  acode = 0;.  lem
b600: 2e 76 61 72 64 65 73 74 20 3d 20 30 3b 0a 20 20  .vardest = 0;.  
b610: 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 20 3d 20  lem.tablesize = 
b620: 30 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  0;.  Symbol_new(
b630: 22 24 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73  "$");.  lem.errs
b640: 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  ym = Symbol_new(
b650: 22 65 72 72 6f 72 22 29 3b 0a 0a 20 20 2f 2a 20  "error");..  /* 
b660: 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20  Parse the input 
b670: 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28  file */.  Parse(
b680: 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d  &lem);.  if( lem
b690: 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74  .errorcnt ) exit
b6a0: 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a  (lem.errorcnt);.
b6b0: 20 20 69 66 28 20 6c 65 6d 2e 72 75 6c 65 3d 3d    if( lem.rule==
b6c0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
b6d0: 28 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20 67  (stderr,"Empty g
b6e0: 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20  rammar.\n");.   
b6f0: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20   exit(1);.  }.. 
b700: 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e   /* Count and in
b710: 64 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  dex the symbols 
b720: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  of the grammar *
b730: 2f 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20  /.  lem.nsymbol 
b740: 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29  = Symbol_count()
b750: 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22  ;.  Symbol_new("
b760: 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c  {default}");.  l
b770: 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d  em.symbols = Sym
b780: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20  bol_arrayof();. 
b790: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d   for(i=0; i<=lem
b7a0: 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c  .nsymbol; i++) l
b7b0: 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69  em.symbols[i]->i
b7c0: 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72  ndex = i;.  qsor
b7d0: 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65  t(lem.symbols,le
b7e0: 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65  m.nsymbol+1,size
b7f0: 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
b800: 2a 29 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74  *),.        (int
b810: 28 2a 29 28 29 29 53 79 6d 62 6f 6c 63 6d 70 70  (*)())Symbolcmpp
b820: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
b830: 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  =lem.nsymbol; i+
b840: 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  +) lem.symbols[i
b850: 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20  ]->index = i;.  
b860: 66 6f 72 28 69 3d 31 3b 20 69 73 75 70 70 65 72  for(i=1; isupper
b870: 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  (lem.symbols[i]-
b880: 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b  >name[0]); i++);
b890: 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c  .  lem.nterminal
b8a0: 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65   = i;..  /* Gene
b8b0: 72 61 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f  rate a reprint o
b8c0: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69  f the grammar, i
b8d0: 66 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74  f requested on t
b8e0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
b8f0: 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20  */.  if( rpflag 
b900: 29 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26  ){.    Reprint(&
b910: 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lem);.  }else{. 
b920: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
b930: 20 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c   the size for al
b940: 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72  l follow and fir
b950: 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53  st sets */.    S
b960: 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d  etSize(lem.nterm
b970: 69 6e 61 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  inal);..    /* F
b980: 69 6e 64 20 74 68 65 20 70 72 65 63 65 64 65 6e  ind the preceden
b990: 63 65 20 66 6f 72 20 65 76 65 72 79 20 70 72 6f  ce for every pro
b9a0: 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28 74 68  duction rule (th
b9b0: 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20  at has one) */. 
b9c0: 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65     FindRulePrece
b9d0: 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20  dences(&lem);.. 
b9e0: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
b9f0: 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d  e lambda-nonterm
ba00: 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20 66 69  inals and the fi
ba10: 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65 76 65  rst-sets for eve
ba20: 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72  ry.    ** nonter
ba30: 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e  minal */.    Fin
ba40: 64 46 69 72 73 74 53 65 74 73 28 26 6c 65 6d 29  dFirstSets(&lem)
ba50: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
ba60: 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74  e all LR(0) stat
ba70: 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f 72 64  es.  Also record
ba80: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70   follow-set prop
ba90: 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c  agation.    ** l
baa0: 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74 68 65  inks so that the
bab0: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20   follow-set can 
bac0: 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65  be computed late
bad0: 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74  r */.    lem.nst
bae0: 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e  ate = 0;.    Fin
baf0: 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20  dStates(&lem);. 
bb00: 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20     lem.sorted = 
bb10: 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 3b  State_arrayof();
bb20: 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75 70 20  ..    /* Tie up 
bb30: 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20 74 68  loose ends on th
bb40: 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69  e propagation li
bb50: 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c  nks */.    FindL
bb60: 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  inks(&lem);..   
bb70: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
bb80: 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20 65 76  follow set of ev
bb90: 65 72 79 20 72 65 64 75 63 69 62 6c 65 20 63 6f  ery reducible co
bba0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20  nfiguration */. 
bbb0: 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74     FindFollowSet
bbc0: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
bbd0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74   Compute the act
bbe0: 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ion tables */.  
bbf0: 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c    FindActions(&l
bc00: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  em);..    /* Com
bc10: 70 72 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e  press the action
bc20: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69   tables */.    i
bc30: 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29  f( compress==0 )
bc40: 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28   CompressTables(
bc50: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  &lem);..    /* R
bc60: 65 6f 72 64 65 72 20 61 6e 64 20 72 65 6e 75 6d  eorder and renum
bc70: 62 65 72 20 74 68 65 20 73 74 61 74 65 73 20 73  ber the states s
bc80: 6f 20 74 68 61 74 20 73 74 61 74 65 73 20 77 69  o that states wi
bc90: 74 68 20 66 65 77 65 72 20 63 68 6f 69 63 65 73  th fewer choices
bca0: 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 61 74  .    ** occur at
bcb0: 20 74 68 65 20 65 6e 64 2e 20 2a 2f 0a 20 20 20   the end. */.   
bcc0: 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 26 6c   ResortStates(&l
bcd0: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  em);..    /* Gen
bce0: 65 72 61 74 65 20 61 20 72 65 70 6f 72 74 20 6f  erate a report o
bcf0: 66 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e  f the parser gen
bd00: 65 72 61 74 65 64 2e 20 20 28 74 68 65 20 22 79  erated.  (the "y
bd10: 2e 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20 2a  .output" file) *
bd20: 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69 65 74  /.    if( !quiet
bd30: 20 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28   ) ReportOutput(
bd40: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  &lem);..    /* G
bd50: 65 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75 72  enerate the sour
bd60: 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ce code for the 
bd70: 70 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52 65  parser */.    Re
bd80: 70 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20  portTable(&lem, 
bd90: 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a  mhflag);..    /*
bda0: 20 50 72 6f 64 75 63 65 20 61 20 68 65 61 64 65   Produce a heade
bdb0: 72 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20 62  r file for use b
bdc0: 79 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20 20  y the scanner.  
bdd0: 28 54 68 69 73 20 73 74 65 70 20 69 73 0a 20 20  (This step is.  
bde0: 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20    ** omitted if 
bdf0: 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20  the "-m" option 
be00: 69 73 20 75 73 65 64 20 62 65 63 61 75 73 65 20  is used because 
be10: 6d 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c 6c  makeheaders will
be20: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
be30: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75 73   the file for us
be40: 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d  .) */.    if( !m
be50: 68 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48 65  hflag ) ReportHe
be60: 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a  ader(&lem);.  }.
be70: 20 20 69 66 28 20 73 74 61 74 69 73 74 69 63 73    if( statistics
be80: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
be90: 50 61 72 73 65 72 20 73 74 61 74 69 73 74 69 63  Parser statistic
bea0: 73 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73 2c  s: %d terminals,
beb0: 20 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73   %d nonterminals
bec0: 2c 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a 20  , %d rules\n",. 
bed0: 20 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e       lem.ntermin
bee0: 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20  al, lem.nsymbol 
bef0: 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c  - lem.nterminal,
bf00: 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20   lem.nrule);.   
bf10: 20 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 20   printf("       
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 73              %d s
bf30: 74 61 74 65 73 2c 20 25 64 20 70 61 72 73 65 72  tates, %d parser
bf40: 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c 20   table entries, 
bf50: 25 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22 2c  %d conflicts\n",
bf60: 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74  .      lem.nstat
bf70: 65 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65  e, lem.tablesize
bf80: 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  , lem.nconflict)
bf90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e  ;.  }.  if( lem.
bfa0: 6e 63 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20  nconflict ){.   
bfb0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
bfc0: 22 25 64 20 70 61 72 73 69 6e 67 20 63 6f 6e 66  "%d parsing conf
bfd0: 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63  licts.\n",lem.nc
bfe0: 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20  onflict);.  }.  
bff0: 65 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e  exit(lem.errorcn
c000: 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63  t + lem.nconflic
c010: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 6c 65  t);.  return (le
c020: 6d 2e 65 72 72 6f 72 63 6e 74 20 2b 20 6c 65 6d  m.errorcnt + lem
c030: 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 7d 0a 2f  .nconflict);.}./
c040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c050: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
c060: 6c 65 20 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a  le "msort.c" ***
c070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
c090: 0a 2a 2a 20 41 20 67 65 6e 65 72 69 63 20 6d 65  .** A generic me
c0a0: 72 67 65 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d  rge-sort program
c0b0: 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a  ..**.** USAGE:.*
c0c0: 2a 20 4c 65 74 20 22 70 74 72 22 20 62 65 20 61  * Let "ptr" be a
c0d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65   pointer to some
c0e0: 20 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68   structure which
c0f0: 20 69 73 20 61 74 20 74 68 65 20 68 65 61 64 20   is at the head 
c100: 6f 66 0a 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72  of.** a null-ter
c110: 6d 69 6e 61 74 65 64 20 6c 69 73 74 2e 20 20 54  minated list.  T
c120: 68 65 6e 20 74 6f 20 73 6f 72 74 20 74 68 65 20  hen to sort the 
c130: 6c 69 73 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a  list call:.**.**
c140: 20 20 20 20 20 70 74 72 20 3d 20 6d 73 6f 72 74       ptr = msort
c150: 28 70 74 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74  (ptr,&(ptr->next
c160: 29 2c 63 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a  ),cmpfnc);.**.**
c170: 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 22   In the above, "
c180: 63 6d 70 66 6e 63 22 20 69 73 20 61 20 70 6f 69  cmpfnc" is a poi
c190: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
c1a0: 6f 6e 20 77 68 69 63 68 20 63 6f 6d 70 61 72 65  on which compare
c1b0: 73 0a 2a 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63  s.** two instanc
c1c0: 65 73 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  es of the struct
c1d0: 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  ure and returns 
c1e0: 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 73 20 69  an integer, as i
c1f0: 6e 0a 2a 2a 20 73 74 72 63 6d 70 2e 20 20 54 68  n.** strcmp.  Th
c200: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
c210: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
c220: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f  o the pointer to
c230: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65   the.** second e
c240: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
c250: 6e 6b 65 64 20 6c 69 73 74 2e 20 20 54 68 69 73  nked list.  This
c260: 20 61 64 64 72 65 73 73 20 69 73 20 75 73 65 64   address is used
c270: 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74   to compute.** t
c280: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c290: 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20 77 69   "next" field wi
c2a0: 74 68 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  thin the structu
c2b0: 72 65 2e 20 20 54 68 65 20 6f 66 66 73 65 74 20  re.  The offset 
c2c0: 74 6f 0a 2a 2a 20 74 68 65 20 22 6e 65 78 74 22  to.** the "next"
c2d0: 20 66 69 65 6c 64 20 6d 75 73 74 20 62 65 20 63   field must be c
c2e0: 6f 6e 73 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20  onstant for all 
c2f0: 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68  structures in th
c300: 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e list..**.** Th
c310: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
c320: 6e 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  ns a new pointer
c330: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 68 65   which is the he
c340: 61 64 20 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a  ad of the list.*
c350: 2a 20 61 66 74 65 72 20 73 6f 72 74 69 6e 67 2e  * after sorting.
c360: 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d  .**.** ALGORITHM
c370: 3a 0a 2a 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e  :.** Merge-sort.
c380: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
c390: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
c3a0: 68 65 20 6e 65 78 74 20 73 74 72 75 63 74 75 72  he next structur
c3b0: 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
c3c0: 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  list..*/.#define
c3d0: 20 4e 45 58 54 28 41 29 20 28 2a 28 63 68 61 72   NEXT(A) (*(char
c3e0: 2a 2a 29 28 28 28 75 6e 73 69 67 6e 65 64 20 6c  **)(((unsigned l
c3f0: 6f 6e 67 29 41 29 2b 6f 66 66 73 65 74 29 29 0a  ong)A)+offset)).
c400: 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a  ./*.** Inputs:.*
c410: 2a 20 20 20 61 3a 20 20 20 20 20 20 20 41 20 73  *   a:       A s
c420: 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d  orted, null-term
c430: 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69  inated linked li
c440: 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c  st.  (May be nul
c450: 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20  l)..**   b:     
c460: 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c    A sorted, null
c470: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b  -terminated link
c480: 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62  ed list.  (May b
c490: 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d  e null)..**   cm
c4a0: 70 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65 72  p:     A pointer
c4b0: 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   to the comparis
c4c0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  on function..** 
c4d0: 20 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73 65    offset:  Offse
c4e0: 74 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75  t in the structu
c4f0: 72 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22  re to the "next"
c500: 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65   field..**.** Re
c510: 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20  turn Value:.**  
c520: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
c530: 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74  e head of a sort
c540: 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  ed list containi
c550: 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a  ng the elements.
c560: 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20 61  **   of both a a
c570: 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65  nd b..**.** Side
c580: 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54   effects:.**   T
c590: 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65  he "next" pointe
c5a0: 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20  rs for elements 
c5b0: 69 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20 61  in the lists a a
c5c0: 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63 68  nd b are.**   ch
c5d0: 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  anged..*/.static
c5e0: 20 63 68 61 72 20 2a 6d 65 72 67 65 28 61 2c 62   char *merge(a,b
c5f0: 2c 63 6d 70 2c 6f 66 66 73 65 74 29 0a 63 68 61  ,cmp,offset).cha
c600: 72 20 2a 61 3b 0a 63 68 61 72 20 2a 62 3b 0a 69  r *a;.char *b;.i
c610: 6e 74 20 28 2a 63 6d 70 29 28 29 3b 0a 69 6e 74  nt (*cmp)();.int
c620: 20 6f 66 66 73 65 74 3b 0a 7b 0a 20 20 63 68 61   offset;.{.  cha
c630: 72 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a  r *ptr, *head;..
c640: 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20    if( a==0 ){.  
c650: 20 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65    head = b;.  }e
c660: 6c 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a  lse if( b==0 ){.
c670: 20 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20 20      head = a;.  
c680: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 28  }else{.    if( (
c690: 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a  *cmp)(a,b)<0 ){.
c6a0: 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20        ptr = a;. 
c6b0: 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29       a = NEXT(a)
c6c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c6d0: 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20     ptr = b;.    
c6e0: 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20    b = NEXT(b);. 
c6f0: 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20 3d 20     }.    head = 
c700: 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ptr;.    while( 
c710: 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20 20 20  a && b ){.      
c720: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
c730: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 45 58  0 ){.        NEX
c740: 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20  T(ptr) = a;.    
c750: 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20 20      ptr = a;.   
c760: 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29       a = NEXT(a)
c770: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
c780: 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72 29         NEXT(ptr)
c790: 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 70 74   = b;.        pt
c7a0: 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62  r = b;.        b
c7b0: 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20   = NEXT(b);.    
c7c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
c7d0: 28 20 61 20 29 20 4e 45 58 54 28 70 74 72 29 20  ( a ) NEXT(ptr) 
c7e0: 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65 20 20 20  = a;.    else   
c7f0: 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a   NEXT(ptr) = b;.
c800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 65 61    }.  return hea
c810: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  d;.}../*.** Inpu
c820: 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a 20 20  ts:.**   list:  
c830: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 61      Pointer to a
c840: 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20 6c   singly-linked l
c850: 69 73 74 20 6f 66 20 73 74 72 75 63 74 75 72 65  ist of structure
c860: 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a 20 20 20  s..**   next:   
c870: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f     Pointer to po
c880: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 65 63  inter to the sec
c890: 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ond element of t
c8a0: 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20 20 63 6d  he list..**   cm
c8b0: 70 3a 20 20 20 20 20 20 20 41 20 63 6f 6d 70 61  p:       A compa
c8c0: 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a  rison function..
c8d0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c  **.** Return Val
c8e0: 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74  ue:.**   A point
c8f0: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
c900: 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20  f a sorted list 
c910: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
c920: 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 72 67  lements.**   org
c930: 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73 74 2e 0a  inally in list..
c940: 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65 63  **.** Side effec
c950: 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65  ts:.**   The "ne
c960: 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f 72  xt" pointers for
c970: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73   elements in lis
c980: 74 20 61 72 65 20 63 68 61 6e 67 65 64 2e 0a 2a  t are changed..*
c990: 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53 54 53 49  /.#define LISTSI
c9a0: 5a 45 20 33 30 0a 63 68 61 72 20 2a 6d 73 6f 72  ZE 30.char *msor
c9b0: 74 28 6c 69 73 74 2c 6e 65 78 74 2c 63 6d 70 29  t(list,next,cmp)
c9c0: 0a 63 68 61 72 20 2a 6c 69 73 74 3b 0a 63 68 61  .char *list;.cha
c9d0: 72 20 2a 2a 6e 65 78 74 3b 0a 69 6e 74 20 28 2a  r **next;.int (*
c9e0: 63 6d 70 29 28 29 3b 0a 7b 0a 20 20 75 6e 73 69  cmp)();.{.  unsi
c9f0: 67 6e 65 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74  gned long offset
ca00: 3b 0a 20 20 63 68 61 72 20 2a 65 70 3b 0a 20 20  ;.  char *ep;.  
ca10: 63 68 61 72 20 2a 73 65 74 5b 4c 49 53 54 53 49  char *set[LISTSI
ca20: 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ZE];.  int i;.  
ca30: 6f 66 66 73 65 74 20 3d 20 28 75 6e 73 69 67 6e  offset = (unsign
ca40: 65 64 20 6c 6f 6e 67 29 6e 65 78 74 20 2d 20 28  ed long)next - (
ca50: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6c 69  unsigned long)li
ca60: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
ca70: 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20  <LISTSIZE; i++) 
ca80: 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68  set[i] = 0;.  wh
ca90: 69 6c 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20  ile( list ){.   
caa0: 20 65 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20   ep = list;.    
cab0: 6c 69 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74  list = NEXT(list
cac0: 29 3b 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20  );.    NEXT(ep) 
cad0: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
cae0: 3b 20 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26  ; i<LISTSIZE-1 &
caf0: 26 20 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b  & set[i]!=0; i++
cb00: 29 7b 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65  ){.      ep = me
cb10: 72 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d  rge(ep,set[i],cm
cb20: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  p,offset);.     
cb30: 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20   set[i] = 0;.   
cb40: 20 7d 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20   }.    set[i] = 
cb50: 65 70 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30  ep;.  }.  ep = 0
cb60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
cb70: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66  ISTSIZE; i++) if
cb80: 28 20 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20  ( set[i] ) ep = 
cb90: 6d 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c  merge(ep,set[i],
cba0: 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72  cmp,offset);.  r
cbb0: 65 74 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a  eturn ep;.}./***
cbc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbd0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
cbe0: 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a  ile "option.c" *
cbf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69  *********/.stati
cc10: 63 20 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73  c char **argv;.s
cc20: 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f  tatic struct s_o
cc30: 70 74 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74  ptions *op;.stat
cc40: 69 63 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65  ic FILE *errstre
cc50: 61 6d 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f  am;..#define ISO
cc60: 50 54 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27  PT(X) ((X)[0]=='
cc70: 2d 27 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c  -'||(X)[0]=='+'|
cc80: 7c 73 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29  |strchr((X),'=')
cc90: 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  !=0)../*.** Prin
cca0: 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  t the command li
ccb0: 6e 65 20 77 69 74 68 20 61 20 63 61 72 72 6f 74  ne with a carrot
ccc0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
ccd0: 20 6b 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a   k-th character.
cce0: 2a 2a 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66  ** of the n-th f
ccf0: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
cd00: 76 6f 69 64 20 65 72 72 6c 69 6e 65 28 6e 2c 6b  void errline(n,k
cd10: 2c 65 72 72 29 0a 69 6e 74 20 6e 3b 0a 69 6e 74  ,err).int n;.int
cd20: 20 6b 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b   k;.FILE *err;.{
cd30: 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b  .  int spcnt, i;
cd40: 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20 29  .  if( argv[0] )
cd50: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
cd60: 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70  ",argv[0]);.  sp
cd70: 63 6e 74 20 3d 20 73 74 72 6c 65 6e 28 61 72 67  cnt = strlen(arg
cd80: 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20 66 6f 72  v[0]) + 1;.  for
cd90: 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 61 72 67  (i=1; i<n && arg
cda0: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
cdb0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73  fprintf(err," %s
cdc0: 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  ",argv[i]);.    
cdd0: 73 70 63 6e 74 20 2b 3d 20 73 74 72 6c 65 6e 28  spcnt += strlen(
cde0: 61 72 67 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a  argv[i])+1;.  }.
cdf0: 20 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20    spcnt += k;.  
ce00: 66 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69  for(; argv[i]; i
ce10: 2b 2b 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c  ++) fprintf(err,
ce20: 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a  " %s",argv[i]);.
ce30: 20 20 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29    if( spcnt<20 )
ce40: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
ce50: 72 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65  r,"\n%*s^-- here
ce60: 5c 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20  \n",spcnt,"");. 
ce70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
ce80: 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65  ntf(err,"\n%*she
ce90: 72 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d  re --^\n",spcnt-
cea0: 37 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  7,"");.  }.}../*
ceb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
cec0: 6e 64 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68  ndex of the N-th
ced0: 20 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75   non-switch argu
cee0: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31  ment.  Return -1
cef0: 0a 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20  .** if N is out 
cf00: 6f 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61  of range..*/.sta
cf10: 74 69 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78  tic int argindex
cf20: 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69  (n).int n;.{.  i
cf30: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 64 61 73 68  nt i;.  int dash
cf40: 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 66 28 20  dash = 0;.  if( 
cf50: 61 72 67 76 21 3d 30 20 26 26 20 2a 61 72 67 76  argv!=0 && *argv
cf60: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
cf70: 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b  =1; argv[i]; i++
cf80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 61 73  ){.      if( das
cf90: 68 64 61 73 68 20 7c 7c 20 21 49 53 4f 50 54 28  hdash || !ISOPT(
cfa0: 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20  argv[i]) ){.    
cfb0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 72      if( n==0 ) r
cfc0: 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 20  eturn i;.       
cfd0: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n--;.      }.  
cfe0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
cff0: 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20  rgv[i],"--")==0 
d000: 29 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a  ) dashdash = 1;.
d010: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
d020: 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn -1;.}..static
d030: 20 63 68 61 72 20 65 6d 73 67 5b 5d 20 3d 20 22   char emsg[] = "
d040: 43 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 79 6e  Command line syn
d050: 74 61 78 20 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f  tax error: ";../
d060: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 66  *.** Process a f
d070: 6c 61 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  lag command line
d080: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
d090: 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 66  atic int handlef
d0a0: 6c 61 67 73 28 69 2c 65 72 72 29 0a 69 6e 74 20  lags(i,err).int 
d0b0: 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a  i;.FILE *err;.{.
d0c0: 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65    int v;.  int e
d0d0: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  rrcnt = 0;.  int
d0e0: 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f   j;.  for(j=0; o
d0f0: 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29  p[j].label; j++)
d100: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  {.    if( strncm
d110: 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70  p(&argv[i][1],op
d120: 5b 6a 5d 2e 6c 61 62 65 6c 2c 73 74 72 6c 65 6e  [j].label,strlen
d130: 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 29 3d 3d  (op[j].label))==
d140: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
d150: 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b 30 5d 3d   v = argv[i][0]=
d160: 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b 0a 20 20  ='-' ? 1 : 0;.  
d170: 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d  if( op[j].label=
d180: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72  =0 ){.    if( er
d190: 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  r ){.      fprin
d1a0: 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69  tf(err,"%sundefi
d1b0: 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65  ned option.\n",e
d1c0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c  msg);.      errl
d1d0: 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20  ine(i,1,err);.  
d1e0: 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b    }.    errcnt++
d1f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
d200: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c  [j].type==OPT_FL
d210: 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74  AG ){.    *((int
d220: 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76  *)op[j].arg) = v
d230: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
d240: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46  [j].type==OPT_FF
d250: 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f  LAG ){.    (*(vo
d260: 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61  id(*)())(op[j].a
d270: 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rg))(v);.  }else
d280: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
d290: 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20 20 20  =OPT_FSTR ){.   
d2a0: 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f   (*(void(*)())(o
d2b0: 70 5b 6a 5d 2e 61 72 67 29 29 28 26 61 72 67 76  p[j].arg))(&argv
d2c0: 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65  [i][2]);.  }else
d2d0: 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b  {.    if( err ){
d2e0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65  .      fprintf(e
d2f0: 72 72 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72  rr,"%smissing ar
d300: 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68  gument on switch
d310: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d320: 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72    errline(i,1,er
d330: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
d340: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  rcnt++;.  }.  re
d350: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a  turn errcnt;.}..
d360: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20  /*.** Process a 
d370: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69  command line swi
d380: 74 63 68 20 77 68 69 63 68 20 68 61 73 20 61 6e  tch which has an
d390: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
d3a0: 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73  atic int handles
d3b0: 77 69 74 63 68 28 69 2c 65 72 72 29 0a 69 6e 74  witch(i,err).int
d3c0: 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b   i;.FILE *err;.{
d3d0: 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20  .  int lv = 0;. 
d3e0: 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30   double dv = 0.0
d3f0: 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30  ;.  char *sv = 0
d400: 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a  , *end;.  char *
d410: 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  cp;.  int j;.  i
d420: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
d430: 20 63 70 20 3d 20 73 74 72 63 68 72 28 61 72 67   cp = strchr(arg
d440: 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 2a 63 70  v[i],'=');.  *cp
d450: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   = 0;.  for(j=0;
d460: 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b   op[j].label; j+
d470: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
d480: 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d  mp(argv[i],op[j]
d490: 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65  .label)==0 ) bre
d4a0: 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20  ak;.  }.  *cp = 
d4b0: 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d  '=';.  if( op[j]
d4c0: 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  .label==0 ){.   
d4d0: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
d4e0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
d4f0: 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f  sundefined optio
d500: 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  n.\n",emsg);.   
d510: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65     errline(i,0,e
d520: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  rr);.    }.    e
d530: 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rrcnt++;.  }else
d540: 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20  {.    cp++;.    
d550: 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79  switch( op[j].ty
d560: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
d570: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
d580: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
d590: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72  .        if( err
d5a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
d5b0: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6f 70 74  rintf(err,"%sopt
d5c0: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
d5d0: 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73  argument.\n",ems
d5e0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 72  g);.          er
d5f0: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a  rline(i,0,err);.
d600: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d610: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
d620: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d630: 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
d640: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
d650: 42 4c 3a 0a 20 20 20 20 20 20 20 20 64 76 20 3d  BL:.        dv =
d660: 20 73 74 72 74 6f 64 28 63 70 2c 26 65 6e 64 29   strtod(cp,&end)
d670: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65  ;.        if( *e
d680: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
d690: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
d6a0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
d6b0: 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68  rr,"%sillegal ch
d6c0: 61 72 61 63 74 65 72 20 69 6e 20 66 6c 6f 61 74  aracter in float
d6d0: 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65  ing-point argume
d6e0: 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  nt.\n",emsg);.  
d6f0: 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e            errlin
d700: 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c  e(i,((unsigned l
d710: 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e  ong)end)-(unsign
d720: 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c  ed long)argv[i],
d730: 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
d740: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63  }.          errc
d750: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
d760: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d770: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
d780: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  T:.      case OP
d790: 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
d7a0: 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26  lv = strtol(cp,&
d7b0: 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  end,0);.        
d7c0: 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20  if( *end ){.    
d7d0: 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b        if( err ){
d7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
d7f0: 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65  intf(err,"%sille
d800: 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e  gal character in
d810: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
d820: 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  t.\n",emsg);.   
d830: 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65           errline
d840: 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  (i,((unsigned lo
d850: 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65  ng)end)-(unsigne
d860: 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65  d long)argv[i],e
d870: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rr);.          }
d880: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e  .          errcn
d890: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
d8a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d8b0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
d8c0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d8d0: 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73  _FSTR:.        s
d8e0: 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20  v = cp;.        
d8f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d900: 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74   switch( op[j].t
d910: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
d920: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
d930: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
d940: 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  :.        break;
d950: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d960: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64  DBL:.        *(d
d970: 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72  ouble*)(op[j].ar
d980: 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20  g) = dv;.       
d990: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
d9a0: 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
d9b0: 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
d9c0: 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64  ))(op[j].arg))(d
d9d0: 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
d9e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d9f0: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a  T_INT:.        *
da00: 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  (int*)(op[j].arg
da10: 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20  ) = lv;.        
da20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
da30: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
da40: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29      (*(void(*)()
da50: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28 69  )(op[j].arg))((i
da60: 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20 20 20 20  nt)lv);.        
da70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
da80: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
da90: 20 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70 5b     *(char**)(op[
daa0: 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20 20  j].arg) = sv;.  
dab0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dac0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
dad0: 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69  :.        (*(voi
dae0: 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72  d(*)())(op[j].ar
daf0: 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20  g))(sv);.       
db00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
db10: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
db20: 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69  t;.}..int OptIni
db30: 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68 61 72 20  t(a,o,err).char 
db40: 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70  **a;.struct s_op
db50: 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c 45 20 2a  tions *o;.FILE *
db60: 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 65 72 72  err;.{.  int err
db70: 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20  cnt = 0;.  argv 
db80: 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20  = a;.  op = o;. 
db90: 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72   errstream = err
dba0: 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26 26 20  ;.  if( argv && 
dbb0: 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20  *argv && op ){. 
dbc0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
dbd0: 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20  r(i=1; argv[i]; 
dbe0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
dbf0: 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20  argv[i][0]=='+' 
dc00: 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  || argv[i][0]=='
dc10: 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  -' ){.        er
dc20: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c  rcnt += handlefl
dc30: 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  ags(i,err);.    
dc40: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
dc50: 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20  hr(argv[i],'=') 
dc60: 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e  ){.        errcn
dc70: 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63  t += handleswitc
dc80: 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  h(i,err);.      
dc90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
dca0: 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20  ( errcnt>0 ){.  
dcb0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56    fprintf(err,"V
dcc0: 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  alid command lin
dcd0: 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22  e options for \"
dce0: 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29  %s\" are:\n",*a)
dcf0: 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29  ;.    OptPrint()
dd00: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
dd10: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
dd20: 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 29  ..int OptNArgs()
dd30: 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  {.  int cnt = 0;
dd40: 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20  .  int dashdash 
dd50: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
dd60: 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 61  if( argv!=0 && a
dd70: 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20  rgv[0]!=0 ){.   
dd80: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
dd90: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
dda0: 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21  f( dashdash || !
ddb0: 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29  ISOPT(argv[i]) )
ddc0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
ddd0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
dde0: 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68  ,"--")==0 ) dash
ddf0: 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  dash = 1;.    }.
de00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74    }.  return cnt
de10: 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72  ;.}..char *OptAr
de20: 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20  g(n).int n;.{.  
de30: 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67  int i;.  i = arg
de40: 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75  index(n);.  retu
de50: 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69  rn i>=0 ? argv[i
de60: 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f  ] : 0;.}..void O
de70: 70 74 45 72 72 28 6e 29 0a 69 6e 74 20 6e 3b 0a  ptErr(n).int n;.
de80: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
de90: 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20   argindex(n);.  
dea0: 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69  if( i>=0 ) errli
deb0: 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d  ne(i,0,errstream
dec0: 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72  );.}..void OptPr
ded0: 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  int(){.  int i;.
dee0: 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a    int max, len;.
def0: 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72    max = 0;.  for
df00: 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65  (i=0; op[i].labe
df10: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e  l; i++){.    len
df20: 20 3d 20 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e   = strlen(op[i].
df30: 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20  label) + 1;.    
df40: 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79  switch( op[i].ty
df50: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
df60: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
df70: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
df80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
df90: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49        case OPT_I
dfa0: 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  NT:.      case O
dfb0: 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20  PT_FINT:.       
dfc0: 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20   len += 9;      
dfd0: 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c   /* length of "<
dfe0: 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20  integer>" */.   
dff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e000: 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a    case OPT_DBL:.
e010: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e020: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e  DBL:.        len
e030: 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20   += 6;       /* 
e040: 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c  length of "<real
e050: 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  >" */.        br
e060: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
e070: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63  OPT_STR:.      c
e080: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
e090: 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20        len += 8; 
e0a0: 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
e0b0: 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f  of "<string>" */
e0c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e0d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65      }.    if( le
e0e0: 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65  n>max ) max = le
e0f0: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
e100: 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69  ; op[i].label; i
e110: 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ++){.    switch(
e120: 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20   op[i].type ){. 
e130: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c       case OPT_FL
e140: 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  AG:.      case O
e150: 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20  PT_FFLAG:.      
e160: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
e170: 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73  eam,"  -%-*s  %s
e180: 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61  \n",max,op[i].la
e190: 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  bel,op[i].messag
e1a0: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
e1b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
e1c0: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
e1d0: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
e1e0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
e1f0: 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e 74  tream,"  %s=<int
e200: 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  eger>%*s  %s\n",
e210: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
e220: 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78         (int)(max
e230: 2d 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61  -strlen(op[i].la
e240: 62 65 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d  bel)-9),"",op[i]
e250: 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
e260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e270: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
e280: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
e290: 4c 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  L:.        fprin
e2a0: 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20  tf(errstream,"  
e2b0: 25 73 3d 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73  %s=<real>%*s  %s
e2c0: 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  \n",op[i].label,
e2d0: 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29  .          (int)
e2e0: 28 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69  (max-strlen(op[i
e2f0: 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f  ].label)-6),"",o
e300: 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
e310: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e320: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
e330: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
e340: 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66  _FSTR:.        f
e350: 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
e360: 2c 22 20 20 25 73 3d 3c 73 74 72 69 6e 67 3e 25  ,"  %s=<string>%
e370: 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
e380: 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
e390: 20 28 69 6e 74 29 28 6d 61 78 2d 73 74 72 6c 65   (int)(max-strle
e3a0: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38  n(op[i].label)-8
e3b0: 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  ),"",op[i].messa
e3c0: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
e3d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
e3e0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
e3f0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
e400: 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22  e file "parse.c"
e410: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
e420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
e430: 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20  *.** Input file 
e440: 70 61 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c  parser for the L
e450: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
e460: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68  rator..*/../* Th
e470: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
e480: 61 72 73 65 72 20 2a 2f 0a 73 74 72 75 63 74 20  arser */.struct 
e490: 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72 20  pstate {.  char 
e4a0: 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  *filename;      
e4b0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
e4c0: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
e4d0: 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  int tokenlineno;
e4e0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d        /* Linenum
e4f0: 62 65 72 20 61 74 20 77 68 69 63 68 20 63 75 72  ber at which cur
e500: 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72 74  rent token start
e510: 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72  s */.  int error
e520: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  cnt;         /* 
e530: 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
e540: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61   so far */.  cha
e550: 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20 20  r *tokenstart;  
e560: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63 75     /* Text of cu
e570: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20  rrent token */. 
e580: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67   struct lemon *g
e590: 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  p;     /* Global
e5a0: 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a 2f   state vector */
e5b0: 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65 20  .  enum e_state 
e5c0: 7b 0a 20 20 20 20 49 4e 49 54 49 41 4c 49 5a 45  {.    INITIALIZE
e5d0: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e5e0: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a  R_DECL_OR_RULE,.
e5f0: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
e600: 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20  DECL_KEYWORD,.  
e610: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
e620: 43 4c 5f 41 52 47 2c 0a 20 20 20 20 57 41 49 54  CL_ARG,.    WAIT
e630: 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
e640: 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57  CE_SYMBOL,.    W
e650: 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57  AITING_FOR_ARROW
e660: 2c 0a 20 20 20 20 49 4e 5f 52 48 53 2c 0a 20 20  ,.    IN_RHS,.  
e670: 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20    LHS_ALIAS_1,. 
e680: 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a     LHS_ALIAS_2,.
e690: 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c      LHS_ALIAS_3,
e6a0: 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 31  .    RHS_ALIAS_1
e6b0: 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f  ,.    RHS_ALIAS_
e6c0: 32 2c 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43  2,.    PRECEDENC
e6d0: 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 20 20 50 52  E_MARK_1,.    PR
e6e0: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c  ECEDENCE_MARK_2,
e6f0: 0a 20 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45  .    RESYNC_AFTE
e700: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20  R_RULE_ERROR,.  
e710: 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44    RESYNC_AFTER_D
e720: 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 20 20 57  ECL_ERROR,.    W
e730: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
e740: 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20  UCTOR_SYMBOL,.  
e750: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41    WAITING_FOR_DA
e760: 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20  TATYPE_SYMBOL,. 
e770: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46     WAITING_FOR_F
e780: 41 4c 4c 42 41 43 4b 5f 49 44 0a 20 20 7d 20 73  ALLBACK_ID.  } s
e790: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
e7a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
e7b0: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73  tate of the pars
e7c0: 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  er */.  struct s
e7d0: 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b  ymbol *fallback;
e7e0: 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61     /* The fallba
e7f0: 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74  ck token */.  st
e800: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73  ruct symbol *lhs
e810: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74  ;        /* Left
e820: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 75  -hand side of cu
e830: 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20  rrent rule */.  
e840: 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20  char *lhsalias; 
e850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
e860: 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20  ias for the LHS 
e870: 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20  */.  int nrhs;  
e880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e890: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67  /* Number of rig
e8a0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 73 79 6d  ht-hand side sym
e8b0: 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73  bols seen */.  s
e8c0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68  truct symbol *rh
e8d0: 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52  s[MAXRHS];  /* R
e8e0: 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  HS symbols */.  
e8f0: 63 68 61 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52  char *alias[MAXR
e900: 48 53 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  HS];       /* Al
e910: 69 61 73 65 73 20 66 6f 72 20 65 61 63 68 20 52  iases for each R
e920: 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55  HS symbol (or NU
e930: 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  LL) */.  struct 
e940: 72 75 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b 20  rule *prevrule; 
e950: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
e960: 72 75 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a 20  rule parsed */. 
e970: 20 63 68 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f   char *declkeywo
e980: 72 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  rd;         /* K
e990: 65 79 77 6f 72 64 20 6f 66 20 61 20 64 65 63 6c  eyword of a decl
e9a0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  aration */.  cha
e9b0: 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b  r **declargslot;
e9c0: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
e9d0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
e9e0: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
e9f0: 20 62 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74   be put */.  int
ea00: 20 2a 64 65 63 6c 6c 6e 73 6c 6f 74 3b 20 20 20   *decllnslot;   
ea10: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
ea20: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
ea30: 20 6c 69 6e 65 6e 75 6d 62 65 72 20 69 73 20 70   linenumber is p
ea40: 75 74 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ut */.  enum e_a
ea50: 73 73 6f 63 20 64 65 63 6c 61 73 73 6f 63 3b 20  ssoc declassoc; 
ea60: 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69     /* Assign thi
ea70: 73 20 61 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f  s association to
ea80: 20 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20   decl arguments 
ea90: 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 63 6f 75  */.  int preccou
eaa0: 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  nter;           
eab0: 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 70  /* Assign this p
eac0: 72 65 63 65 64 65 6e 63 65 20 74 6f 20 64 65 63  recedence to dec
ead0: 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  l arguments */. 
eae0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 66 69   struct rule *fi
eaf0: 72 73 74 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50  rstrule;    /* P
eb00: 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20  ointer to first 
eb10: 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d  rule in the gram
eb20: 6d 61 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  mar */.  struct 
eb30: 72 75 6c 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20  rule *lastrule; 
eb40: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
eb50: 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
eb60: 74 6c 79 20 70 61 72 73 65 64 20 72 75 6c 65 20  tly parsed rule 
eb70: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20  */.};../* Parse 
eb80: 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a  a single token *
eb90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
eba0: 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 70 73 70 29  rseonetoken(psp)
ebb0: 0a 73 74 72 75 63 74 20 70 73 74 61 74 65 20 2a  .struct pstate *
ebc0: 70 73 70 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 78  psp;.{.  char *x
ebd0: 3b 0a 20 20 78 20 3d 20 53 74 72 73 61 66 65 28  ;.  x = Strsafe(
ebe0: 70 73 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29  psp->tokenstart)
ebf0: 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68  ;     /* Save th
ec00: 65 20 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e  e token permanen
ec10: 74 6c 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70  tly */.#if 0.  p
ec20: 72 69 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f  rintf("%s:%d: To
ec30: 6b 65 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25  ken=[%s] state=%
ec40: 64 5c 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61  d\n",psp->filena
ec50: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
ec60: 65 6e 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e  eno,.    x,psp->
ec70: 73 74 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  state);.#endif. 
ec80: 20 73 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74   switch( psp->st
ec90: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
eca0: 49 4e 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20  INITIALIZE:.    
ecb0: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
ecc0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e  = 0;.      psp->
ecd0: 70 72 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b  preccounter = 0;
ece0: 0a 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73  .      psp->firs
ecf0: 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73  trule = psp->las
ed00: 74 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  trule = 0;.     
ed10: 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20   psp->gp->nrule 
ed20: 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  = 0;.      /* Fa
ed30: 6c 6c 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20  ll thru to next 
ed40: 63 61 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  case */.    case
ed50: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
ed60: 4c 5f 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20  L_OR_RULE:.     
ed70: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29   if( x[0]=='%' )
ed80: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
ed90: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
eda0: 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
edb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
edc0: 20 69 73 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29   islower(x[0]) )
edd0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c  {.        psp->l
ede0: 68 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  hs = Symbol_new(
edf0: 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
ee00: 3e 6e 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20  >nrhs = 0;.     
ee10: 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73     psp->lhsalias
ee20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
ee30: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
ee40: 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20  NG_FOR_ARROW;.  
ee50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
ee60: 30 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20  0]=='{' ){.     
ee70: 20 20 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76     if( psp->prev
ee80: 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
ee90: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
eea0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
eeb0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54  >tokenlineno,."T
eec0: 68 65 72 65 20 69 73 20 6e 6f 74 20 70 72 69 6f  here is not prio
eed0: 72 20 72 75 6c 65 20 6f 70 6f 6e 20 77 68 69 63  r rule opon whic
eee0: 68 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20  h to attach the 
eef0: 63 6f 64 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20  code \.fragment 
ef00: 77 68 69 63 68 20 62 65 67 69 6e 73 20 6f 6e 20  which begins on 
ef10: 74 68 69 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20  this line.");.  
ef20: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
ef30: 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20  orcnt++;..}else 
ef40: 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
ef50: 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20  e->code!=0 ){.  
ef60: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
ef70: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
ef80: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
ef90: 0a 22 43 6f 64 65 20 66 72 61 67 6d 65 6e 74 20  ."Code fragment 
efa0: 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69  beginning on thi
efb0: 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  s line is not th
efc0: 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c  e first \.to fol
efd0: 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75 73  low the previous
efe0: 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   rule.");.      
eff0: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f000: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
f010: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73  se{.          ps
f020: 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e  p->prevrule->lin
f030: 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  e = psp->tokenli
f040: 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  neno;.          
f050: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63  psp->prevrule->c
f060: 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a  ode = &x[1];..}.
f070: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f080: 78 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  x[0]=='[' ){.   
f090: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f0a0: 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52  = PRECEDENCE_MAR
f0b0: 4b 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  K_1;.      }else
f0c0: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f0d0: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f0e0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f0f0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 6f  o,.          "To
f100: 6b 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c  ken \"%s\" shoul
f110: 64 20 62 65 20 65 69 74 68 65 72 20 5c 22 25 25  d be either \"%%
f120: 5c 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69  \" or a nontermi
f130: 6e 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20  nal name.",.    
f140: 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20        x);.      
f150: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f160: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
f170: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
f180: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
f190: 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69  _1:.      if( !i
f1a0: 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a  supper(x[0]) ){.
f1b0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f1c0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f1d0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f1e0: 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65 20  .          "The 
f1f0: 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f  precedence symbo
f200: 6c 20 6d 75 73 74 20 62 65 20 61 20 74 65 72 6d  l must be a term
f210: 69 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20  inal.");.       
f220: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f230: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
f240: 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d  ( psp->prevrule=
f250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
f260: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
f270: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f280: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
f290: 20 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72   "There is no pr
f2a0: 69 6f 72 20 72 75 6c 65 20 74 6f 20 61 73 73 69  ior rule to assi
f2b0: 67 6e 20 70 72 65 63 65 64 65 6e 63 65 20 5c 22  gn precedence \"
f2c0: 5b 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  [%s]\".",x);.   
f2d0: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f2e0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
f2f0: 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72  e if( psp->prevr
f300: 75 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20  ule->precsym!=0 
f310: 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
f320: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f330: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f340: 6e 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63 65 20  no,."Precedence 
f350: 6d 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e  mark on this lin
f360: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72  e is not the fir
f370: 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74  st \.to follow t
f380: 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65  he previous rule
f390: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  .");.        psp
f3a0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
f3b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f3c0: 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
f3d0: 2d 3e 70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62  ->precsym = Symb
f3e0: 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
f3f0: 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74   }.      psp->st
f400: 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45  ate = PRECEDENCE
f410: 5f 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62  _MARK_2;.      b
f420: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50  reak;.    case P
f430: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
f440: 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
f450: 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
f460: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f470: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f480: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f490: 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d      "Missing \"]
f4a0: 5c 22 20 6f 6e 20 70 72 65 63 65 64 65 6e 63 65  \" on precedence
f4b0: 20 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20   mark.");.      
f4c0: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f4d0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
f4e0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
f4f0: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
f500: 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 62 72  R_RULE;.      br
f510: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
f520: 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a  ITING_FOR_ARROW:
f530: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
f540: 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a  =':' && x[1]==':
f550: 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29  ' && x[2]=='=' )
f560: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
f570: 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20  tate = IN_RHS;. 
f580: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
f590: 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20  [0]=='(' ){.    
f5a0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f5b0: 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20   LHS_ALIAS_1;.  
f5c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f5d0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f5e0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f5f0: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f600: 20 20 20 20 20 20 22 45 78 70 65 63 74 65 64 20        "Expected 
f610: 74 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22 20 66  to see a \":\" f
f620: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48 53  ollowing the LHS
f630: 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22   symbol \"%s\"."
f640: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ,.          psp-
f650: 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
f660: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f670: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
f680: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
f690: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
f6a0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
f6b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f6c0: 65 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e LHS_ALIAS_1:. 
f6d0: 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61       if( isalpha
f6e0: 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
f6f0: 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20    psp->lhsalias 
f700: 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
f710: 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
f720: 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_2;.      }el
f730: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
f740: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f750: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f760: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
f770: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20  \"%s\" is not a 
f780: 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20  valid alias for 
f790: 74 68 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e  the LHS \"%s\"\n
f7a0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70  ",.          x,p
f7b0: 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  sp->lhs->name);.
f7c0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
f7d0: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
f7e0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
f7f0: 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
f800: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
f810: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f820: 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32  case LHS_ALIAS_2
f830: 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
f840: 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
f850: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
f860: 53 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20  S_ALIAS_3;.     
f870: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f880: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f890: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f8a0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
f8b0: 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c     "Missing \")\
f8c0: 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20  " following LHS 
f8d0: 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c  alias name \"%s\
f8e0: 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ".",psp->lhsalia
f8f0: 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
f900: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f910: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f920: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
f930: 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
f940: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f950: 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49      case LHS_ALI
f960: 41 53 5f 33 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_3:.      if( 
f970: 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31  x[0]==':' && x[1
f980: 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d  ]==':' && x[2]==
f990: 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '=' ){.        p
f9a0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
f9b0: 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
f9c0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f9d0: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f9e0: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f9f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
fa00: 73 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c  sing \"->\" foll
fa10: 6f 77 69 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c  owing: \"%s(%s)\
fa20: 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ".",.           
fa30: 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70  psp->lhs->name,p
fa40: 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20  sp->lhsalias);. 
fa50: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
fa60: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
fa70: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
fa80: 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
fa90: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
faa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
fab0: 61 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20  ase IN_RHS:.    
fac0: 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
fad0: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
fae0: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20  t rule *rp;.    
faf0: 20 20 20 20 72 70 20 3d 20 28 73 74 72 75 63 74      rp = (struct
fb00: 20 72 75 6c 65 20 2a 29 6d 61 6c 6c 6f 63 28 20   rule *)malloc( 
fb10: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 72 75  sizeof(struct ru
fb20: 6c 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20  le) + .         
fb30: 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63      sizeof(struc
fb40: 74 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e  t symbol*)*psp->
fb50: 6e 72 68 73 20 2b 20 73 69 7a 65 6f 66 28 63 68  nrhs + sizeof(ch
fb60: 61 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 29  ar*)*psp->nrhs )
fb70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
fb80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
fb90: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
fba0: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
fbb0: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
fbc0: 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c        "Can't all
fbd0: 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d  ocate enough mem
fbe0: 6f 72 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c  ory for this rul
fbf0: 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e.");.          
fc00: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
fc10: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fc20: 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 09 7d  prevrule = 0;..}
fc30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
fc40: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
fc50: 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20   rp->ruleline = 
fc60: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
fc70: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
fc80: 72 68 73 20 3d 20 28 73 74 72 75 63 74 20 73 79  rhs = (struct sy
fc90: 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20  mbol**)&rp[1];. 
fca0: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
fcb0: 61 6c 69 61 73 20 3d 20 28 63 68 61 72 2a 2a 29  alias = (char**)
fcc0: 26 28 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e  &(rp->rhs[psp->n
fcd0: 72 68 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  rhs]);.         
fce0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d   for(i=0; i<psp-
fcf0: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
fd00: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
fd10: 5b 69 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69  [i] = psp->rhs[i
fd20: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ];.            r
fd30: 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d  p->rhsalias[i] =
fd40: 20 70 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a   psp->alias[i];.
fd50: 09 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72  .  }.          r
fd60: 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68  p->lhs = psp->lh
fd70: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  s;.          rp-
fd80: 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d  >lhsalias = psp-
fd90: 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20  >lhsalias;.     
fda0: 20 20 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20       rp->nrhs = 
fdb0: 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20  psp->nrhs;.     
fdc0: 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20       rp->code = 
fdd0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  0;.          rp-
fde0: 3e 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20  >precsym = 0;.  
fdf0: 20 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65          rp->inde
fe00: 78 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75  x = psp->gp->nru
fe10: 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  le++;.          
fe20: 72 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70  rp->nextlhs = rp
fe30: 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20  ->lhs->rule;.   
fe40: 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e         rp->lhs->
fe50: 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20  rule = rp;.     
fe60: 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20       rp->next = 
fe70: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
fe80: 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d   psp->firstrule=
fe90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
fea0: 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65    psp->firstrule
feb0: 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65   = psp->lastrule
fec0: 20 3d 20 72 70 3b 0a 09 20 20 7d 65 6c 73 65 7b   = rp;..  }else{
fed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
fee0: 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74  ->lastrule->next
fef0: 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20   = rp;.         
ff00: 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65     psp->lastrule
ff10: 20 3d 20 72 70 3b 0a 09 20 20 7d 0a 20 20 20 20   = rp;..  }.    
ff20: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
ff30: 75 6c 65 20 3d 20 72 70 3b 0a 09 7d 0a 20 20 20  ule = rp;..}.   
ff40: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
ff50: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
ff60: 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
ff70: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c    }else if( isal
ff80: 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
ff90: 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72       if( psp->nr
ffa0: 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20  hs>=MAXRHS ){.  
ffb0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
ffc0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
ffd0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
ffe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 54 6f  .            "To
fff0: 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 73 20 6f  o many symbols o
10000 6e 20 52 48 53 20 6f 72 20 72 75 6c 65 20 62 65  n RHS or rule be
10010 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c  ginning at \"%s\
10020 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ".",.           
10030 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
10040 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10050 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
10060 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
10070 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
10080 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20  .}else{.        
10090 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e    psp->rhs[psp->
100a0 6e 72 68 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e  nrhs] = Symbol_n
100b0 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ew(x);.         
100c0 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d   psp->alias[psp-
100d0 3e 6e 72 68 73 5d 20 3d 20 30 3b 0a 20 20 20 20  >nrhs] = 0;.    
100e0 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 2b        psp->nrhs+
100f0 2b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73  +;..}.      }els
10100 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27  e if( (x[0]=='|'
10110 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26   || x[0]=='/') &
10120 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b  & psp->nrhs>0 ){
10130 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
10140 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73  symbol *msp = ps
10150 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
10160 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  -1];.        if(
10170 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54   msp->type!=MULT
10180 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
10190 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
101a0 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d  mbol *origsp = m
101b0 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  sp;.          ms
101c0 70 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  p = malloc(sizeo
101d0 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20  f(*msp));.      
101e0 20 20 20 20 6d 65 6d 73 65 74 28 6d 73 70 2c 20      memset(msp, 
101f0 30 2c 20 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29  0, sizeof(*msp))
10200 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d  ;.          msp-
10210 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49 54 45 52  >type = MULTITER
10220 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  MINAL;.         
10230 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 20 3d 20   msp->nsubsym = 
10240 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70  1;.          msp
10250 2d 3e 73 75 62 73 79 6d 20 3d 20 6d 61 6c 6c 6f  ->subsym = mallo
10260 63 28 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  c(sizeof(struct 
10270 73 79 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20  symbol*));.     
10280 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d       msp->subsym
10290 5b 30 5d 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20  [0] = origsp;.  
102a0 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d          msp->nam
102b0 65 20 3d 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65  e = origsp->name
102c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
102d0 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
102e0 5d 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20  ] = msp;.       
102f0 20 7d 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e   }.        msp->
10300 6e 73 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20  nsubsym++;.     
10310 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d     msp->subsym =
10320 20 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75   realloc(msp->su
10330 62 73 79 6d 2c 20 73 69 7a 65 6f 66 28 73 74 72  bsym, sizeof(str
10340 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70  uct symbol*)*msp
10350 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20 20 20 20  ->nsubsym);.    
10360 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b      msp->subsym[
10370 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20  msp->nsubsym-1] 
10380 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b  = Symbol_new(&x[
10390 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
103a0 20 69 73 6c 6f 77 65 72 28 78 5b 31 5d 29 20 7c   islower(x[1]) |
103b0 7c 20 69 73 6c 6f 77 65 72 28 6d 73 70 2d 3e 73  | islower(msp->s
103c0 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30  ubsym[0]->name[0
103d0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
103e0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
103f0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10400 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10410 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72       "Cannot for
10420 6d 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e  m a compound con
10430 74 61 69 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65  taining a non-te
10440 72 6d 69 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20  rminal");.      
10450 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
10460 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
10470 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
10480 5b 30 5d 3d 3d 27 28 27 20 26 26 20 70 73 70 2d  [0]=='(' && psp-
10490 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20  >nrhs>0 ){.     
104a0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
104b0 52 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20  RHS_ALIAS_1;.   
104c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
104d0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
104e0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
104f0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
10500 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 63 68       "Illegal ch
10510 61 72 61 63 74 65 72 20 6f 6e 20 52 48 53 20 6f  aracter on RHS o
10520 66 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22  f rule: \"%s\"."
10530 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ,x);.        psp
10540 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10550 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10560 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10570 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
10580 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10590 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c  .    case RHS_AL
105a0 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28  IAS_1:.      if(
105b0 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29   isalpha(x[0]) )
105c0 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61  {.        psp->a
105d0 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  lias[psp->nrhs-1
105e0 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70  ] = x;.        p
105f0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f  sp->state = RHS_
10600 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d  ALIAS_2;.      }
10610 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
10620 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
10630 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
10640 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
10650 20 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20   "\"%s\" is not 
10660 61 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f  a valid alias fo
10670 72 20 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c  r the RHS symbol
10680 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
10690 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 72 68 73        x,psp->rhs
106a0 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e  [psp->nrhs-1]->n
106b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
106c0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
106d0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
106e0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
106f0 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
10700 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
10710 3b 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41  ;.    case RHS_A
10720 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66  LIAS_2:.      if
10730 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20  ( x[0]==')' ){. 
10740 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10750 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
10760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10770 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10780 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10790 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
107a0 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29      "Missing \")
107b0 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53  \" following LHS
107c0 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73   alias name \"%s
107d0 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69  \".",psp->lhsali
107e0 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  as);.        psp
107f0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10800 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10810 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10820 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
10830 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10840 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
10850 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f  G_FOR_DECL_KEYWO
10860 52 44 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73  RD:.      if( is
10870 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
10880 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10890 6b 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20  keyword = x;.   
108a0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
108b0 67 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20  gslot = 0;.     
108c0 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
108d0 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ot = 0;.        
108e0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
108f0 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52  TING_FOR_DECL_AR
10900 47 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  G;.        if( s
10910 74 72 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d  trcmp(x,"name")=
10920 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10930 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10940 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61   = &(psp->gp->na
10950 6d 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  me);..}else if( 
10960 73 74 72 63 6d 70 28 78 2c 22 69 6e 63 6c 75 64  strcmp(x,"includ
10970 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
10980 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10990 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
109a0 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a 20 20 20 20  ->include);.    
109b0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
109c0 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  nslot = &psp->gp
109d0 2d 3e 69 6e 63 6c 75 64 65 6c 6e 3b 0a 09 7d 65  ->includeln;..}e
109e0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
109f0 2c 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"code")==0 ){. 
10a00 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10a10 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
10a20 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65  p->gp->extracode
10a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
10a40 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26  ->decllnslot = &
10a50 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f  psp->gp->extraco
10a60 64 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28  deln;..}else if(
10a70 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e   strcmp(x,"token
10a80 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  _destructor")==0
10a90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10aa0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10ab0 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e   &psp->gp->token
10ac0 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dest;.          
10ad0 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
10ae0 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
10af0 6e 64 65 73 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20  ndestln;..}else 
10b00 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
10b10 66 61 75 6c 74 5f 64 65 73 74 72 75 63 74 6f 72  fault_destructor
10b20 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10b30 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10b40 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
10b50 76 61 72 64 65 73 74 3b 0a 20 20 20 20 20 20 20  vardest;.       
10b60 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
10b70 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76  ot = &psp->gp->v
10b80 61 72 64 65 73 74 6c 6e 3b 0a 09 7d 65 6c 73 65  ardestln;..}else
10b90 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
10ba0 6f 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30  oken_prefix")==0
10bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10bc0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10bd0 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e   &psp->gp->token
10be0 70 72 65 66 69 78 3b 0a 09 7d 65 6c 73 65 20 69  prefix;..}else i
10bf0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 79 6e  f( strcmp(x,"syn
10c00 74 61 78 5f 65 72 72 6f 72 22 29 3d 3d 30 20 29  tax_error")==0 )
10c10 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10c20 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10c30 28 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 29  (psp->gp->error)
10c40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10c50 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70  >decllnslot = &p
10c60 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 6c 6e 3b  sp->gp->errorln;
10c70 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
10c80 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65  mp(x,"parse_acce
10c90 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pt")==0 ){.     
10ca0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10cb0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10cc0 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20 20  p->accept);.    
10cd0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
10ce0 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  nslot = &psp->gp
10cf0 2d 3e 61 63 63 65 70 74 6c 6e 3b 0a 09 7d 65 6c  ->acceptln;..}el
10d00 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
10d10 22 70 61 72 73 65 5f 66 61 69 6c 75 72 65 22 29  "parse_failure")
10d20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10d30 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10d40 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 66  t = &(psp->gp->f
10d50 61 69 6c 75 72 65 29 3b 0a 20 20 20 20 20 20 20  ailure);.       
10d60 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
10d70 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 66  ot = &psp->gp->f
10d80 61 69 6c 75 72 65 6c 6e 3b 0a 09 7d 65 6c 73 65  ailureln;..}else
10d90 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73   if( strcmp(x,"s
10da0 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d  tack_overflow")=
10db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10dc0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10dd0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76   = &(psp->gp->ov
10de0 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20  erflow);.       
10df0 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
10e00 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 6f  ot = &psp->gp->o
10e10 76 65 72 66 6c 6f 77 6c 6e 3b 0a 20 20 20 20 20  verflowln;.     
10e20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10e30 63 6d 70 28 78 2c 22 65 78 74 72 61 5f 61 72 67  cmp(x,"extra_arg
10e40 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20  ument")==0 ){.  
10e50 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10e60 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
10e70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20  ->gp->arg);.    
10e80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
10e90 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79  rcmp(x,"token_ty
10ea0 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
10eb0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10ec0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10ed0 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20  p->tokentype);. 
10ee0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10ef0 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75   strcmp(x,"defau
10f00 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a  lt_type")==0 ){.
10f10 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10f20 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
10f30 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65 29  sp->gp->vartype)
10f40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10f50 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74  if( strcmp(x,"st
10f60 61 63 6b 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b  ack_size")==0 ){
10f70 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10f80 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10f90 70 73 70 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69  psp->gp->stacksi
10fa0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ze);.        }el
10fb0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
10fc0 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c 22 29 3d  "start_symbol")=
10fd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10fe0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10ff0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74   = &(psp->gp->st
11000 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  art);.        }e
11010 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11020 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"left")==0 ){. 
11030 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
11040 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  eccounter++;.   
11050 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11060 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20  assoc = LEFT;.  
11070 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11080 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11090 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
110a0 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
110b0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
110c0 72 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20  right")==0 ){.  
110d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
110e0 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
110f0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11100 73 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20  ssoc = RIGHT;.  
11110 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11120 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11130 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
11140 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
11150 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11160 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b  nonassoc")==0 ){
11170 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11180 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  preccounter++;. 
11190 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
111a0 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a  classoc = NONE;.
111b0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
111c0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
111d0 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
111e0 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28  MBOL;..}else if(
111f0 20 73 74 72 63 6d 70 28 78 2c 22 64 65 73 74 72   strcmp(x,"destr
11200 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20  uctor")==0 ){.  
11210 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11220 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11230 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42  _DESTRUCTOR_SYMB
11240 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  OL;..}else if( s
11250 74 72 63 6d 70 28 78 2c 22 74 79 70 65 22 29 3d  trcmp(x,"type")=
11260 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11270 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
11280 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50  TING_FOR_DATATYP
11290 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  E_SYMBOL;.      
112a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
112b0 6d 70 28 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29  mp(x,"fallback")
112c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
112d0 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d   psp->fallback =
112e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73   0;.          ps
112f0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11300 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f  NG_FOR_FALLBACK_
11310 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
11320 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  e{.          Err
11330 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11340 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11350 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11360 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61    "Unknown decla
11370 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
11380 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  \"%%%s\".",x);. 
11390 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
113a0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
113b0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
113c0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
113d0 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
113e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
113f0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11400 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11410 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11420 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 64 65       "Illegal de
11430 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72  claration keywor
11440 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  d: \"%s\".",x);.
11450 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11460 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11470 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11480 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
11490 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
114a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
114b0 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
114c0 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42  _DESTRUCTOR_SYMB
114d0 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69  OL:.      if( !i
114e0 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a  salpha(x[0]) ){.
114f0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11500 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11510 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11520 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
11530 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20  ol name missing 
11540 61 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f  after %destructo
11550 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20  r keyword");.   
11560 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11570 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11580 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11590 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
115a0 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
115b0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
115c0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
115d0 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
115e0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
115f0 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74  slot = &sp->dest
11600 72 75 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20  ructor;.        
11610 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
11620 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  = &sp->destructo
11630 72 6c 6e 3b 0a 20 20 20 20 20 20 20 20 70 73 70  rln;.        psp
11640 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11650 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a  G_FOR_DECL_ARG;.
11660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11670 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
11680 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59  ITING_FOR_DATATY
11690 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  PE_SYMBOL:.     
116a0 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 78 5b   if( !isalpha(x[
116b0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
116c0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
116d0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
116e0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
116f0 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d    "Symbol name m
11700 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 64 65  issing after %de
11710 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72 64  structor keyword
11720 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
11730 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11740 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11750 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
11760 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
11770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11780 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
11790 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  p = Symbol_new(x
117a0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
117b0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73  declargslot = &s
117c0 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20  p->datatype;.   
117d0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
117e0 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  slot = 0;.      
117f0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11800 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
11810 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ARG;.      }.   
11820 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11830 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50  se WAITING_FOR_P
11840 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
11850 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
11860 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
11870 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11880 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
11890 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
118a0 6c 73 65 20 69 66 28 20 69 73 75 70 70 65 72 28  lse if( isupper(
118b0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
118c0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
118d0 73 70 3b 0a 20 20 20 20 20 20 20 20 73 70 20 3d  sp;.        sp =
118e0 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
118f0 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
11900 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  prec>=0 ){.     
11910 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11920 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11930 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
11940 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
11950 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 61 6c 72  l \"%s\" has alr
11960 65 61 64 79 20 62 65 20 67 69 76 65 6e 20 61 20  eady be given a 
11970 70 72 65 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b  precedence.",x);
11980 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11990 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c  errorcnt++;..}el
119a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70  se{.          sp
119b0 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d 3e 70 72  ->prec = psp->pr
119c0 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20  eccounter;.     
119d0 20 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d       sp->assoc =
119e0 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b   psp->declassoc;
119f0 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ..}.      }else{
11a00 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
11a10 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
11a20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
11a30 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 61 6e  ,.          "Can
11a40 27 74 20 61 73 73 69 67 6e 20 61 20 70 72 65 63  't assign a prec
11a50 65 64 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22  edence to \"%s\"
11a60 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
11a70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11a90 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
11aa0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
11ab0 52 47 3a 0a 20 20 20 20 20 20 69 66 28 20 28 78  RG:.      if( (x
11ac0 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d  [0]=='{' || x[0]
11ad0 3d 3d 27 5c 22 27 20 7c 7c 20 69 73 61 6c 6e 75  =='\"' || isalnu
11ae0 6d 28 78 5b 30 5d 29 29 20 29 7b 0a 20 20 20 20  m(x[0])) ){.    
11af0 20 20 20 20 69 66 28 20 2a 28 70 73 70 2d 3e 64      if( *(psp->d
11b00 65 63 6c 61 72 67 73 6c 6f 74 29 21 3d 30 20 29  eclargslot)!=0 )
11b10 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
11b20 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11b30 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11b40 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
11b50 20 22 54 68 65 20 61 72 67 75 6d 65 6e 74 20 5c   "The argument \
11b60 22 25 73 5c 22 20 74 6f 20 64 65 63 6c 61 72 61  "%s\" to declara
11b70 74 69 6f 6e 20 5c 22 25 25 25 73 5c 22 20 69 73  tion \"%%%s\" is
11b80 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2e 22   not the first."
11b90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 5b  ,.            x[
11ba0 30 5d 3d 3d 27 5c 22 27 20 3f 20 26 78 5b 31 5d  0]=='\"' ? &x[1]
11bb0 20 3a 20 78 2c 70 73 70 2d 3e 64 65 63 6c 6b 65   : x,psp->declke
11bc0 79 77 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  yword);.        
11bd0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11be0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
11bf0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
11c00 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
11c10 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20  R;..}else{.     
11c20 20 20 20 20 20 2a 28 70 73 70 2d 3e 64 65 63 6c       *(psp->decl
11c30 61 72 67 73 6c 6f 74 29 20 3d 20 28 78 5b 30 5d  argslot) = (x[0]
11c40 3d 3d 27 5c 22 27 20 7c 7c 20 78 5b 30 5d 3d 3d  =='\"' || x[0]==
11c50 27 7b 27 29 20 3f 20 26 78 5b 31 5d 20 3a 20 78  '{') ? &x[1] : x
11c60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
11c70 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
11c80 29 20 2a 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c  ) *psp->decllnsl
11c90 6f 74 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ot = psp->tokenl
11ca0 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  ineno;.         
11cb0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11cc0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
11cd0 52 5f 52 55 4c 45 3b 0a 09 7d 0a 20 20 20 20 20  R_RULE;..}.     
11ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11cf0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11d00 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11d10 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
11d20 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72 67 75     "Illegal argu
11d30 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20 25 73  ment to %%%s: %s
11d40 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f  ",psp->declkeywo
11d50 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  rd,x);.        p
11d60 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11d70 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11d80 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11d90 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
11da0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
11db0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
11dc0 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b  ING_FOR_FALLBACK
11dd0 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78  _ID:.      if( x
11de0 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
11df0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11e00 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
11e10 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
11e20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 75 70   }else if( !isup
11e30 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  per(x[0]) ){.   
11e40 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11e50 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
11e60 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11e70 20 20 20 20 20 20 20 20 20 22 25 25 66 61 6c 6c           "%%fall
11e80 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 5c 22  back argument \"
11e90 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
11ea0 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
11eb0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11ec0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
11ed0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
11ee0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
11ef0 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
11f00 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66        if( psp->f
11f10 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  allback==0 ){.  
11f20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
11f30 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20 20 20  lback = sp;.    
11f40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
11f50 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ->fallback ){.  
11f60 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11f70 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
11f80 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
11f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4d  ,.            "M
11fa0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 61 6c  ore than one fal
11fb0 6c 62 61 63 6b 20 61 73 73 69 67 6e 65 64 20 74  lback assigned t
11fc0 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78 29 3b  o token %s", x);
11fd0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11fe0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11ff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12000 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63       sp->fallbac
12010 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  k = psp->fallbac
12020 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  k;.          psp
12030 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  ->gp->has_fallba
12040 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ck = 1;.        
12050 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
12060 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12070 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
12080 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20  E_ERROR:./*     
12090 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
120a0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
120b0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
120c0 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20  R_RULE;.**      
120d0 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61  break; */.    ca
120e0 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f  se RESYNC_AFTER_
120f0 44 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20  DECL_ERROR:.    
12100 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
12110 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57  ) psp->state = W
12120 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
12130 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69  OR_RULE;.      i
12140 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70  f( x[0]=='%' ) p
12150 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
12160 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
12170 57 4f 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61  WORD;.      brea
12180 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e  k;.  }.}../* Run
12190 20 74 68 65 20 70 72 6f 70 72 6f 63 65 73 73 6f   the proprocesso
121a0 72 20 6f 76 65 72 20 74 68 65 20 69 6e 70 75 74  r over the input
121b0 20 66 69 6c 65 20 74 65 78 74 2e 20 20 54 68 65   file text.  The
121c0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
121d0 73 0a 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d  s.** azDefine[0]
121e0 20 74 68 72 6f 75 67 68 20 61 7a 44 65 66 69 6e   through azDefin
121f0 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e  e[nDefine-1] con
12200 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
12210 6f 66 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a  of all defined.*
12220 2a 20 6d 61 63 72 6f 73 2e 20 20 54 68 69 73 20  * macros.  This 
12230 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f  routine looks fo
12240 72 20 22 25 69 66 64 65 66 22 20 61 6e 64 20 22  r "%ifdef" and "
12250 25 69 66 6e 64 65 66 22 20 61 6e 64 20 22 25 65  %ifndef" and "%e
12260 6e 64 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d  ndif" and.** com
12270 6d 65 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e 20  ments them out. 
12280 20 54 65 78 74 20 69 6e 20 62 65 74 77 65 65 6e   Text in between
12290 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74   is also comment
122a0 65 64 20 6f 75 74 20 61 73 20 61 70 70 72 6f 70  ed out as approp
122b0 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
122c0 20 76 6f 69 64 20 70 72 65 70 72 6f 63 65 73 73   void preprocess
122d0 5f 69 6e 70 75 74 28 63 68 61 72 20 2a 7a 29 7b  _input(char *z){
122e0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
122f0 6e 3b 0a 20 20 69 6e 74 20 65 78 63 6c 75 64 65  n;.  int exclude
12300 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 72   = 0;.  int star
12310 74 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  t;.  int lineno 
12320 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  = 1;.  int start
12330 5f 6c 69 6e 65 6e 6f 3b 0a 20 20 66 6f 72 28 69  _lineno;.  for(i
12340 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
12350 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
12360 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
12370 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 25 27     if( z[i]!='%'
12380 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a 5b 69 2d   || (i>0 && z[i-
12390 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63 6f 6e 74  1]!='\n') ) cont
123a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74  inue;.    if( st
123b0 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 65 6e  rncmp(&z[i],"%en
123c0 64 69 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73  dif",6)==0 && is
123d0 73 70 61 63 65 28 7a 5b 69 2b 36 5d 29 20 29 7b  space(z[i+6]) ){
123e0 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75  .      if( exclu
123f0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78  de ){.        ex
12400 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20 20 20 20  clude--;.       
12410 20 69 66 28 20 65 78 63 6c 75 64 65 3d 3d 30 20   if( exclude==0 
12420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
12430 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69 3b 20 6a  (j=start; j<i; j
12440 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c  ++) if( z[j]!='\
12450 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b  n' ) z[j] = ' ';
12460 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12470 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69   }.      for(j=i
12480 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d  ; z[j] && z[j]!=
12490 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20  '\n'; j++) z[j] 
124a0 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65 6c 73 65  = ' ';.    }else
124b0 20 69 66 28 20 28 73 74 72 6e 63 6d 70 28 26 7a   if( (strncmp(&z
124c0 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c 36 29 3d  [i],"%ifdef",6)=
124d0 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b  =0 && isspace(z[
124e0 69 2b 36 5d 29 29 0a 20 20 20 20 20 20 20 20 20  i+6])).         
124f0 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b   || (strncmp(&z[
12500 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c 37 29 3d  i],"%ifndef",7)=
12510 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b  =0 && isspace(z[
12520 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20 20 20 20  i+7])) ){.      
12530 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20  if( exclude ){. 
12540 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 2b 2b         exclude++
12550 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12560 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 37         for(j=i+7
12570 3b 20 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 3b  ; isspace(z[j]);
12580 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   j++){}.        
12590 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20  for(n=0; z[j+n] 
125a0 26 26 20 21 69 73 73 70 61 63 65 28 7a 5b 6a 2b  && !isspace(z[j+
125b0 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  n]); n++){}.    
125c0 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 31 3b      exclude = 1;
125d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  .        for(k=0
125e0 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b  ; k<nDefine; k++
125f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
12600 20 73 74 72 6e 63 6d 70 28 61 7a 44 65 66 69 6e   strncmp(azDefin
12610 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30  e[k],&z[j],n)==0
12620 20 26 26 20 73 74 72 6c 65 6e 28 61 7a 44 65 66   && strlen(azDef
12630 69 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20  ine[k])==n ){.  
12640 20 20 20 20 20 20 20 20 20 20 65 78 63 6c 75 64            exclud
12650 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
12660 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12680 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
12690 33 5d 3d 3d 27 6e 27 20 29 20 65 78 63 6c 75 64  3]=='n' ) exclud
126a0 65 20 3d 20 21 65 78 63 6c 75 64 65 3b 0a 20 20  e = !exclude;.  
126b0 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
126c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  e ){.          s
126d0 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  tart = i;.      
126e0 20 20 20 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f      start_lineno
126f0 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20   = lineno;.     
12700 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12710 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d     for(j=i; z[j]
12720 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20   && z[j]!='\n'; 
12730 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b  j++) z[j] = ' ';
12740 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12750 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20   exclude ){.    
12760 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
12770 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 25 69  unterminated %%i
12780 66 64 65 66 20 73 74 61 72 74 69 6e 67 20 6f 6e  fdef starting on
12790 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 73 74 61   line %d\n", sta
127a0 72 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  rt_lineno);.    
127b0 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  exit(1);.  }.}..
127c0 2f 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20 69  /* In spite of i
127d0 74 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66 75  ts name, this fu
127e0 6e 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79  nction is really
127f0 20 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74 20   a scanner.  It 
12800 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65  read.** in the e
12810 6e 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c 65  ntire input file
12820 20 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74   (all at once) t
12830 68 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74  hen tokenizes it
12840 2e 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e  .  Each.** token
12850 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
12860 65 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72 73  e function "pars
12870 65 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63 68  eonetoken" which
12880 20 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74   builds all.** t
12890 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  he appropriate d
128a0 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 69  ata structures i
128b0 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74 61  n the global sta
128c0 74 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e 0a  te vector "gp"..
128d0 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 67 70  */.void Parse(gp
128e0 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
128f0 67 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70  gp;.{.  struct p
12900 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c 45  state ps;.  FILE
12910 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66 69   *fp;.  char *fi
12920 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c  lebuf;.  int fil
12930 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e  esize;.  int lin
12940 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  eno;.  int c;.  
12950 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63  char *cp, *nextc
12960 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69  p;.  int startli
12970 6e 65 20 3d 20 30 3b 0a 0a 20 20 70 73 2e 67 70  ne = 0;..  ps.gp
12980 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65   = gp;.  ps.file
12990 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e  name = gp->filen
129a0 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63  ame;.  ps.errorc
129b0 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61  nt = 0;.  ps.sta
129c0 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b  te = INITIALIZE;
129d0 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
129e0 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75  reading the inpu
129f0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d  t file */.  fp =
12a00 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61   fopen(ps.filena
12a10 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20  me,"rb");.  if( 
12a20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72  fp==0 ){.    Err
12a30 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
12a40 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  e,0,"Can't open 
12a50 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65  this file for re
12a60 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70  ading.");.    gp
12a70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
12a80 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
12a90 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20  fseek(fp,0,2);. 
12aa0 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c   filesize = ftel
12ab0 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(fp);.  rewind(
12ac0 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d  fp);.  filebuf =
12ad0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
12ae0 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20   filesize+1 );. 
12af0 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d 30 20   if( filebuf==0 
12b00 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
12b10 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43  ps.filename,0,"C
12b20 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 25 64  an't allocate %d
12b30 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f   of memory to ho
12b40 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a  ld this file.",.
12b50 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 2b 31        filesize+1
12b60 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72  );.    gp->error
12b70 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
12b80 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  n;.  }.  if( fre
12b90 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c  ad(filebuf,1,fil
12ba0 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73  esize,fp)!=files
12bb0 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ize ){.    Error
12bc0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
12bd0 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e  0,"Can't read in
12be0 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66   all %d bytes of
12bf0 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20   this file.",.  
12c00 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20      filesize);. 
12c10 20 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29     free(filebuf)
12c20 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63  ;.    gp->errorc
12c30 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
12c40 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
12c50 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69  p);.  filebuf[fi
12c60 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20  lesize] = 0;..  
12c70 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74 69  /* Make an initi
12c80 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68 20  al pass through 
12c90 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61 6e 64  the file to hand
12ca0 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20 25 69  le %ifdef and %i
12cb0 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65 70 72  fndef */.  prepr
12cc0 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69 6c 65  ocess_input(file
12cd0 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  buf);..  /* Now 
12ce0 73 63 61 6e 20 74 68 65 20 74 65 78 74 20 6f 66  scan the text of
12cf0 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
12d00 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b  */.  lineno = 1;
12d10 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65 62 75  .  for(cp=filebu
12d20 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20  f; (c= *cp)!=0; 
12d30 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  ){.    if( c=='\
12d40 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20  n' ) lineno++;  
12d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
12d60 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
12d70 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
12d80 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
12d90 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74  c) ){ cp++; cont
12da0 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70  inue; }  /* Skip
12db0 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61 63 65   all white space
12dc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   */.    if( c=='
12dd0 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27  /' && cp[1]=='/'
12de0 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
12df0 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
12e00 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
12e10 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68   cp+=2;.      wh
12e20 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
12e30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70   && c!='\n' ) cp
12e40 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ++;.      contin
12e50 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
12e60 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
12e70 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20 20 20  ]=='*' ){       
12e80 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73 74 79     /* Skip C sty
12e90 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20  le comments */. 
12ea0 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20       cp+=2;.    
12eb0 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
12ec0 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20  )!=0 && (c!='/' 
12ed0 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20  || cp[-1]!='*') 
12ee0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
12ef0 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
12f00 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b  +;.        cp++;
12f10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12f20 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20  f( c ) cp++;.   
12f30 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
12f40 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73   }.    ps.tokens
12f50 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20 20 20  tart = cp;      
12f60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72            /* Mar
12f70 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  k the beginning 
12f80 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  of the token */.
12f90 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65      ps.tokenline
12fa0 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20  no = lineno;    
12fb0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75         /* Linenu
12fc0 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74 6f  mber on which to
12fd0 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ken begins */.  
12fe0 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b    if( c=='\"' ){
12ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13000 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c       /* String l
13010 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20  iterals */.     
13020 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69   cp++;.      whi
13030 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
13040 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20  && c!='\"' ){.  
13050 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
13060 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
13070 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
13080 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
13090 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
130a0 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
130b0 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53  me,startline,."S
130c0 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67 20 6f  tring starting o
130d0 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
130e0 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65  ot terminated be
130f0 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20  fore the end of 
13100 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20  the file.");.   
13110 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74       ps.errorcnt
13120 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  ++;.        next
13130 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d  cp = cp;.      }
13140 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65  else{.        ne
13150 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20  xtcp = cp+1;.   
13160 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
13170 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20  f( c=='{' ){    
13180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
13190 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65 20  block of C code 
131a0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 76  */.      int lev
131b0 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a  el;.      cp++;.
131c0 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d        for(level=
131d0 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  1; (c= *cp)!=0 &
131e0 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21  & (level>1 || c!
131f0 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20  ='}'); cp++){.  
13200 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
13210 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
13220 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
13230 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b  =='{' ) level++;
13240 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
13250 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c  ( c=='}' ) level
13260 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  --;.        else
13270 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
13280 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a  p[1]=='*' ){  /*
13290 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a   Skip comments *
132a0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
132b0 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20  prevc;.         
132c0 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20   cp = &cp[2];.  
132d0 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
132e0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  0;.          whi
132f0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
13300 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72  && (c!='/' || pr
13310 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20  evc!='*') ){.   
13320 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
13330 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
13340 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65  .            pre
13350 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  vc = c;.        
13360 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d 0a 09      cp++;..  }..
13370 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27  }else if( c=='/'
13380 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29   && cp[1]=='/' )
13390 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73  {  /* Skip C++ s
133a0 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74 6f  tyle comments to
133b0 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63  o */.          c
133c0 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20  p = &cp[2];.    
133d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
133e0 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
133f0 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  \n' ) cp++;.    
13400 20 20 20 20 20 20 69 66 28 20 63 20 29 20 6c 69        if( c ) li
13410 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69  neno++;..}else i
13420 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  f( c=='\'' || c=
13430 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53  ='\"' ){    /* S
13440 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74 65  tring a characte
13450 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20  r literals */.  
13460 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61 72          int star
13470 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20  tchar, prevc;.  
13480 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68 61          startcha
13490 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  r = c;.         
134a0 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
134b0 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20        for(cp++; 
134c0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
134d0 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20  c!=startchar || 
134e0 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70  prevc=='\\'); cp
134f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
13500 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
13510 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
13520 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d       if( prevc==
13530 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30  '\\' ) prevc = 0
13540 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ;.            el
13550 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
13560 70 72 65 76 63 20 3d 20 63 3b 0a 09 20 20 7d 0a  prevc = c;..  }.
13570 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .}.      }.     
13580 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
13590 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
135a0 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b  .filename,ps.tok
135b0 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64  enlineno,."C cod
135c0 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68  e starting on th
135d0 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
135e0 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65  erminated before
135f0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
13600 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  file.");.       
13610 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a   ps.errorcnt++;.
13620 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
13630 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   cp;.      }else
13640 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  {.        nextcp
13650 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d   = cp+1;.      }
13660 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
13670 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20 20 20  salnum(c) ){    
13680 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66        /* Identif
13690 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68  iers */.      wh
136a0 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
136b0 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63 29 20   && (isalnum(c) 
136c0 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b  || c=='_') ) cp+
136d0 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
136e0 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = cp;.    }else 
136f0 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70  if( c==':' && cp
13700 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32  [1]==':' && cp[2
13710 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65  ]=='=' ){ /* The
13720 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20   operator "::=" 
13730 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33  */.      cp += 3
13740 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
13750 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   cp;.    }else i
13760 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d  f( (c=='/' || c=
13770 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70 68 61  ='|') && isalpha
13780 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  (cp[1]) ){.     
13790 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20   cp += 2;.      
137a0 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29  while( (c = *cp)
137b0 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  !=0 && (isalnum(
137c0 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20  c) || c=='_') ) 
137d0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
137e0 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
137f0 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13810 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63  All other (one c
13820 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74  haracter) operat
13830 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  ors */.      cp+
13840 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
13850 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = cp;.    }.    
13860 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70  c = *cp;.    *cp
13870 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13890 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  Null terminate t
138a0 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
138b0 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70  parseonetoken(&p
138c0 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  s);             
138d0 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b  /* Parse the tok
138e0 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20  en */.    *cp = 
138f0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
13900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13910 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20  tore the buffer 
13920 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74  */.    cp = next
13930 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66  cp;.  }.  free(f
13940 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20  ilebuf);        
13950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
13960 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65  elease the buffe
13970 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20  r after parsing 
13980 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20  */.  gp->rule = 
13990 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20  ps.firstrule;.  
139a0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70  gp->errorcnt = p
139b0 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a  s.errorcnt;.}./*
139c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
139e0 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e  the file "plink.
139f0 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
13a00 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
13a10 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73  Routines process
13a20 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ing configuratio
13a30 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  n follow-set pro
13a40 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a  pagation links.*
13a50 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  * in the LEMON p
13a60 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
13a70 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
13a80 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66  t plink *plink_f
13a90 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  reelist = 0;../*
13aa0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
13ab0 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20  plink */.struct 
13ac0 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77  plink *Plink_new
13ad0 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  (){.  struct pli
13ae0 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28 20  nk *new;..  if( 
13af0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d  plink_freelist==
13b00 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
13b10 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30      int amt = 10
13b20 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  0;.    plink_fre
13b30 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
13b40 70 6c 69 6e 6b 20 2a 29 6d 61 6c 6c 6f 63 28 20  plink *)malloc( 
13b50 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70 6c  sizeof(struct pl
13b60 69 6e 6b 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20  ink)*amt );.    
13b70 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  if( plink_freeli
13b80 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
13b90 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
13ba0 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20       "Unable to 
13bb0 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
13bc0 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f 77  for a new follow
13bd0 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  -set propagation
13be0 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20   link.\n");.    
13bf0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
13c00 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
13c10 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69 6e  amt-1; i++) plin
13c20 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  k_freelist[i].ne
13c30 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65 65  xt = &plink_free
13c40 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 70  list[i+1];.    p
13c50 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61 6d  link_freelist[am
13c60 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20  t-1].next = 0;. 
13c70 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c 69 6e 6b   }.  new = plink
13c80 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c 69  _freelist;.  pli
13c90 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c  nk_freelist = pl
13ca0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e 65  ink_freelist->ne
13cb0 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  xt;.  return new
13cc0 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c  ;.}../* Add a pl
13cd0 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c  ink to a plink l
13ce0 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
13cf0 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66 70 29 0a  k_add(plpp,cfp).
13d00 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70  struct plink **p
13d10 6c 70 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  lpp;.struct conf
13d20 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72  ig *cfp;.{.  str
13d30 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a  uct plink *new;.
13d40 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b 5f 6e 65    new = Plink_ne
13d50 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78 74  w();.  new->next
13d60 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70   = *plpp;.  *plp
13d70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e  p = new;.  new->
13d80 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f 2a  cfp = cfp;.}../*
13d90 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79 20   Transfer every 
13da0 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73  plink on the lis
13db0 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65 20  t "from" to the 
13dc0 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f 69  list "to" */.voi
13dd0 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 74 6f 2c  d Plink_copy(to,
13de0 66 72 6f 6d 29 0a 73 74 72 75 63 74 20 70 6c 69  from).struct pli
13df0 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75 63 74 20  nk **to;.struct 
13e00 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a 20  plink *from;.{. 
13e10 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
13e20 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20  extpl;.  while( 
13e30 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74  from ){.    next
13e40 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b  pl = from->next;
13e50 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20  .    from->next 
13e60 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d  = *to;.    *to =
13e70 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20   from;.    from 
13e80 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a  = nextpl;.  }.}.
13e90 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79  ./* Delete every
13ea0 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
13eb0 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b  st */.void Plink
13ec0 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a 73 74 72  _delete(plp).str
13ed0 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
13ee0 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
13ef0 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68 69   *nextpl;..  whi
13f00 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 6e  le( plp ){.    n
13f10 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78  extpl = plp->nex
13f20 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78 74  t;.    plp->next
13f30 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73   = plink_freelis
13f40 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  t;.    plink_fre
13f50 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20 20  elist = plp;.   
13f60 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a 20   plp = nextpl;. 
13f70 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
13f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
13f90 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
13fa0 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.c" *********
13fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13fc0 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64 75  */./*.** Procedu
13fd0 72 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69  res for generati
13fe0 6e 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20 74  ng reports and t
13ff0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d  ables in the LEM
14000 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
14010 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65  tor..*/../* Gene
14020 72 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65 20  rate a filename 
14030 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73  with the given s
14040 75 66 66 69 78 2e 20 20 53 70 61 63 65 20 74 6f  uffix.  Space to
14050 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61 6d   hold the.** nam
14060 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61 6c  e comes from mal
14070 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
14080 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
14090 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
140a0 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63  on..*/.PRIVATE c
140b0 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61  har *file_makena
140c0 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69 78 29 0a  me(lemp,suffix).
140d0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
140e0 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69 78  mp;.char *suffix
140f0 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65  ;.{.  char *name
14100 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20  ;.  char *cp;.. 
14110 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20   name = malloc( 
14120 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c  strlen(lemp->fil
14130 65 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65 6e 28  ename) + strlen(
14140 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a 20  suffix) + 5 );. 
14150 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a   if( name==0 ){.
14160 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
14170 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61  rr,"Can't alloca
14180 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66  te space for a f
14190 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20  ilename.\n");.  
141a0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
141b0 20 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d   strcpy(name,lem
141c0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
141d0 63 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61 6d  cp = strrchr(nam
141e0 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70  e,'.');.  if( cp
141f0 20 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74   ) *cp = 0;.  st
14200 72 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78  rcat(name,suffix
14210 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65  );.  return name
14220 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66  ;.}../* Open a f
14230 69 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20  ile with a name 
14240 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d  based on the nam
14250 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
14260 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68  ile,.** but with
14270 20 61 20 64 69 66 66 65 72 65 6e 74 20 28 73 70   a different (sp
14280 65 63 69 66 69 65 64 29 20 73 75 66 66 69 78 2c  ecified) suffix,
14290 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
142a0 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
142b0 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54  stream */.PRIVAT
142c0 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65  E FILE *file_ope
142d0 6e 28 6c 65 6d 70 2c 73 75 66 66 69 78 2c 6d 6f  n(lemp,suffix,mo
142e0 64 65 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  de).struct lemon
142f0 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75   *lemp;.char *su
14300 66 66 69 78 3b 0a 63 68 61 72 20 2a 6d 6f 64 65  ffix;.char *mode
14310 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a  ;.{.  FILE *fp;.
14320 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74  .  if( lemp->out
14330 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70  name ) free(lemp
14340 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65  ->outname);.  le
14350 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69  mp->outname = fi
14360 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
14370 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20  , suffix);.  fp 
14380 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75  = fopen(lemp->ou
14390 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69  tname,mode);.  i
143a0 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64  f( fp==0 && *mod
143b0 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70  e=='w' ){.    fp
143c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
143d0 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22  n't open file \"
143e0 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f  %s\".\n",lemp->o
143f0 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  utname);.    lem
14400 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
14410 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14420 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a  .  return fp;.}.
14430 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68  ./* Duplicate th
14440 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74  e input file wit
14450 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e  hout comments an
14460 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e  d without action
14470 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a  s .** on rules *
14480 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 6c  /.void Reprint(l
14490 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
144a0 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72  n *lemp;.{.  str
144b0 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
144c0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
144d0 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d  p;.  int i, j, m
144e0 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c  axlen, len, ncol
144f0 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72  umns, skip;.  pr
14500 69 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e 74  intf("// Reprint
14510 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 5c   of input file \
14520 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f  "%s\".\n// Symbo
14530 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c  ls:\n",lemp->fil
14540 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e  ename);.  maxlen
14550 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30   = 10;.  for(i=0
14560 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
14570 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20  l; i++){.    sp 
14580 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
14590 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74  i];.    len = st
145a0 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a  rlen(sp->name);.
145b0 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c      if( len>maxl
145c0 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65  en ) maxlen = le
145d0 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e  n;.  }.  ncolumn
145e0 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35  s = 76/(maxlen+5
145f0 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e  );.  if( ncolumn
14600 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d  s<1 ) ncolumns =
14610 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65   1;.  skip = (le
14620 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63  mp->nsymbol + nc
14630 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c  olumns - 1)/ncol
14640 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  umns;.  for(i=0;
14650 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20   i<skip; i++){. 
14660 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b     printf("//");
14670 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c  .    for(j=i; j<
14680 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a  lemp->nsymbol; j
14690 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73  +=skip){.      s
146a0 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
146b0 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  s[j];.      asse
146c0 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a  rt( sp->index==j
146d0 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   );.      printf
146e0 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a  (" %3d %-*.*s",j
146f0 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73  ,maxlen,maxlen,s
14700 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  p->name);.    }.
14710 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29      printf("\n")
14720 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c  ;.  }.  for(rp=l
14730 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
14740 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
14750 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70 2d   printf("%s",rp-
14760 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
14770 20 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c   /*    if( rp->l
14780 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e 74 66  hsalias ) printf
14790 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61  ("(%s)",rp->lhsa
147a0 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72  lias); */.    pr
147b0 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20  intf(" ::=");.  
147c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
147d0 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
147e0 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b     sp = rp->rhs[
147f0 69 5d 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66  i];.      printf
14800 28 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65  (" %s", sp->name
14810 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  );.      if( sp-
14820 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
14830 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
14840 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e  for(j=1; j<sp->n
14850 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20  subsym; j++){.  
14860 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
14870 7c 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d  |%s", sp->subsym
14880 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [j]->name);.    
14890 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
148a0 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e 72      /* if( rp->r
148b0 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70 72 69  hsalias[i] ) pri
148c0 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 72  ntf("(%s)",rp->r
148d0 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a  hsalias[i]); */.
148e0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
148f0 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20 72  (".");.    if( r
14900 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72 69  p->precsym ) pri
14910 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e  ntf(" [%s]",rp->
14920 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a  precsym->name);.
14930 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e 63      /* if( rp->c
14940 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e  ode ) printf("\n
14950 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65      %s",rp->code
14960 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66  ); */.    printf
14970 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76  ("\n");.  }.}..v
14980 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e 74 28  oid ConfigPrint(
14990 66 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a 66 70  fp,cfp).FILE *fp
149a0 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
149b0 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  *cfp;.{.  struct
149c0 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72   rule *rp;.  str
149d0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
149e0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 72 70    int i, j;.  rp
149f0 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 66 70   = cfp->rp;.  fp
14a00 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d  rintf(fp,"%s ::=
14a10 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  ",rp->lhs->name)
14a20 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
14a30 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
14a40 20 20 20 20 69 66 28 20 69 3d 3d 63 66 70 2d 3e      if( i==cfp->
14a50 64 6f 74 20 29 20 66 70 72 69 6e 74 66 28 66 70  dot ) fprintf(fp
14a60 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69 66 28 20  ," *");.    if( 
14a70 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62 72  i==rp->nrhs ) br
14a80 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72 70  eak;.    sp = rp
14a90 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 66 70  ->rhs[i];.    fp
14aa0 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20  rintf(fp," %s", 
14ab0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69  sp->name);.    i
14ac0 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( sp->type==MUL
14ad0 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
14ae0 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73      for(j=1; j<s
14af0 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  p->nsubsym; j++)
14b00 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
14b10 66 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d 3e 73  f(fp,"|%s",sp->s
14b20 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b  ubsym[j]->name);
14b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14b40 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e 65   }.}../* #define
14b50 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30 0a 2f   TEST */.#if 0./
14b60 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20 2a 2f  * Print a set */
14b70 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 53 65  .PRIVATE void Se
14b80 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c 6c  tPrint(out,set,l
14b90 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a  emp).FILE *out;.
14ba0 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72 75 63  char *set;.struc
14bb0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
14bc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
14bd0 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70 61 63   *spacer;.  spac
14be0 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72 69 6e  er = "";.  fprin
14bf0 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c 22  tf(out,"%12s[","
14c00 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
14c10 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
14c20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
14c30 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29 20 29  SetFind(set,i) )
14c40 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
14c50 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61 63 65  out,"%s%s",space
14c60 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  r,lemp->symbols[
14c70 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  i]->name);.     
14c80 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b 0a 20   spacer = " ";. 
14c90 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
14ca0 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d  tf(out,"]\n");.}
14cb0 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c 69  ../* Print a pli
14cc0 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49 56  nk chain */.PRIV
14cd0 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50 72  ATE void PlinkPr
14ce0 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67 29  int(out,plp,tag)
14cf0 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75  .FILE *out;.stru
14d00 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63  ct plink *plp;.c
14d10 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77 68  har *tag;.{.  wh
14d20 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20  ile( plp ){.    
14d30 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32  fprintf(out,"%12
14d40 73 25 73 20 28 73 74 61 74 65 20 25 32 64 29 20  s%s (state %2d) 
14d50 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63 66  ","",tag,plp->cf
14d60 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  p->stp->statenum
14d70 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50 72 69  );.    ConfigPri
14d80 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70 29  nt(out,plp->cfp)
14d90 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
14da0 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c 70  t,"\n");.    plp
14db0 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20   = plp->next;.  
14dc0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 50  }.}.#endif../* P
14dd0 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20 74  rint an action t
14de0 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
14df0 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
14e00 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a 2a  turn FALSE if.**
14e10 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61 63 74   nothing was act
14e20 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a 2a  ually printed..*
14e30 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74 69 6f  /.int PrintActio
14e40 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  n(struct action 
14e50 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20 69  *ap, FILE *fp, i
14e60 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69 6e  nt indent){.  in
14e70 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20  t result = 1;.  
14e80 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65  switch( ap->type
14e90 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49   ){.    case SHI
14ea0 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  FT:.      fprint
14eb0 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20  f(fp,"%*s shift 
14ec0 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e   %d",indent,ap->
14ed0 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73  sp->name,ap->x.s
14ee0 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20  tp->statenum);. 
14ef0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14f00 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20 20 20  case REDUCE:.   
14f10 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
14f20 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c 69 6e  *s reduce %d",in
14f30 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
14f40 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65  e,ap->x.rp->inde
14f50 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
14f60 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50 54  .    case ACCEPT
14f70 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
14f80 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74 22 2c  fp,"%*s accept",
14f90 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
14fa0 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
14fb0 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f  k;.    case ERRO
14fc0 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  R:.      fprintf
14fd0 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72 22 2c  (fp,"%*s error",
14fe0 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
14ff0 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
15000 6b 3b 0a 20 20 20 20 63 61 73 65 20 43 4f 4e 46  k;.    case CONF
15010 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69  LICT:.      fpri
15020 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75  ntf(fp,"%*s redu
15030 63 65 20 25 2d 33 64 20 2a 2a 20 50 61 72 73 69  ce %-3d ** Parsi
15040 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c  ng conflict **",
15050 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c  .        indent,
15060 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
15070 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  >x.rp->index);. 
15080 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15090 63 61 73 65 20 53 48 5f 52 45 53 4f 4c 56 45 44  case SH_RESOLVED
150a0 3a 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52 45  :.    case RD_RE
150b0 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SOLVED:.    case
150c0 20 4e 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20   NOT_USED:.     
150d0 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20   result = 0;.   
150e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
150f0 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d  return result;.}
15100 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68  ../* Generate th
15110 65 20 22 79 2e 6f 75 74 70 75 74 22 20 6c 6f 67  e "y.output" log
15120 20 66 69 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65   file */.void Re
15130 70 6f 72 74 4f 75 74 70 75 74 28 6c 65 6d 70 29  portOutput(lemp)
15140 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
15150 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp;.{.  int i;.
15160 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
15170 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  stp;.  struct co
15180 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
15190 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
151a0 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66    FILE *fp;..  f
151b0 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  p = file_open(le
151c0 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b  mp,".out","wb");
151d0 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72  .  if( fp==0 ) r
151e0 65 74 75 72 6e 3b 0a 20 20 66 70 72 69 6e 74 66  eturn;.  fprintf
151f0 28 66 70 2c 22 20 5c 62 22 29 3b 0a 20 20 66 6f  (fp," \b");.  fo
15200 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
15210 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
15220 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
15230 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69  ted[i];.    fpri
15240 6e 74 66 28 66 70 2c 22 53 74 61 74 65 20 25 64  ntf(fp,"State %d
15250 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65 6e  :\n",stp->staten
15260 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d  um);.    if( lem
15270 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63  p->basisflag ) c
15280 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20  fp=stp->bp;.    
15290 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
152a0 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e 63        cfp=stp->c
152b0 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63  fp;.    while( c
152c0 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  fp ){.      char
152d0 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20   buf[20];.      
152e0 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66  if( cfp->dot==cf
152f0 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20  p->rp->nrhs ){. 
15300 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 62         sprintf(b
15310 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e 72  uf,"(%d)",cfp->r
15320 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
15330 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
15340 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a 20     %5s ",buf);. 
15350 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15360 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
15370 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20 20            ");.  
15380 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66      }.      Conf
15390 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29 3b  igPrint(fp,cfp);
153a0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
153b0 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a 20  p,"\n");.#if 0. 
153c0 20 20 20 20 20 53 65 74 50 72 69 6e 74 28 66 70       SetPrint(fp
153d0 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b  ,cfp->fws,lemp);
153e0 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e  .      PlinkPrin
153f0 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22  t(fp,cfp->fplp,"
15400 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50 6c  To  ");.      Pl
15410 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  inkPrint(fp,cfp-
15420 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23  >bplp,"From");.#
15430 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
15440 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20  lemp->basisflag 
15450 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20  ) cfp=cfp->bp;. 
15460 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20       else       
15470 20 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 63             cfp=c
15480 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a  fp->next;.    }.
15490 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
154a0 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70  \n");.    for(ap
154b0 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
154c0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
154d0 20 20 69 66 28 20 50 72 69 6e 74 41 63 74 69 6f    if( PrintActio
154e0 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66 70  n(ap,fp,30) ) fp
154f0 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
15500 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
15510 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a  f(fp,"\n");.  }.
15520 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20    fclose(fp);.  
15530 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65  return;.}../* Se
15540 61 72 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c  arch for the fil
15550 65 20 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69  e "name" which i
15560 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
15570 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
15580 65 20 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a  e exacutable */.
15590 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 70 61  PRIVATE char *pa
155a0 74 68 73 65 61 72 63 68 28 61 72 67 76 30 2c 6e  thsearch(argv0,n
155b0 61 6d 65 2c 6d 6f 64 65 6d 61 73 6b 29 0a 63 68  ame,modemask).ch
155c0 61 72 20 2a 61 72 67 76 30 3b 0a 63 68 61 72 20  ar *argv0;.char 
155d0 2a 6e 61 6d 65 3b 0a 69 6e 74 20 6d 6f 64 65 6d  *name;.int modem
155e0 61 73 6b 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 70  ask;.{.  char *p
155f0 61 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72 20  athlist;.  char 
15600 2a 70 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61  *path,*cp;.  cha
15610 72 20 63 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  r c;.  extern in
15620 74 20 61 63 63 65 73 73 28 29 3b 0a 0a 23 69 66  t access();..#if
15630 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20  def __WIN32__.  
15640 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67  cp = strrchr(arg
15650 76 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a  v0,'\\');.#else.
15660 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61    cp = strrchr(a
15670 72 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69  rgv0,'/');.#endi
15680 66 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20  f.  if( cp ){.  
15690 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a    c = *cp;.    *
156a0 63 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68  cp = 0;.    path
156b0 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
156c0 63 28 20 73 74 72 6c 65 6e 28 61 72 67 76 30 29  c( strlen(argv0)
156d0 20 2b 20 73 74 72 6c 65 6e 28 6e 61 6d 65 29 20   + strlen(name) 
156e0 2b 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  + 2 );.    if( p
156f0 61 74 68 20 29 20 73 70 72 69 6e 74 66 28 70 61  ath ) sprintf(pa
15700 74 68 2c 22 25 73 2f 25 73 22 2c 61 72 67 76 30  th,"%s/%s",argv0
15710 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20  ,name);.    *cp 
15720 3d 20 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = c;.  }else{.  
15730 20 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a 67    extern char *g
15740 65 74 65 6e 76 28 29 3b 0a 20 20 20 20 70 61 74  etenv();.    pat
15750 68 6c 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22  hlist = getenv("
15760 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20  PATH");.    if( 
15770 70 61 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61  pathlist==0 ) pa
15780 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e  thlist = ".:/bin
15790 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20  :/usr/bin";.    
157a0 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d  path = (char *)m
157b0 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 70 61  alloc( strlen(pa
157c0 74 68 6c 69 73 74 29 2b 73 74 72 6c 65 6e 28 6e  thlist)+strlen(n
157d0 61 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69 66  ame)+2 );.    if
157e0 28 20 70 61 74 68 21 3d 30 20 29 7b 0a 20 20 20  ( path!=0 ){.   
157f0 20 20 20 77 68 69 6c 65 28 20 2a 70 61 74 68 6c     while( *pathl
15800 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ist ){.        c
15810 70 20 3d 20 73 74 72 63 68 72 28 70 61 74 68 6c  p = strchr(pathl
15820 69 73 74 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20  ist,':');.      
15830 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70    if( cp==0 ) cp
15840 20 3d 20 26 70 61 74 68 6c 69 73 74 5b 73 74 72   = &pathlist[str
15850 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 5d 3b 0a  len(pathlist)];.
15860 20 20 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b          c = *cp;
15870 0a 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30  .        *cp = 0
15880 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74  ;.        sprint
15890 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70  f(path,"%s/%s",p
158a0 61 74 68 6c 69 73 74 2c 6e 61 6d 65 29 3b 0a 20  athlist,name);. 
158b0 20 20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a         *cp = c;.
158c0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30          if( c==0
158d0 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22 22   ) pathlist = ""
158e0 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 70  ;.        else p
158f0 61 74 68 6c 69 73 74 20 3d 20 26 63 70 5b 31 5d  athlist = &cp[1]
15900 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63  ;.        if( ac
15910 63 65 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61  cess(path,modema
15920 73 6b 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  sk)==0 ) break;.
15930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15940 7d 0a 20 20 72 65 74 75 72 6e 20 70 61 74 68 3b  }.  return path;
15950 0a 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20  .}../* Given an 
15960 61 63 74 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20  action, compute 
15970 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  the integer valu
15980 65 20 66 6f 72 20 74 68 61 74 20 61 63 74 69 6f  e for that actio
15990 6e 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 74 6f  n.** which is to
159a0 20 62 65 20 70 75 74 20 69 6e 20 74 68 65 20 61   be put in the a
159b0 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74  ction table of t
159c0 68 65 20 67 65 6e 65 72 61 74 65 64 20 6d 61 63  he generated mac
159d0 68 69 6e 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  hine..** Return 
159e0 6e 65 67 61 74 69 76 65 20 69 66 20 6e 6f 20 61  negative if no a
159f0 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
15a00 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52  generated..*/.PR
15a10 49 56 41 54 45 20 69 6e 74 20 63 6f 6d 70 75 74  IVATE int comput
15a20 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70  e_action(lemp,ap
15a30 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
15a40 6c 65 6d 70 3b 0a 73 74 72 75 63 74 20 61 63 74  lemp;.struct act
15a50 69 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20 69 6e 74  ion *ap;.{.  int
15a60 20 61 63 74 3b 0a 20 20 73 77 69 74 63 68 28 20   act;.  switch( 
15a70 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20  ap->type ){.    
15a80 63 61 73 65 20 53 48 49 46 54 3a 20 20 61 63 74  case SHIFT:  act
15a90 20 3d 20 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74   = ap->x.stp->st
15aa0 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  atenum;         
15ab0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
15ac0 73 65 20 52 45 44 55 43 45 3a 20 61 63 74 20 3d  se REDUCE: act =
15ad0 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78   ap->x.rp->index
15ae0 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   + lemp->nstate;
15af0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15b00 20 45 52 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c   ERROR:  act = l
15b10 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
15b20 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20 20 20 20 62  mp->nrule;     b
15b30 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
15b40 43 43 45 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d  CCEPT: act = lem
15b50 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
15b60 2d 3e 6e 72 75 6c 65 20 2b 20 31 3b 20 62 72 65  ->nrule + 1; bre
15b70 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
15b80 20 20 20 20 20 61 63 74 20 3d 20 2d 31 3b 20 62       act = -1; b
15b90 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
15ba0 72 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69  rn act;.}..#defi
15bb0 6e 65 20 4c 49 4e 45 53 49 5a 45 20 31 30 30 30  ne LINESIZE 1000
15bc0 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 63 6c 75  ./* The next clu
15bd0 73 74 65 72 20 6f 66 20 72 6f 75 74 69 6e 65 73  ster of routines
15be0 20 61 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67   are for reading
15bf0 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69   the template fi
15c00 6c 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e  le.** and writin
15c10 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f  g the results to
15c20 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70   the generated p
15c30 61 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20  arser */./* The 
15c40 66 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 74  first function t
15c50 72 61 6e 73 66 65 72 73 20 64 61 74 61 20 66 72  ransfers data fr
15c60 6f 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75 74 22  om "in" to "out"
15c70 20 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65   until.** a line
15c80 20 69 73 20 73 65 65 6e 20 77 68 69 63 68 20 62   is seen which b
15c90 65 67 69 6e 73 20 77 69 74 68 20 22 25 25 22 2e  egins with "%%".
15ca0 20 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65    The line numbe
15cb0 72 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e  r is.** tracked.
15cc0 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d  .**.** if name!=
15cd0 30 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f 72 64  0, then any word
15ce0 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
15cf0 20 22 50 61 72 73 65 22 20 69 73 20 63 68 61 6e   "Parse" is chan
15d00 67 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20  ged to.** begin 
15d10 77 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65  with *name inste
15d20 61 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  ad..*/.PRIVATE v
15d30 6f 69 64 20 74 70 6c 74 5f 78 66 65 72 28 6e 61  oid tplt_xfer(na
15d40 6d 65 2c 69 6e 2c 6f 75 74 2c 6c 69 6e 65 6e 6f  me,in,out,lineno
15d50 29 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 46 49  ).char *name;.FI
15d60 4c 45 20 2a 69 6e 3b 0a 46 49 4c 45 20 2a 6f 75  LE *in;.FILE *ou
15d70 74 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a  t;.int *lineno;.
15d80 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72  {.  int i, iStar
15d90 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c  t;.  char line[L
15da0 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c  INESIZE];.  whil
15db0 65 28 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49  e( fgets(line,LI
15dc0 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c  NESIZE,in) && (l
15dd0 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c  ine[0]!='%' || l
15de0 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a  ine[1]!='%') ){.
15df0 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
15e00 0a 20 20 20 20 69 53 74 61 72 74 20 3d 20 30 3b  .    iStart = 0;
15e10 0a 20 20 20 20 69 66 28 20 6e 61 6d 65 20 29 7b  .    if( name ){
15e20 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15e30 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  line[i]; i++){. 
15e40 20 20 20 20 20 20 20 69 66 28 20 6c 69 6e 65 5b         if( line[
15e50 69 5d 3d 3d 27 50 27 20 26 26 20 73 74 72 6e 63  i]=='P' && strnc
15e60 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72  mp(&line[i],"Par
15e70 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20  se",5)==0.      
15e80 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20      && (i==0 || 
15e90 21 69 73 61 6c 70 68 61 28 6c 69 6e 65 5b 69 2d  !isalpha(line[i-
15ea0 31 5d 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  1])).        ){.
15eb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
15ec0 69 53 74 61 72 74 20 29 20 66 70 72 69 6e 74 66  iStart ) fprintf
15ed0 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53  (out,"%.*s",i-iS
15ee0 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72  tart,&line[iStar
15ef0 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t]);.          f
15f00 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
15f10 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
15f20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20   i += 4;.       
15f30 20 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b     iStart = i+1;
15f40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15f50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72   }.    }.    fpr
15f60 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c  intf(out,"%s",&l
15f70 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20  ine[iStart]);.  
15f80 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74  }.}../* The next
15f90 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
15fa0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
15fb0 65 20 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20  e and opens it, 
15fc0 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70  returning.** a p
15fd0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 70  ointer to the op
15fe0 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52  ened file. */.PR
15ff0 49 56 41 54 45 20 46 49 4c 45 20 2a 74 70 6c 74  IVATE FILE *tplt
16000 5f 6f 70 65 6e 28 6c 65 6d 70 29 0a 73 74 72 75  _open(lemp).stru
16010 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
16020 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
16030 74 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d  templatename[] =
16040 20 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63   "lempar.c";.  c
16050 68 61 72 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20  har buf[1000];. 
16060 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61   FILE *in;.  cha
16070 72 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63  r *tpltname;.  c
16080 68 61 72 20 2a 63 70 3b 0a 0a 20 20 63 70 20 3d  har *cp;..  cp =
16090 20 73 74 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66   strrchr(lemp->f
160a0 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20  ilename,'.');.  
160b0 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 73 70  if( cp ){.    sp
160c0 72 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e  rintf(buf,"%.*s.
160d0 6c 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d  lt",(int)(cp-lem
160e0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d  p->filename),lem
160f0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
16100 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e  }else{.    sprin
16110 74 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c  tf(buf,"%s.lt",l
16120 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
16130 20 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73    }.  if( access
16140 28 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a  (buf,004)==0 ){.
16150 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62      tpltname = b
16160 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  uf;.  }else if( 
16170 61 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e  access(templaten
16180 61 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20  ame,004)==0 ){. 
16190 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65     tpltname = te
161a0 6d 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65  mplatename;.  }e
161b0 6c 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d  lse{.    tpltnam
161c0 65 20 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c  e = pathsearch(l
161d0 65 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c  emp->argv0,templ
161e0 61 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a  atename,0);.  }.
161f0 20 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d    if( tpltname==
16200 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
16210 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66  (stderr,"Can't f
16220 69 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64  ind the parser d
16230 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66  river template f
16240 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a  ile \"%s\".\n",.
16250 20 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65      templatename
16260 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
16270 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
16280 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20  urn 0;.  }.  in 
16290 3d 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65  = fopen(tpltname
162a0 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e  ,"rb");.  if( in
162b0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
162c0 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
162d0 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61   open the templa
162e0 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  te file \"%s\".\
162f0 6e 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29  n",templatename)
16300 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
16310 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
16320 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
16330 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69  rn in;.}../* Pri
16340 6e 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65 63  nt a #line direc
16350 74 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68 65  tive line to the
16360 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f   output file. */
16370 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70  .PRIVATE void tp
16380 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 6c  lt_linedir(out,l
16390 69 6e 65 6e 6f 2c 66 69 6c 65 6e 61 6d 65 29 0a  ineno,filename).
163a0 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 6c  FILE *out;.int l
163b0 69 6e 65 6e 6f 3b 0a 63 68 61 72 20 2a 66 69 6c  ineno;.char *fil
163c0 65 6e 61 6d 65 3b 0a 7b 0a 20 20 66 70 72 69 6e  ename;.{.  fprin
163d0 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64  tf(out,"#line %d
163e0 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20   \"",lineno);.  
163f0 77 68 69 6c 65 28 20 2a 66 69 6c 65 6e 61 6d 65  while( *filename
16400 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 66 69 6c   ){.    if( *fil
16410 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c 27 20 29 20  ename == '\\' ) 
16420 70 75 74 63 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a  putc('\\',out);.
16430 20 20 20 20 70 75 74 63 28 2a 66 69 6c 65 6e 61      putc(*filena
16440 6d 65 2c 6f 75 74 29 3b 0a 20 20 20 20 66 69 6c  me,out);.    fil
16450 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ename++;.  }.  f
16460 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 5c 6e  printf(out,"\"\n
16470 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20  ");.}../* Print 
16480 61 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20  a string to the 
16490 66 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74 68  file and keep th
164a0 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70 20  e linenumber up 
164b0 74 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56 41  to date */.PRIVA
164c0 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72 69  TE void tplt_pri
164d0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 73 74 72 2c  nt(out,lemp,str,
164e0 73 74 72 6c 6e 2c 6c 69 6e 65 6e 6f 29 0a 46 49  strln,lineno).FI
164f0 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20  LE *out;.struct 
16500 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61  lemon *lemp;.cha
16510 72 20 2a 73 74 72 3b 0a 69 6e 74 20 73 74 72 6c  r *str;.int strl
16520 6e 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a  n;.int *lineno;.
16530 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29  {.  if( str==0 )
16540 20 72 65 74 75 72 6e 3b 0a 20 20 74 70 6c 74 5f   return;.  tplt_
16550 6c 69 6e 65 64 69 72 28 6f 75 74 2c 73 74 72 6c  linedir(out,strl
16560 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  n,lemp->filename
16570 29 3b 0a 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  );.  (*lineno)++
16580 3b 0a 20 20 77 68 69 6c 65 28 20 2a 73 74 72 20  ;.  while( *str 
16590 29 7b 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d  ){.    if( *str=
165a0 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f  ='\n' ) (*lineno
165b0 29 2b 2b 3b 0a 20 20 20 20 70 75 74 63 28 2a 73  )++;.    putc(*s
165c0 74 72 2c 6f 75 74 29 3b 0a 20 20 20 20 73 74 72  tr,out);.    str
165d0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ++;.  }.  if( st
165e0 72 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20  r[-1]!='\n' ){. 
165f0 20 20 20 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74     putc('\n',out
16600 29 3b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29  );.    (*lineno)
16610 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 6c  ++;.  }.  tplt_l
16620 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65  inedir(out,*line
16630 6e 6f 2b 32 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  no+2,lemp->outna
16640 6d 65 29 3b 20 0a 20 20 28 2a 6c 69 6e 65 6e 6f  me); .  (*lineno
16650 29 2b 3d 32 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  )+=2;.  return;.
16660 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
16670 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 65  lowing routine e
16680 6d 69 74 73 20 63 6f 64 65 20 66 6f 72 20 74 68  mits code for th
16690 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
166a0 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73   the.** symbol s
166b0 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64  p.*/.void emit_d
166c0 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
166d0 75 74 2c 73 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e  ut,sp,lemp,linen
166e0 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74  o).FILE *out;.st
166f0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
16700 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
16710 65 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f  emp;.int *lineno
16720 3b 0a 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20  ;.{. char *cp = 
16730 30 3b 0a 0a 20 69 6e 74 20 6c 69 6e 65 63 6e 74  0;.. int linecnt
16740 20 3d 20 30 3b 0a 20 69 66 28 20 73 70 2d 3e 74   = 0;. if( sp->t
16750 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b  ype==TERMINAL ){
16760 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74  .   cp = lemp->t
16770 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28  okendest;.   if(
16780 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   cp==0 ) return;
16790 0a 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  .   tplt_linedir
167a0 28 6f 75 74 2c 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  (out,lemp->token
167b0 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c  destln,lemp->fil
167c0 65 6e 61 6d 65 29 3b 0a 20 20 20 66 70 72 69 6e  ename);.   fprin
167d0 74 66 28 6f 75 74 2c 22 7b 22 29 3b 0a 20 7d 65  tf(out,"{");. }e
167e0 6c 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74  lse if( sp->dest
167f0 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20  ructor ){.   cp 
16800 3d 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  = sp->destructor
16810 3b 0a 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69  ;.   tplt_linedi
16820 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 72 75  r(out,sp->destru
16830 63 74 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c  ctorln,lemp->fil
16840 65 6e 61 6d 65 29 3b 0a 20 20 20 66 70 72 69 6e  ename);.   fprin
16850 74 66 28 6f 75 74 2c 22 7b 22 29 3b 0a 20 7d 65  tf(out,"{");. }e
16860 6c 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61  lse if( lemp->va
16870 72 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20 3d  rdest ){.   cp =
16880 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a   lemp->vardest;.
16890 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72     if( cp==0 ) r
168a0 65 74 75 72 6e 3b 0a 20 20 20 74 70 6c 74 5f 6c  eturn;.   tplt_l
168b0 69 6e 65 64 69 72 28 6f 75 74 2c 6c 65 6d 70 2d  inedir(out,lemp-
168c0 3e 76 61 72 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d  >vardestln,lemp-
168d0 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 66  >filename);.   f
168e0 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 22 29 3b  printf(out,"{");
168f0 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73 73 65  . }else{.   asse
16900 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e  rt( 0 );  /* Can
16910 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 7d  not happen */. }
16920 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70 2b  . for(; *cp; cp+
16930 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d  +){.   if( *cp==
16940 27 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 24  '$' && cp[1]=='$
16950 27 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e 74  ' ){.     fprint
16960 66 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f 72  f(out,"(yypminor
16970 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74 6e  ->yy%d)",sp->dtn
16980 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b 0a  um);.     cp++;.
16990 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
169a0 20 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d    }.   if( *cp==
169b0 27 5c 6e 27 20 29 20 6c 69 6e 65 63 6e 74 2b 2b  '\n' ) linecnt++
169c0 3b 0a 20 20 20 66 70 75 74 63 28 2a 63 70 2c 6f  ;.   fputc(*cp,o
169d0 75 74 29 3b 0a 20 7d 0a 20 28 2a 6c 69 6e 65 6e  ut);. }. (*linen
169e0 6f 29 20 2b 3d 20 33 20 2b 20 6c 69 6e 65 63 6e  o) += 3 + linecn
169f0 74 3b 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  t;. fprintf(out,
16a00 22 7d 5c 6e 22 29 3b 0a 20 74 70 6c 74 5f 6c 69  "}\n");. tplt_li
16a10 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e  nedir(out,*linen
16a20 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  o,lemp->outname)
16a30 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ;. return;.}../*
16a40 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
16a50 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68  (non-zero) if th
16a60 65 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68  e given symbol h
16a70 61 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e  as a destructor.
16a80 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73 74  .*/.int has_dest
16a90 72 75 63 74 6f 72 28 73 70 2c 20 6c 65 6d 70 29  ructor(sp, lemp)
16aa0 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
16ab0 73 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  sp;.struct lemon
16ac0 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
16ad0 72 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74  ret;.  if( sp->t
16ae0 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b  ype==TERMINAL ){
16af0 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d  .    ret = lemp-
16b00 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20  >tokendest!=0;. 
16b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 20   }else{.    ret 
16b20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 21  = lemp->vardest!
16b30 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75  =0 || sp->destru
16b40 63 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72  ctor!=0;.  }.  r
16b50 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
16b60 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20  .** Append text 
16b70 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  to a dynamically
16b80 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e   allocated strin
16b90 67 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73 20  g.  If zText is 
16ba0 30 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20  0 then.** reset 
16bb0 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62 65  the string to be
16bc0 20 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20 41   empty again.  A
16bd0 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65  lways return the
16be0 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a   complete text.*
16bf0 2a 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20  * of the string 
16c00 28 77 68 69 63 68 20 69 73 20 6f 76 65 72 77 72  (which is overwr
16c10 69 74 74 65 6e 20 77 69 74 68 20 65 61 63 68 20  itten with each 
16c20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62  call)..**.** n b
16c30 79 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61 72  ytes of zText ar
16c40 65 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d  e stored.  If n=
16c50 3d 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a  =0 then all of z
16c60 54 65 78 74 20 75 70 20 74 6f 20 74 68 65 20 66  Text up to the f
16c70 69 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72  irst.** \000 ter
16c80 6d 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72 65  minator is store
16c90 64 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63 6f  d.  zText can co
16ca0 6e 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f 20  ntain up to two 
16cb0 69 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20  instances of.** 
16cc0 25 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20  %d.  The values 
16cd0 6f 66 20 70 31 20 61 6e 64 20 70 32 20 61 72 65  of p1 and p2 are
16ce0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
16cf0 65 20 66 69 72 73 74 20 61 6e 64 20 73 65 63 6f  e first and seco
16d00 6e 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20  nd.** %d..**.** 
16d10 49 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74  If n==-1, then t
16d20 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72  he previous char
16d30 61 63 74 65 72 20 69 73 20 6f 76 65 72 77 72 69  acter is overwri
16d40 74 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  tten..*/.PRIVATE
16d50 20 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73 74   char *append_st
16d60 72 28 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  r(char *zText, i
16d70 6e 74 20 6e 2c 20 69 6e 74 20 70 31 2c 20 69 6e  nt n, int p1, in
16d80 74 20 70 32 29 7b 0a 20 20 73 74 61 74 69 63 20  t p2){.  static 
16d90 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73  char *z = 0;.  s
16da0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 65  tatic int alloce
16db0 64 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  d = 0;.  static 
16dc0 69 6e 74 20 75 73 65 64 20 3d 20 30 3b 0a 20 20  int used = 0;.  
16dd0 69 6e 74 20 63 3b 0a 20 20 63 68 61 72 20 7a 49  int c;.  char zI
16de0 6e 74 5b 34 30 5d 3b 0a 0a 20 20 69 66 28 20 7a  nt[40];..  if( z
16df0 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 75  Text==0 ){.    u
16e00 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  sed = 0;.    ret
16e10 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69 66 28  urn z;.  }.  if(
16e20 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28   n<=0 ){.    if(
16e30 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 73   n<0 ){.      us
16e40 65 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 61  ed += n;.      a
16e50 73 73 65 72 74 28 20 75 73 65 64 3e 3d 30 20 29  ssert( used>=0 )
16e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
16e70 73 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20  strlen(zText);. 
16e80 20 7d 0a 20 20 69 66 28 20 6e 2b 73 69 7a 65 6f   }.  if( n+sizeo
16e90 66 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64 20 3e  f(zInt)*2+used >
16ea0 3d 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20  = alloced ){.   
16eb0 20 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b 20 73   alloced = n + s
16ec0 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20 2b 20  izeof(zInt)*2 + 
16ed0 75 73 65 64 20 2b 20 32 30 30 3b 0a 20 20 20 20  used + 200;.    
16ee0 7a 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20  z = realloc(z,  
16ef0 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20  alloced);.  }.  
16f00 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
16f10 6e 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n "";.  while( n
16f20 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63 20  -- > 0 ){.    c 
16f30 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20 20  = *(zText++);.  
16f40 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26 20    if( c=='%' && 
16f50 7a 54 65 78 74 5b 30 5d 3d 3d 27 64 27 20 29 7b  zText[0]=='d' ){
16f60 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a  .      sprintf(z
16f70 49 6e 74 2c 20 22 25 64 22 2c 20 70 31 29 3b 0a  Int, "%d", p1);.
16f80 20 20 20 20 20 20 70 31 20 3d 20 70 32 3b 0a 20        p1 = p2;. 
16f90 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 5b 75       strcpy(&z[u
16fa0 73 65 64 5d 2c 20 7a 49 6e 74 29 3b 0a 20 20 20  sed], zInt);.   
16fb0 20 20 20 75 73 65 64 20 2b 3d 20 73 74 72 6c 65     used += strle
16fc0 6e 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20  n(&z[used]);.   
16fd0 20 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20     zText++;.    
16fe0 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65    n--;.    }else
16ff0 7b 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b  {.      z[used++
17000 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = c;.    }.  }
17010 0a 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a  .  z[used] = 0;.
17020 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
17030 2a 0a 2a 2a 20 7a 43 6f 64 65 20 69 73 20 61 20  *.** zCode is a 
17040 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 74  string that is t
17050 68 65 20 61 63 74 69 6f 6e 20 61 73 73 6f 63 69  he action associ
17060 61 74 65 64 20 77 69 74 68 20 61 20 72 75 6c 65  ated with a rule
17070 2e 20 20 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65  .  Expand.** the
17080 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73   symbols in this
17090 20 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20   string so that 
170a0 74 68 65 20 72 65 66 65 72 20 74 6f 20 65 6c 65  the refer to ele
170b0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 72  ments of the par
170c0 73 65 72 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f  ser.** stack..*/
170d0 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 72  .PRIVATE void tr
170e0 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73 74 72  anslate_code(str
170f0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
17100 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
17110 29 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a  ){.  char *cp, *
17120 78 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  xp;.  int i;.  c
17130 68 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b  har lhsused = 0;
17140 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
17150 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68  he LHS element h
17160 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a  as been used */.
17170 20 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52    char used[MAXR
17180 48 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66  HS];   /* True f
17190 6f 72 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d  or each RHS elem
171a0 65 6e 74 20 77 68 69 63 68 20 69 73 20 75 73 65  ent which is use
171b0 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  d */..  for(i=0;
171c0 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
171d0 29 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20  ) used[i] = 0;. 
171e0 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20   lhsused = 0;.. 
171f0 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c   append_str(0,0,
17200 30 2c 30 29 3b 0a 20 20 66 6f 72 28 63 70 3d 72  0,0);.  for(cp=r
17210 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70  p->code; *cp; cp
17220 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 73 61  ++){.    if( isa
17230 6c 70 68 61 28 2a 63 70 29 20 26 26 20 28 63 70  lpha(*cp) && (cp
17240 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20 28 21  ==rp->code || (!
17250 69 73 61 6c 6e 75 6d 28 63 70 5b 2d 31 5d 29 20  isalnum(cp[-1]) 
17260 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27 29 29  && cp[-1]!='_'))
17270 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 73   ){.      char s
17280 61 76 65 64 3b 0a 20 20 20 20 20 20 66 6f 72 28  aved;.      for(
17290 78 70 3d 20 26 63 70 5b 31 5d 3b 20 69 73 61 6c  xp= &cp[1]; isal
172a0 6e 75 6d 28 2a 78 70 29 20 7c 7c 20 2a 78 70 3d  num(*xp) || *xp=
172b0 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20 20 20  ='_'; xp++);.   
172c0 20 20 20 73 61 76 65 64 20 3d 20 2a 78 70 3b 0a     saved = *xp;.
172d0 20 20 20 20 20 20 2a 78 70 20 3d 20 30 3b 0a 20        *xp = 0;. 
172e0 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
172f0 61 6c 69 61 73 20 26 26 20 73 74 72 63 6d 70 28  alias && strcmp(
17300 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  cp,rp->lhsalias)
17310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
17320 70 70 65 6e 64 5f 73 74 72 28 22 79 79 67 6f 74  ppend_str("yygot
17330 6f 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 72  ominor.yy%d",0,r
17340 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 2c 30 29  p->lhs->dtnum,0)
17350 3b 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 78  ;.        cp = x
17360 70 3b 0a 20 20 20 20 20 20 20 20 6c 68 73 75 73  p;.        lhsus
17370 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ed = 1;.      }e
17380 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
17390 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
173a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
173b0 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69    if( rp->rhsali
173c0 61 73 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28  as[i] && strcmp(
173d0 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  cp,rp->rhsalias[
173e0 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])==0 ){.      
173f0 20 20 20 20 20 20 69 66 28 20 63 70 21 3d 72 70        if( cp!=rp
17400 2d 3e 63 6f 64 65 20 26 26 20 63 70 5b 2d 31 5d  ->code && cp[-1]
17410 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20 20 20 20  =='@' ){.       
17420 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
17430 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20   argument is of 
17440 74 68 65 20 66 6f 72 6d 20 40 58 20 74 68 65 6e  the form @X then
17450 20 73 75 62 73 74 69 74 75 74 65 64 0a 20 20 20   substituted.   
17460 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
17470 65 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72 20 6f  e token number o
17480 66 20 58 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c  f X, not the val
17490 75 65 20 6f 66 20 58 20 2a 2f 0a 20 20 20 20 20  ue of X */.     
174a0 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f           append_
174b0 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d  str("yymsp[%d].m
174c0 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d 3e 6e  ajor",-1,i-rp->n
174d0 72 68 73 2b 31 2c 30 29 3b 0a 20 20 20 20 20 20  rhs+1,0);.      
174e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
174f0 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
17500 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72  t symbol *sp = r
17510 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
17520 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 74 6e           int dtn
17530 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  um;.            
17540 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
17550 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
17560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17570 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 73 75 62   dtnum = sp->sub
17580 73 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d 3b 0a 20  sym[0]->dtnum;. 
17590 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
175a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
175b0 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e      dtnum = sp->
175c0 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  dtnum;.         
175d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
175e0 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28       append_str(
175f0 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72  "yymsp[%d].minor
17600 2e 79 79 25 64 22 2c 30 2c 69 2d 72 70 2d 3e 6e  .yy%d",0,i-rp->n
17610 72 68 73 2b 31 2c 20 64 74 6e 75 6d 29 3b 0a 20  rhs+1, dtnum);. 
17620 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
17630 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70           cp = xp
17640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73  ;.            us
17650 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20  ed[i] = 1;.     
17660 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17680 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17690 20 20 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a 20    *xp = saved;. 
176a0 20 20 20 7d 0a 20 20 20 20 61 70 70 65 6e 64 5f     }.    append_
176b0 73 74 72 28 63 70 2c 20 31 2c 20 30 2c 20 30 29  str(cp, 1, 0, 0)
176c0 3b 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f  ;.  } /* End loo
176d0 70 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  p */..  /* Check
176e0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
176f0 65 20 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75  e LHS has been u
17700 73 65 64 20 2a 2f 0a 20 20 69 66 28 20 72 70 2d  sed */.  if( rp-
17710 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 21 6c 68  >lhsalias && !lh
17720 73 75 73 65 64 20 29 7b 0a 20 20 20 20 45 72 72  sused ){.    Err
17730 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
17740 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
17750 65 2c 0a 20 20 20 20 20 20 22 4c 61 62 65 6c 20  e,.      "Label 
17760 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25 73 28  \"%s\" for \"%s(
17770 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75  %s)\" is never u
17780 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72  sed.",.        r
17790 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e  p->lhsalias,rp->
177a0 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68  lhs->name,rp->lh
177b0 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c 65 6d  salias);.    lem
177c0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
177d0 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
177e0 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64  e destructor cod
177f0 65 20 66 6f 72 20 52 48 53 20 73 79 6d 62 6f 6c  e for RHS symbol
17800 73 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  s which are not 
17810 75 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  used in the.  **
17820 20 72 65 64 75 63 65 20 63 6f 64 65 20 2a 2f 0a   reduce code */.
17830 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
17840 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
17850 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61   if( rp->rhsalia
17860 73 5b 69 5d 20 26 26 20 21 75 73 65 64 5b 69 5d  s[i] && !used[i]
17870 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d   ){.      ErrorM
17880 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
17890 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a  e,rp->ruleline,.
178a0 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25          "Label %
178b0 73 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22  s for \"%s(%s)\"
178c0 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22   is never used."
178d0 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68  ,.        rp->rh
178e0 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e 72 68  salias[i],rp->rh
178f0 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 72  s[i]->name,rp->r
17900 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20  hsalias[i]);.   
17910 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
17920 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t++;.    }else i
17930 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
17940 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  i]==0 ){.      i
17950 66 28 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f  f( has_destructo
17960 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d  r(rp->rhs[i],lem
17970 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  p) ){.        ap
17980 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64  pend_str("  yy_d
17990 65 73 74 72 75 63 74 6f 72 28 25 64 2c 26 79 79  estructor(%d,&yy
179a0 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c  msp[%d].minor);\
179b0 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  n", 0,.         
179c0 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e    rp->rhs[i]->in
179d0 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  dex,i-rp->nrhs+1
179e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
179f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 64 65          /* No de
17a00 73 74 72 75 63 74 6f 72 20 64 65 66 69 6e 65 64  structor defined
17a10 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a   for this term *
17a20 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
17a30 20 20 7d 0a 20 20 63 70 20 3d 20 61 70 70 65 6e    }.  cp = appen
17a40 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a  d_str(0,0,0,0);.
17a50 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 53 74 72    rp->code = Str
17a60 73 61 66 65 28 63 70 29 3b 0a 7d 0a 0a 2f 2a 20  safe(cp);.}../* 
17a70 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
17a80 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
17a90 20 77 68 65 6e 20 74 68 65 20 72 75 6c 65 20 22   when the rule "
17aa0 72 70 22 20 69 73 20 72 65 64 75 63 65 64 2e 20  rp" is reduced. 
17ab0 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f   Write.** the co
17ac0 64 65 20 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61  de to "out".  Ma
17ad0 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73  ke sure lineno s
17ae0 74 61 79 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e  tays up-to-date.
17af0 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
17b00 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72   emit_code(out,r
17b10 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46  p,lemp,lineno).F
17b20 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
17b30 20 72 75 6c 65 20 2a 72 70 3b 0a 73 74 72 75 63   rule *rp;.struc
17b40 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69  t lemon *lemp;.i
17b50 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63  nt *lineno;.{. c
17b60 68 61 72 20 2a 63 70 3b 0a 20 69 6e 74 20 6c 69  har *cp;. int li
17b70 6e 65 63 6e 74 20 3d 20 30 3b 0a 0a 20 2f 2a 20  necnt = 0;.. /* 
17b80 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
17b90 20 64 6f 20 74 68 65 20 72 65 64 75 63 65 20 61   do the reduce a
17ba0 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70  ction */. if( rp
17bb0 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 74 70 6c  ->code ){.   tpl
17bc0 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 72 70  t_linedir(out,rp
17bd0 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c  ->line,lemp->fil
17be0 65 6e 61 6d 65 29 3b 0a 20 20 20 66 70 72 69 6e  ename);.   fprin
17bf0 74 66 28 6f 75 74 2c 22 7b 25 73 22 2c 72 70 2d  tf(out,"{%s",rp-
17c00 3e 63 6f 64 65 29 3b 0a 20 20 20 66 6f 72 28 63  >code);.   for(c
17c10 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b  p=rp->code; *cp;
17c20 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 69 66 28   cp++){.     if(
17c30 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e   *cp=='\n' ) lin
17c40 65 63 6e 74 2b 2b 3b 0a 20 20 20 7d 20 2f 2a 20  ecnt++;.   } /* 
17c50 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 28  End loop */.   (
17c60 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b 20  *lineno) += 3 + 
17c70 6c 69 6e 65 63 6e 74 3b 0a 20 20 20 66 70 72 69  linecnt;.   fpri
17c80 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 0a  ntf(out,"}\n");.
17c90 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28     tplt_linedir(
17ca0 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70  out,*lineno,lemp
17cb0 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d 20 2f  ->outname);. } /
17cc0 2a 20 45 6e 64 20 69 66 28 20 72 70 2d 3e 63 6f  * End if( rp->co
17cd0 64 65 20 29 20 2a 2f 0a 0a 20 72 65 74 75 72 6e  de ) */.. return
17ce0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
17cf0 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   the definition 
17d00 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65  of the union use
17d10 64 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  d for the parser
17d20 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a  's data stack..*
17d30 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e  * This union con
17d40 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72  tains fields for
17d50 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
17d60 64 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f  data type for to
17d70 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74  kens.** and nont
17d80 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68  erminals.  In th
17d90 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d  e process of com
17da0 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74  puting and print
17db0 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f  ing this.** unio
17dc0 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20  n, also set the 
17dd0 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f  ".dtnum" field o
17de0 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c  f every terminal
17df0 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
17e00 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76  .** symbol..*/.v
17e10 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  oid print_stack_
17e20 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 70  union(out,lemp,p
17e30 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 0a 46  lineno,mhflag).F
17e40 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20 20  ILE *out;       
17e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17e60 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20  e output stream 
17e70 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  */.struct lemon 
17e80 2a 6c 65 6d 70 3b 20 20 20 20 20 20 20 20 20 2f  *lemp;         /
17e90 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f 20  * The main info 
17ea0 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
17eb0 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 69 6e 74  is parser */.int
17ec0 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20   *plineno;      
17ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
17ee0 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e 65 20  ter to the line 
17ef0 6e 75 6d 62 65 72 20 2a 2f 0a 69 6e 74 20 6d 68  number */.int mh
17f00 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  flag;           
17f10 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
17f20 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65   generating make
17f30 68 65 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a  headers output *
17f40 2f 0a 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  /.{.  int lineno
17f50 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20   = *plineno;    
17f60 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62  /* The line numb
17f70 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  er of the output
17f80 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79 70   */.  char **typ
17f90 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
17fa0 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 20  /* A hash table 
17fb0 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f 0a  of datatypes */.
17fc0 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65 3b    int arraysize;
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17fe0 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70 65  ize of the "type
17ff0 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  s" array */.  in
18000 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20 20  t maxdtlength;  
18010 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
18020 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 79  um length of any
18030 20 22 2e 64 61 74 61 74 79 70 65 22 20 66 69 65   ".datatype" fie
18040 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73  ld. */.  char *s
18050 74 64 64 74 3b 20 20 20 20 20 20 20 20 20 20 20  tddt;           
18060 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69 7a     /* Standardiz
18070 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64 61  ed name for a da
18080 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20  tatype */.  int 
18090 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  i,j;            
180a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
180b0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
180c0 68 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  hash;           
180d0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61 73        /* For has
180e0 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  hing the name of
180f0 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61   a type */.  cha
18100 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
18110 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
18120 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  f the parser */.
18130 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
18140 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 79  nd initialize ty
18150 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63 61  pes[] and alloca
18160 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20 20  te stddt[] */.  
18170 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d 70  arraysize = lemp
18180 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a 20  ->nsymbol * 2;. 
18190 20 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a 2a   types = (char**
181a0 29 6d 61 6c 6c 6f 63 28 20 61 72 72 61 79 73 69  )malloc( arraysi
181b0 7a 65 20 2a 20 73 69 7a 65 6f 66 28 63 68 61 72  ze * sizeof(char
181c0 2a 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  *) );.  for(i=0;
181d0 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b   i<arraysize; i+
181e0 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b  +) types[i] = 0;
181f0 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d  .  maxdtlength =
18200 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   0;.  if( lemp->
18210 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20 6d  vartype ){.    m
18220 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 73 74 72  axdtlength = str
18230 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70  len(lemp->vartyp
18240 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
18250 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
18260 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
18270 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63  t len;.    struc
18280 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
18290 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
182a0 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74  .    if( sp->dat
182b0 61 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69  atype==0 ) conti
182c0 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  nue;.    len = s
182d0 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74 79  trlen(sp->dataty
182e0 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e  pe);.    if( len
182f0 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29 20 6d  >maxdtlength ) m
18300 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e  axdtlength = len
18310 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20 3d 20  ;.  }.  stddt = 
18320 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d  (char*)malloc( m
18330 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31  axdtlength*2 + 1
18340 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73 3d   );.  if( types=
18350 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30 20 29  =0 || stddt==0 )
18360 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
18370 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
18380 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  ory.\n");.    ex
18390 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  it(1);.  }..  /*
183a0 20 42 75 69 6c 64 20 61 20 68 61 73 68 20 74 61   Build a hash ta
183b0 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73  ble of datatypes
183c0 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  . The ".dtnum" f
183d0 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d  ield of each sym
183e0 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c  bol.  ** is fill
183f0 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 20 68  ed in with the h
18400 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31  ash index plus 1
18410 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61  .  A ".dtnum" va
18420 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a  lue of 0 is.  **
18430 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e   used for termin
18440 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20  al symbols.  If 
18450 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66  there is no %def
18460 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65  ault_type define
18470 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73  d then.  ** 0 is
18480 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68   also used as th
18490 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66  e .dtnum value f
184a0 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20  or nonterminals 
184b0 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65  which do not spe
184c0 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61  cify.  ** a data
184d0 74 79 70 65 20 75 73 69 6e 67 20 74 68 65 20 25  type using the %
184e0 74 79 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a  type directive..
184f0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
18500 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
18510 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
18520 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
18530 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
18540 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20  .    char *cp;. 
18550 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d     if( sp==lemp-
18560 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20  >errsym ){.     
18570 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72   sp->dtnum = arr
18580 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20  aysize+1;.      
18590 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
185a0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
185b0 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c  !=NONTERMINAL ||
185c0 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d   (sp->datatype==
185d0 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79  0 && lemp->varty
185e0 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  pe==0) ){.      
185f0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20  sp->dtnum = 0;. 
18600 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
18610 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70     }.    cp = sp
18620 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20  ->datatype;.    
18630 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d  if( cp==0 ) cp =
18640 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a   lemp->vartype;.
18650 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77      j = 0;.    w
18660 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 63  hile( isspace(*c
18670 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77  p) ) cp++;.    w
18680 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64  hile( *cp ) stdd
18690 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a  t[j++] = *cp++;.
186a0 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
186b0 26 20 69 73 73 70 61 63 65 28 73 74 64 64 74 5b  & isspace(stddt[
186c0 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20  j-1]) ) j--;.   
186d0 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20   stddt[j] = 0;. 
186e0 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20     hash = 0;.   
186f0 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b   for(j=0; stddt[
18700 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  j]; j++){.      
18710 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33 20 2b  hash = hash*53 +
18720 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d   stddt[j];.    }
18730 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
18740 68 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  h & 0x7fffffff)%
18750 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20 20 77  arraysize;.    w
18760 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61 73 68  hile( types[hash
18770 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ] ){.      if( s
18780 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61 73 68  trcmp(types[hash
18790 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20  ],stddt)==0 ){. 
187a0 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d         sp->dtnum
187b0 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20   = hash + 1;.   
187c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
187d0 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68 2b 2b    }.      hash++
187e0 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 68  ;.      if( hash
187f0 3e 3d 61 72 72 61 79 73 69 7a 65 20 29 20 68 61  >=arraysize ) ha
18800 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sh = 0;.    }.  
18810 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68    if( types[hash
18820 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70  ]==0 ){.      sp
18830 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b  ->dtnum = hash +
18840 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73 5b   1;.      types[
18850 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d  hash] = (char*)m
18860 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 73 74  alloc( strlen(st
18870 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20  ddt)+1 );.      
18880 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d  if( types[hash]=
18890 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
188a0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75  rintf(stderr,"Ou
188b0 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29  t of memory.\n")
188c0 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31  ;.        exit(1
188d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
188e0 20 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61   strcpy(types[ha
188f0 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20  sh],stddt);.    
18900 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e  }.  }..  /* Prin
18910 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69  t out the defini
18920 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54  tion of YYTOKENT
18930 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54  YPE and YYMINORT
18940 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20  YPE */.  name = 
18950 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d  lemp->name ? lem
18960 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65  p->name : "Parse
18970 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70  ";.  lineno = *p
18980 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68  lineno;.  if( mh
18990 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28  flag ){ fprintf(
189a0 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41  out,"#if INTERFA
189b0 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  CE\n"); lineno++
189c0 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ; }.  fprintf(ou
189d0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b  t,"#define %sTOK
189e0 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d  ENTYPE %s\n",nam
189f0 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b  e,.    lemp->tok
18a00 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b  entype?lemp->tok
18a10 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b  entype:"void*");
18a20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
18a30 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69  ( mhflag ){ fpri
18a40 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c  ntf(out,"#endif\
18a50 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
18a60 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
18a70 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c  typedef union {\
18a80 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
18a90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
18aa0 25 73 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b  %sTOKENTYPE yy0;
18ab0 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
18ac0 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  o++;.  for(i=0; 
18ad0 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b  i<arraysize; i++
18ae0 29 7b 0a 20 20 20 20 69 66 28 20 74 79 70 65 73  ){.    if( types
18af0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
18b00 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e;.    fprintf(o
18b10 75 74 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e  ut,"  %s yy%d;\n
18b20 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b  ",types[i],i+1);
18b30 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
18b40 72 65 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20  ree(types[i]);. 
18b50 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
18b60 2c 22 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22  ,"  int yy%d;\n"
18b70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64  ,lemp->errsym->d
18b80 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  tnum); lineno++;
18b90 0a 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a  .  free(stddt);.
18ba0 20 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20    free(types);. 
18bb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20   fprintf(out,"} 
18bc0 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29  YYMINORTYPE;\n")
18bd0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70  ; lineno++;.  *p
18be0 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b  lineno = lineno;
18bf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18c00 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43   the name of a C
18c10 20 64 61 74 61 74 79 70 65 20 61 62 6c 65 20 74   datatype able t
18c20 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75  o represent valu
18c30 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77  es between.** lw
18c40 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75  r and upr, inclu
18c50 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sive..*/.static 
18c60 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69  const char *mini
18c70 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e  mum_size_type(in
18c80 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29 7b  t lwr, int upr){
18c90 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b  .  if( lwr>=0 ){
18ca0 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35  .    if( upr<=25
18cb0 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  5 ){.      retur
18cc0 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n "unsigned char
18cd0 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
18ce0 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20   upr<65535 ){.  
18cf0 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69      return "unsi
18d00 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b  gned short int";
18d10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18d20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e    return "unsign
18d30 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20  ed int";.    }. 
18d40 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
18d50 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37  -127 && upr<=127
18d60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22   ){.    return "
18d70 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20  signed char";.  
18d80 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
18d90 33 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37  32767 && upr<327
18da0 36 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  67 ){.    return
18db0 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73   "short";.  }els
18dc0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 69  e{.    return "i
18dd0 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nt";.  }.}../*.*
18de0 2a 20 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e  * Each state con
18df0 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74  tains a set of t
18e00 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  oken transaction
18e10 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a   and a set of.**
18e20 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61   nonterminal tra
18e30 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  nsactions.  Each
18e40 20 6f 66 20 74 68 65 73 65 20 73 65 74 73 20 6d   of these sets m
18e50 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  akes an instance
18e60 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
18e70 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  wing structure. 
18e80 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65   An array of the
18e90 73 65 20 73 74 72 75 63 74 75 72 65 73 20 69 73  se structures is
18ea0 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65   used.** to orde
18eb0 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  r the creation o
18ec0 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
18ed0 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
18ee0 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78  le..*/.struct ax
18ef0 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73  set {.  struct s
18f00 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20  tate *stp;   /* 
18f10 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  A pointer to a s
18f20 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tate */.  int is
18f30 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tkn;           /
18f40 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f  * True to use to
18f50 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72  kens.  False for
18f60 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a   non-terminals *
18f70 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b  /.  int nAction;
18f80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18f90 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f  er of actions */
18fa0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .};../*.** Compa
18fb0 72 65 20 74 6f 20 61 78 73 65 74 20 73 74 72 75  re to axset stru
18fc0 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72 74 69  ctures for sorti
18fd0 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
18fe0 74 61 74 69 63 20 69 6e 74 20 61 78 73 65 74 5f  tatic int axset_
18ff0 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f  compare(const vo
19000 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69  id *a, const voi
19010 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 74 20  d *b){.  struct 
19020 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73 74 72  axset *p1 = (str
19030 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a 20 20  uct axset*)a;.  
19040 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 32  struct axset *p2
19050 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74   = (struct axset
19060 2a 29 62 3b 0a 20 20 72 65 74 75 72 6e 20 70 32  *)b;.  return p2
19070 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e  ->nAction - p1->
19080 6e 41 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20 47  nAction;.}../* G
19090 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63 65  enerate C source
190a0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61   code for the pa
190b0 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70  rser */.void Rep
190c0 6f 72 74 54 61 62 6c 65 28 6c 65 6d 70 2c 20 6d  ortTable(lemp, m
190d0 68 66 6c 61 67 29 0a 73 74 72 75 63 74 20 6c 65  hflag).struct le
190e0 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 6d  mon *lemp;.int m
190f0 68 66 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4f 75  hflag;     /* Ou
19100 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61 64  tput in makehead
19110 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74 72  ers format if tr
19120 75 65 20 2a 2f 0a 7b 0a 20 20 46 49 4c 45 20 2a  ue */.{.  FILE *
19130 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72  out, *in;.  char
19140 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b   line[LINESIZE];
19150 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a  .  int  lineno;.
19160 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
19170 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63  stp;.  struct ac
19180 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75  tion *ap;.  stru
19190 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73  ct rule *rp;.  s
191a0 74 72 75 63 74 20 61 63 74 74 61 62 20 2a 70 41  truct acttab *pA
191b0 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  cttab;.  int i, 
191c0 6a 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 6e 61  j, n;.  char *na
191d0 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f  me;.  int mnTknO
191e0 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a  fst, mxTknOfst;.
191f0 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20    int mnNtOfst, 
19200 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75  mxNtOfst;.  stru
19210 63 74 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20  ct axset *ax;.. 
19220 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28   in = tplt_open(
19230 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d  lemp);.  if( in=
19240 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
19250 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  ut = file_open(l
19260 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a  emp,".c","wb");.
19270 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a    if( out==0 ){.
19280 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
19290 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
192a0 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20    lineno = 1;.  
192b0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
192c0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
192d0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
192e0 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65  rate the include
192f0 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f   code, if any */
19300 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
19310 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63  t,lemp,lemp->inc
19320 6c 75 64 65 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75  lude,lemp->inclu
19330 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  deln,&lineno);. 
19340 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
19350 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20     char *name = 
19360 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65  file_makename(le
19370 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66  mp, ".h");.    f
19380 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63  printf(out,"#inc
19390 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  lude \"%s\"\n", 
193a0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
193b0 0a 20 20 20 20 66 72 65 65 28 6e 61 6d 65 29 3b  .    free(name);
193c0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
193d0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
193e0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
193f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64 65 66  /* Generate #def
19400 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b  ines for all tok
19410 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66  ens */.  if( mhf
19420 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20  lag ){.    char 
19430 2a 70 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72  *prefix;.    fpr
19440 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e  intf(out,"#if IN
19450 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e  TERFACE\n"); lin
19460 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c  eno++;.    if( l
19470 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
19480 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70   ) prefix = lemp
19490 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20  ->tokenprefix;. 
194a0 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
194b0 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69             prefi
194c0 78 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28  x = "";.    for(
194d0 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
194e0 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
194f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19500 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
19510 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %2d\n",prefix,l
19520 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
19530 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20  >name,i);.      
19540 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
19550 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19560 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e  "#endif\n"); lin
19570 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
19580 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
19590 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
195a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
195b0 65 20 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f  e the defines */
195c0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
195d0 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45 54 59  #define YYCODETY
195e0 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69  PE %s\n",.    mi
195f0 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
19600 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c  0, lemp->nsymbol
19610 2b 35 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  +5)); lineno++;.
19620 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
19630 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20  define YYNOCODE 
19640 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d  %d\n",lemp->nsym
19650 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b  bol+1);  lineno+
19660 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
19670 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43 54 49  ,"#define YYACTI
19680 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20  ONTYPE %s\n",.  
19690 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
196a0 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74  ype(0, lemp->nst
196b0 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b  ate+lemp->nrule+
196c0 35 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  5));  lineno++;.
196d0 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e    print_stack_un
196e0 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69  ion(out,lemp,&li
196f0 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20  neno,mhflag);.  
19700 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73  if( lemp->stacks
19710 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 61  ize ){.    if( a
19720 74 6f 69 28 6c 65 6d 70 2d 3e 73 74 61 63 6b 73  toi(lemp->stacks
19730 69 7a 65 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20  ize)<=0 ){.     
19740 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
19750 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 49 6c 6c  filename,0,."Ill
19760 65 67 61 6c 20 73 74 61 63 6b 20 73 69 7a 65 3a  egal stack size:
19770 20 5b 25 73 5d 2e 20 20 54 68 65 20 73 74 61 63   [%s].  The stac
19780 6b 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65  k size should be
19790 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
197a0 74 61 6e 74 2e 22 2c 0a 20 20 20 20 20 20 20 20  tant.",.        
197b0 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29  lemp->stacksize)
197c0 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
197d0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
197e0 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20  lemp->stacksize 
197f0 3d 20 22 31 30 30 22 3b 0a 20 20 20 20 7d 0a 20  = "100";.    }. 
19800 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19810 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
19820 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d  EPTH %s\n",lemp-
19830 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69  >stacksize);  li
19840 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  neno++;.  }else{
19850 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
19860 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43  ,"#define YYSTAC
19870 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20  KDEPTH 100\n"); 
19880 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
19890 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
198a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
198b0 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
198c0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
198d0 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e  .  name = lemp->
198e0 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d  name ? lemp->nam
198f0 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69  e : "Parse";.  i
19900 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20  f( lemp->arg && 
19910 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a  lemp->arg[0] ){.
19920 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
19930 20 3d 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e   = strlen(lemp->
19940 61 72 67 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  arg);.    while(
19950 20 69 3e 3d 31 20 26 26 20 69 73 73 70 61 63 65   i>=1 && isspace
19960 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29  (lemp->arg[i-1])
19970 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c   ) i--;.    whil
19980 65 28 20 69 3e 3d 31 20 26 26 20 28 69 73 61 6c  e( i>=1 && (isal
19990 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d  num(lemp->arg[i-
199a0 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67  1]) || lemp->arg
199b0 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d  [i-1]=='_') ) i-
199c0 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  -;.    fprintf(o
199d0 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
199e0 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e  G_SDECL %s;\n",n
199f0 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20  ame,lemp->arg); 
19a00 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
19a10 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
19a20 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c 20  ine %sARG_PDECL 
19a30 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70  ,%s\n",name,lemp
19a40 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ->arg);  lineno+
19a50 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
19a60 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
19a70 47 5f 46 45 54 43 48 20 25 73 20 3d 20 79 79 70  G_FETCH %s = yyp
19a80 50 61 72 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20  Parser->%s\n",. 
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26  name,lemp->arg,&
19ab0 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20  lemp->arg[i]);  
19ac0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
19ad0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
19ae0 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45 20 79  ne %sARG_STORE y
19af0 79 70 50 61 72 73 65 72 2d 3e 25 73 20 3d 20 25  ypParser->%s = %
19b00 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
19b10 20 20 20 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d         name,&lem
19b20 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d  p->arg[i],&lemp-
19b30 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >arg[i]);  linen
19b40 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o++;.  }else{.  
19b50 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
19b60 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45  define %sARG_SDE
19b70 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69  CL\n",name);  li
19b80 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
19b90 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
19ba0 20 25 73 41 52 47 5f 50 44 45 43 4c 5c 6e 22 2c   %sARG_PDECL\n",
19bb0 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  name);  lineno++
19bc0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
19bd0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
19be0 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b  _FETCH\n",name);
19bf0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
19c00 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
19c10 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45 5c  ine %sARG_STORE\
19c20 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
19c30 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68  ++;.  }.  if( mh
19c40 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69  flag ){.    fpri
19c50 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c  ntf(out,"#endif\
19c60 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
19c70 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
19c80 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 53 54 41  ,"#define YYNSTA
19c90 54 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e  TE %d\n",lemp->n
19ca0 73 74 61 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  state);  lineno+
19cb0 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
19cc0 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 52 55 4c  ,"#define YYNRUL
19cd0 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72  E %d\n",lemp->nr
19ce0 75 6c 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ule);  lineno++;
19cf0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19d00 23 64 65 66 69 6e 65 20 59 59 45 52 52 4f 52 53  #define YYERRORS
19d10 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70  YMBOL %d\n",lemp
19d20 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29  ->errsym->index)
19d30 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ;  lineno++;.  f
19d40 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
19d50 69 6e 65 20 59 59 45 52 52 53 59 4d 44 54 20 79  ine YYERRSYMDT y
19d60 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72  y%d\n",lemp->err
19d70 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 20 6c 69  sym->dtnum);  li
19d80 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65  neno++;.  if( le
19d90 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b  mp->has_fallback
19da0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
19db0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46  out,"#define YYF
19dc0 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20  ALLBACK 1\n");  
19dd0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
19de0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
19df0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
19e00 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
19e10 72 61 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20  rate the action 
19e20 74 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73  table and its as
19e30 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20  sociates:.  **. 
19e40 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   **  yy_action[]
19e50 20 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65          A single
19e60 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
19e70 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20  g all actions.. 
19e80 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61   **  yy_lookahea
19e90 64 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20  d[]     A table 
19ea0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
19eb0 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63  ookahead for eac
19ec0 68 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20  h entry in.  ** 
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ee0 20 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20      yy_action.  
19ef0 55 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 68  Used to detect h
19f00 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a  ash collisions..
19f10 20 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f    **  yy_shift_o
19f20 66 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63  fst[]    For eac
19f30 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66  h state, the off
19f40 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69  set into yy_acti
19f50 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20  on for.  **     
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f70 73 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61  shifting termina
19f80 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64  ls..  **  yy_red
19f90 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72  uce_ofst[]   For
19fa0 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65   each state, the
19fb0 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f   offset into yy_
19fc0 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20  action for.  ** 
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fe0 20 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e      shifting non
19ff0 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72  -terminals after
1a000 20 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20   a reduce..  ** 
1a010 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20   yy_default[]   
1a020 20 20 20 20 44 65 66 61 75 6c 74 20 61 63 74 69      Default acti
1a030 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61 74  on for each stat
1a040 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  e..  */..  /* Co
1a050 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
1a060 73 20 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73 20  s on all states 
1a070 61 6e 64 20 63 6f 75 6e 74 20 74 68 65 6d 20 75  and count them u
1a080 70 20 2a 2f 0a 20 20 61 78 20 3d 20 6d 61 6c 6c  p */.  ax = mall
1a090 6f 63 28 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d  oc( sizeof(ax[0]
1a0a0 29 2a 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  )*lemp->nstate*2
1a0b0 20 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20   );.  if( ax==0 
1a0c0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
1a0d0 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61  tderr,"malloc fa
1a0e0 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78  iled\n");.    ex
1a0f0 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  it(1);.  }.  for
1a100 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1a110 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
1a120 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
1a130 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a  ed[i];.    ax[i*
1a140 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20  2].stp = stp;.  
1a150 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20    ax[i*2].isTkn 
1a160 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  = 1;.    ax[i*2]
1a170 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e  .nAction = stp->
1a180 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b  nTknAct;.    ax[
1a190 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70  i*2+1].stp = stp
1a1a0 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
1a1b0 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61  isTkn = 0;.    a
1a1c0 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e  x[i*2+1].nAction
1a1d0 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a   = stp->nNtAct;.
1a1e0 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20    }.  mxTknOfst 
1a1f0 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b  = mnTknOfst = 0;
1a200 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e  .  mxNtOfst = mn
1a210 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20 2f  NtOfst = 0;..  /
1a220 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63  * Compute the ac
1a230 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20  tion table.  In 
1a240 6f 72 64 65 72 20 74 6f 20 74 72 79 20 74 6f 20  order to try to 
1a250 6b 65 65 70 20 74 68 65 20 73 69 7a 65 20 6f 66  keep the size of
1a260 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f 6e   the.  ** action
1a270 20 74 61 62 6c 65 20 74 6f 20 61 20 6d 69 6e 69   table to a mini
1a280 6d 75 6d 2c 20 74 68 65 20 68 65 75 72 69 73 74  mum, the heurist
1a290 69 63 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68  ic of placing th
1a2a0 65 20 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e  e largest action
1a2b0 0a 20 20 2a 2a 20 73 65 74 73 20 66 69 72 73 74  .  ** sets first
1a2c0 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2f 0a 20   is used..  */. 
1a2d0 20 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d   qsort(ax, lemp-
1a2e0 3e 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f  >nstate*2, sizeo
1a2f0 66 28 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f  f(ax[0]), axset_
1a300 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74  compare);.  pAct
1a310 74 61 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c  tab = acttab_all
1a320 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  oc();.  for(i=0;
1a330 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a   i<lemp->nstate*
1a340 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69  2 && ax[i].nActi
1a350 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  on>0; i++){.    
1a360 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b  stp = ax[i].stp;
1a370 0a 20 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69  .    if( ax[i].i
1a380 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f  sTkn ){.      fo
1a390 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1a3a0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1a3b0 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69          int acti
1a3c0 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
1a3d0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c  ap->sp->index>=l
1a3e0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
1a3f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1a400 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70     action = comp
1a410 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
1a420 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66   ap);.        if
1a430 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e  ( action<0 ) con
1a440 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1a450 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63  cttab_action(pAc
1a460 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e  ttab, ap->sp->in
1a470 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  dex, action);.  
1a480 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d      }.      stp-
1a490 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74  >iTknOfst = actt
1a4a0 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61  ab_insert(pActta
1a4b0 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  b);.      if( st
1a4c0 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b  p->iTknOfst<mnTk
1a4d0 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73  nOfst ) mnTknOfs
1a4e0 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  t = stp->iTknOfs
1a4f0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  t;.      if( stp
1a500 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e  ->iTknOfst>mxTkn
1a510 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74  Ofst ) mxTknOfst
1a520 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74   = stp->iTknOfst
1a530 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a540 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1a550 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1a560 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  xt){.        int
1a570 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20   action;.       
1a580 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
1a590 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  ex<lemp->ntermin
1a5a0 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  al ) continue;. 
1a5b0 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73         if( ap->s
1a5c0 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e  p->index==lemp->
1a5d0 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e  nsymbol ) contin
1a5e0 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69  ue;.        acti
1a5f0 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74  on = compute_act
1a600 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20  ion(lemp, ap);. 
1a610 20 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f         if( actio
1a620 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  n<0 ) continue;.
1a630 20 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61          acttab_a
1a640 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61  ction(pActtab, a
1a650 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63  p->sp->index, ac
1a660 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tion);.      }. 
1a670 20 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73       stp->iNtOfs
1a680 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72  t = acttab_inser
1a690 74 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20  t(pActtab);.    
1a6a0 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66    if( stp->iNtOf
1a6b0 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e  st<mnNtOfst ) mn
1a6c0 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e  NtOfst = stp->iN
1a6d0 74 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28  tOfst;.      if(
1a6e0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78   stp->iNtOfst>mx
1a6f0 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73  NtOfst ) mxNtOfs
1a700 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
1a710 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72  ;.    }.  }.  fr
1a720 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75  ee(ax);..  /* Ou
1a730 74 70 75 74 20 74 68 65 20 79 79 5f 61 63 74 69  tput the yy_acti
1a740 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  on table */.  fp
1a750 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69  rintf(out,"stati
1a760 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e  c const YYACTION
1a770 54 59 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d  TYPE yy_action[]
1a780 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   = {\n"); lineno
1a790 2b 2b 3b 0a 20 20 6e 20 3d 20 61 63 74 74 61 62  ++;.  n = acttab
1a7a0 5f 73 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a  _size(pActtab);.
1a7b0 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
1a7c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1a7d0 61 63 74 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f  action = acttab_
1a7e0 79 79 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62  yyaction(pActtab
1a7f0 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 61 63  , i);.    if( ac
1a800 74 69 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20  tion<0 ) action 
1a810 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  = lemp->nsymbol 
1a820 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20  + lemp->nrule + 
1a830 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20  2;.    if( j==0 
1a840 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20  ) fprintf(out," 
1a850 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b  /* %5d */ ", i);
1a860 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a870 2c 20 22 20 25 34 64 2c 22 2c 20 61 63 74 69 6f  , " %4d,", actio
1a880 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  n);.    if( j==9
1a890 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
1a8a0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a8b0 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
1a8c0 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
1a8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a8e0 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
1a8f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1a900 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1a910 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
1a920 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74  e yy_lookahead t
1a930 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
1a940 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f  f(out,"static co
1a950 6e 73 74 20 59 59 43 4f 44 45 54 59 50 45 20 79  nst YYCODETYPE y
1a960 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20  y_lookahead[] = 
1a970 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
1a980 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1a990 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
1a9a0 20 6c 61 20 3d 20 61 63 74 74 61 62 5f 79 79 6c   la = acttab_yyl
1a9b0 6f 6f 6b 61 68 65 61 64 28 70 41 63 74 74 61 62  ookahead(pActtab
1a9c0 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 6c 61  , i);.    if( la
1a9d0 3c 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e  <0 ) la = lemp->
1a9e0 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28  nsymbol;.    if(
1a9f0 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28   j==0 ) fprintf(
1aa00 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20  out," /* %5d */ 
1aa10 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e  ", i);.    fprin
1aa20 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c  tf(out, " %4d,",
1aa30 20 6c 61 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d   la);.    if( j=
1aa40 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1aa50 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1aa60 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1aa70 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1aa80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1aa90 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1aaa0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1aab0 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1aac0 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1aad0 74 68 65 20 79 79 5f 73 68 69 66 74 5f 6f 66 73  the yy_shift_ofs
1aae0 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  t[] table */.  f
1aaf0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1ab00 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 55 53  fine YY_SHIFT_US
1ab10 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20  E_DFLT (%d)\n", 
1ab20 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c 69  mnTknOfst-1); li
1ab30 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65  neno++;.  n = le
1ab40 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68  mp->nstate;.  wh
1ab50 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70  ile( n>0 && lemp
1ab60 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69  ->sorted[n-1]->i
1ab70 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  TknOfst==NO_OFFS
1ab80 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69  ET ) n--;.  fpri
1ab90 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1aba0 65 20 59 59 5f 53 48 49 46 54 5f 4d 41 58 20 25  e YY_SHIFT_MAX %
1abb0 64 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65  d\n", n-1); line
1abc0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1abd0 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e  out, "static con
1abe0 73 74 20 25 73 20 79 79 5f 73 68 69 66 74 5f 6f  st %s yy_shift_o
1abf0 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20  fst[] = {\n", . 
1ac00 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d           minimum
1ac10 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e  _size_type(mnTkn
1ac20 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73  Ofst-1, mxTknOfs
1ac30 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  t)); lineno++;. 
1ac40 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1ac50 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
1ac60 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c  fst;.    stp = l
1ac70 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1ac80 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e      ofst = stp->
1ac90 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66  iTknOfst;.    if
1aca0 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45  ( ofst==NO_OFFSE
1acb0 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e  T ) ofst = mnTkn
1acc0 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66  Ofst - 1;.    if
1acd0 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
1ace0 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
1acf0 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
1ad00 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
1ad10 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
1ad20 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20   j==9 || i==n-1 
1ad30 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1ad40 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e  (out, "\n"); lin
1ad50 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d  eno++;.      j =
1ad60 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1ad70 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
1ad80 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1ad90 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65  t, "};\n"); line
1ada0 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  no++;..  /* Outp
1adb0 75 74 20 74 68 65 20 79 79 5f 72 65 64 75 63 65  ut the yy_reduce
1adc0 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f  _ofst[] table */
1add0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1ade0 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55  "#define YY_REDU
1adf0 43 45 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29  CE_USE_DFLT (%d)
1ae00 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31 29  \n", mnNtOfst-1)
1ae10 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20  ; lineno++;.  n 
1ae20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a  = lemp->nstate;.
1ae30 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
1ae40 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31  lemp->sorted[n-1
1ae50 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f  ]->iNtOfst==NO_O
1ae60 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66  FFSET ) n--;.  f
1ae70 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1ae80 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 4d  fine YY_REDUCE_M
1ae90 41 58 20 25 64 5c 6e 22 2c 20 6e 2d 31 29 3b 20  AX %d\n", n-1); 
1aea0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1aeb0 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63  ntf(out, "static
1aec0 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 72 65 64   const %s yy_red
1aed0 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e  uce_ofst[] = {\n
1aee0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6d 69  ", .          mi
1aef0 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
1af00 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d 78 4e 74  mnNtOfst-1, mxNt
1af10 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  Ofst)); lineno++
1af20 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
1af30 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
1af40 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20  t ofst;.    stp 
1af50 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1af60 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74  ];.    ofst = st
1af70 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20  p->iNtOfst;.    
1af80 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46  if( ofst==NO_OFF
1af90 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e  SET ) ofst = mnN
1afa0 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20 69  tOfst - 1;.    i
1afb0 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
1afc0 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
1afd0 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
1afe0 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
1aff0 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  ", ofst);.    if
1b000 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
1b010 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1b020 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
1b030 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
1b040 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1b050 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
1b060 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
1b070 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
1b080 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74  eno++;..  /* Out
1b090 70 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  put the default 
1b0a0 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a  action table */.
1b0b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b0c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41  static const YYA
1b0d0 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 64 65 66  CTIONTYPE yy_def
1b0e0 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20  ault[] = {\n"); 
1b0f0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20  lineno++;.  n = 
1b100 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20  lemp->nstate;.  
1b110 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1b120 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
1b130 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
1b140 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
1b150 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1b160 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
1b170 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1b180 22 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44  " %4d,", stp->iD
1b190 66 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  flt);.    if( j=
1b1a0 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1b1b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1b1c0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1b1d0 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1b1e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b1f0 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1b200 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1b210 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1b220 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  +;.  tplt_xfer(l
1b230 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1b240 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1b250 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61   Generate the ta
1b260 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20  ble of fallback 
1b270 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  tokens..  */.  i
1b280 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c  f( lemp->has_fal
1b290 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  lback ){.    for
1b2a0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=0; i<lemp->nt
1b2b0 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20  erminal; i++){. 
1b2c0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1b2d0 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  ol *p = lemp->sy
1b2e0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20  mbols[i];.      
1b2f0 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d  if( p->fallback=
1b300 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
1b310 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
1b320 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e  0,  /* %10s => n
1b330 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d  othing */\n", p-
1b340 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  >name);.      }e
1b350 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
1b360 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64  intf(out, "  %3d
1b370 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73  ,  /* %10s => %s
1b380 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62   */\n", p->fallb
1b390 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20  ack->index,.    
1b3a0 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70        p->name, p
1b3b0 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65  ->fallback->name
1b3c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b3d0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
1b3e0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1b3f0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c  (lemp->name, in,
1b400 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a   out, &lineno);.
1b410 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1b420 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1b430 67 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e  g the symbolic n
1b440 61 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d  ame of every sym
1b450 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  bol.  */.  for(i
1b460 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1b470 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
1b480 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25  printf(line,"\"%
1b490 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62  s\",",lemp->symb
1b4a0 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[i]->name);. 
1b4b0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b4c0 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a    %-15s",line);.
1b4d0 20 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33      if( (i&3)==3
1b4e0 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
1b4f0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1b500 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26   }.  }.  if( (i&
1b510 33 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66  3)!=0 ){ fprintf
1b520 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65  (out,"\n"); line
1b530 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78  no++; }.  tplt_x
1b540 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1b550 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1b560 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1b570 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1b580 67 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20  g a text string 
1b590 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65  that describes e
1b5a0 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69  very.  ** rule i
1b5b0 6e 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f  n the rule set o
1b5c0 66 20 74 68 65 20 67 72 61 6d 6d 65 72 2e 20 20  f the grammer.  
1b5d0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1b5e0 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68   is used.  ** wh
1b5f0 65 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43  en tracing REDUC
1b600 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  E actions..  */.
1b610 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65    for(i=0, rp=le
1b620 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1b630 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b  =rp->next, i++){
1b640 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d  .    assert( rp-
1b650 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20  >index==i );.   
1b660 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1b670 2a 20 25 33 64 20 2a 2f 20 5c 22 25 73 20 3a 3a  * %3d */ \"%s ::
1b680 3d 22 2c 20 69 2c 20 72 70 2d 3e 6c 68 73 2d 3e  =", i, rp->lhs->
1b690 6e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a  name);.    for(j
1b6a0 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; j<rp->nrhs; 
1b6b0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  j++){.      stru
1b6c0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1b6d0 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20  rp->rhs[j];.    
1b6e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1b6f0 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
1b700 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79        if( sp->ty
1b710 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
1b720 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  L ){.        int
1b730 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   k;.        for(
1b740 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73  k=1; k<sp->nsubs
1b750 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ym; k++){.      
1b760 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b770 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d  "|%s",sp->subsym
1b780 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [k]->name);.    
1b790 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b7a0 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
1b7b0 6f 75 74 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69  out,"\",\n"); li
1b7c0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
1b7d0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1b7e0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1b7f0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1b800 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1b810 65 63 75 74 65 73 20 65 76 65 72 79 20 74 69 6d  ecutes every tim
1b820 65 20 61 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f  e a symbol is po
1b830 70 70 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  pped from.  ** t
1b840 68 65 20 73 74 61 63 6b 20 77 68 69 6c 65 20 70  he stack while p
1b850 72 6f 63 65 73 73 69 6e 67 20 65 72 72 6f 72 73  rocessing errors
1b860 20 6f 72 20 77 68 69 6c 65 20 64 65 73 74 72 6f   or while destro
1b870 79 69 6e 67 20 74 68 65 20 70 61 72 73 65 72 2e  ying the parser.
1b880 20 0a 20 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72   .  ** (In other
1b890 20 77 6f 72 64 73 2c 20 67 65 6e 65 72 61 74 65   words, generate
1b8a0 20 74 68 65 20 25 64 65 73 74 72 75 63 74 6f 72   the %destructor
1b8b0 20 61 63 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20   actions).  */. 
1b8c0 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e   if( lemp->token
1b8d0 64 65 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  dest ){.    for(
1b8e0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
1b8f0 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
1b900 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1b910 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
1b920 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ols[i];.      if
1b930 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74  ( sp==0 || sp->t
1b940 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20  ype!=TERMINAL ) 
1b950 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1b960 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1b970 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d   case %d:\n",sp-
1b980 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
1b990 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  +;.    }.    for
1b9a0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1b9b0 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73  ymbol && lemp->s
1b9c0 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21  ymbols[i]->type!
1b9d0 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b  =TERMINAL; i++);
1b9e0 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d  .    if( i<lemp-
1b9f0 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20  >nsymbol ){.    
1ba00 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
1ba10 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d  r_code(out,lemp-
1ba20 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70  >symbols[i],lemp
1ba30 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ,&lineno);.     
1ba40 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1ba50 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
1ba60 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1ba70 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
1ba80 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73  vardest ){.    s
1ba90 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66  truct symbol *df
1baa0 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 66  lt_sp = 0;.    f
1bab0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1bac0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1bad0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1bae0 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1baf0 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
1bb00 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1bb10 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
1bb20 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70   ||.          sp
1bb30 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70  ->index<=0 || sp
1bb40 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20  ->destructor!=0 
1bb50 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1bb60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1bb70 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73     case %d:\n",s
1bb80 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e  p->index); linen
1bb90 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f  o++;.      dflt_
1bba0 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20  sp = sp;.    }. 
1bbb0 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d     if( dflt_sp!=
1bbc0 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f  0 ){.      emit_
1bbd0 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
1bbe0 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70  out,dflt_sp,lemp
1bbf0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ,&lineno);.     
1bc00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1bc10 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
1bc20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1bc30 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1bc40 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
1bc50 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
1bc60 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
1bc70 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
1bc80 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
1bc90 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
1bca0 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72  NAL || sp->destr
1bcb0 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69  uctor==0 ) conti
1bcc0 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  nue;.    fprintf
1bcd0 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
1bce0 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29  d:\n",sp->index)
1bcf0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20  ; lineno++;..   
1bd00 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c   /* Combine dupl
1bd10 69 63 61 74 65 20 64 65 73 74 72 75 63 74 6f 72  icate destructor
1bd20 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
1bd30 63 61 73 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  case */.    for(
1bd40 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e  j=i+1; j<lemp->n
1bd50 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  symbol; j++){.  
1bd60 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1bd70 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73  l *sp2 = lemp->s
1bd80 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20  ymbols[j];.     
1bd90 20 69 66 28 20 73 70 32 20 26 26 20 73 70 32 2d   if( sp2 && sp2-
1bda0 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20  >type!=TERMINAL 
1bdb0 26 26 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74  && sp2->destruct
1bdc0 6f 72 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  or.          && 
1bdd0 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e  sp2->dtnum==sp->
1bde0 64 74 6e 75 6d 0a 20 20 20 20 20 20 20 20 20 20  dtnum.          
1bdf0 26 26 20 73 74 72 63 6d 70 28 73 70 2d 3e 64 65  && strcmp(sp->de
1be00 73 74 72 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65  structor,sp2->de
1be10 73 74 72 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a  structor)==0 ){.
1be20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
1be30 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
1be40 64 3a 5c 6e 22 2c 73 70 32 2d 3e 69 6e 64 65 78  d:\n",sp2->index
1be50 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1be60 20 20 20 20 20 20 73 70 32 2d 3e 64 65 73 74 72        sp2->destr
1be70 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  uctor = 0;.     
1be80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6d   }.    }..    em
1be90 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
1bea0 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d  de(out,lemp->sym
1beb0 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69  bols[i],lemp,&li
1bec0 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e  neno);.    fprin
1bed0 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72  tf(out,"      br
1bee0 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
1bef0 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
1bf00 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1bf10 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1bf20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1bf30 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1bf40 65 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  es whenever the 
1bf50 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65  parser stack ove
1bf60 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74  rflows */.  tplt
1bf70 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1bf80 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 6c  lemp->overflow,l
1bf90 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 2c  emp->overflowln,
1bfa0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
1bfb0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1bfc0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1bfd0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1bfe0 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75   the table of ru
1bff0 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a  le information .
1c000 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20    **.  ** Note: 
1c010 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
1c020 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
1c030 61 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d  at rules are num
1c040 62 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74  ber.  ** sequent
1c050 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20  ually beginning 
1c060 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66  with 0..  */.  f
1c070 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
1c080 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
1c090 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  t){.    fprintf(
1c0a0 6f 75 74 2c 22 20 20 7b 20 25 64 2c 20 25 64 20  out,"  { %d, %d 
1c0b0 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69  },\n",rp->lhs->i
1c0c0 6e 64 65 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20  ndex,rp->nrhs); 
1c0d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1c0e0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1c0f0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1c100 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1c110 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1c120 65 78 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67  execution during
1c130 20 65 61 63 68 20 52 45 44 55 43 45 20 61 63 74   each REDUCE act
1c140 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ion */.  for(rp=
1c150 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
1c160 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
1c170 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29    if( rp->code )
1c180 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28   translate_code(
1c190 6c 65 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20  lemp, rp);.  }. 
1c1a0 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
1c1b0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1c1c0 65 78 74 29 7b 0a 20 20 20 20 73 74 72 75 63 74  ext){.    struct
1c1d0 20 72 75 6c 65 20 2a 72 70 32 3b 0a 20 20 20 20   rule *rp2;.    
1c1e0 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
1c1f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1c200 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1c210 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 72     case %d:\n",r
1c220 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e  p->index); linen
1c230 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70 32  o++;.    for(rp2
1c240 3d 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20  =rp->next; rp2; 
1c250 72 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a  rp2=rp2->next){.
1c260 20 20 20 20 20 20 69 66 28 20 72 70 32 2d 3e 63        if( rp2->c
1c270 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 29 7b  ode==rp->code ){
1c280 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1c290 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73 65  (out,"      case
1c2a0 20 25 64 3a 5c 6e 22 2c 72 70 32 2d 3e 69 6e 64   %d:\n",rp2->ind
1c2b0 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ex); lineno++;. 
1c2c0 20 20 20 20 20 20 20 72 70 32 2d 3e 63 6f 64 65         rp2->code
1c2d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1c2e0 20 20 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64    }.    emit_cod
1c2f0 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c  e(out,rp,lemp,&l
1c300 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69  ineno);.    fpri
1c310 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20  ntf(out,"       
1c320 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1c330 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1c340 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1c350 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1c360 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1c370 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1c380 63 75 74 65 73 20 69 66 20 61 20 70 61 72 73 65  cutes if a parse
1c390 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74   fails */.  tplt
1c3a0 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1c3b0 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 6c 65  lemp->failure,le
1c3c0 6d 70 2d 3e 66 61 69 6c 75 72 65 6c 6e 2c 26 6c  mp->failureln,&l
1c3d0 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
1c3e0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1c3f0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1c400 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1c410 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1c420 65 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78  es when a syntax
1c430 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f   error occurs */
1c440 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1c450 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72  t,lemp,lemp->err
1c460 6f 72 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 6c 6e  or,lemp->errorln
1c470 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
1c480 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1c490 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1c4a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1c4b0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1c4c0 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 70  cutes when the p
1c4d0 61 72 73 65 72 20 61 63 63 65 70 74 73 20 69 74  arser accepts it
1c4e0 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c  s input */.  tpl
1c4f0 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1c500 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c 6c 65  ,lemp->accept,le
1c510 6d 70 2d 3e 61 63 63 65 70 74 6c 6e 2c 26 6c 69  mp->acceptln,&li
1c520 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1c530 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1c540 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1c550 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20    /* Append any 
1c560 61 64 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68  addition code th
1c570 65 20 75 73 65 72 20 64 65 73 69 72 65 73 20 2a  e user desires *
1c580 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
1c590 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78  ut,lemp,lemp->ex
1c5a0 74 72 61 63 6f 64 65 2c 6c 65 6d 70 2d 3e 65 78  tracode,lemp->ex
1c5b0 74 72 61 63 6f 64 65 6c 6e 2c 26 6c 69 6e 65 6e  tracodeln,&linen
1c5c0 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e  o);..  fclose(in
1c5d0 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29  );.  fclose(out)
1c5e0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
1c5f0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 65 61  * Generate a hea
1c600 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65  der file for the
1c610 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20   parser */.void 
1c620 52 65 70 6f 72 74 48 65 61 64 65 72 28 6c 65 6d  ReportHeader(lem
1c630 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
1c640 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c 45 20  *lemp;.{.  FILE 
1c650 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61  *out, *in;.  cha
1c660 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61  r *prefix;.  cha
1c670 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
1c680 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65 72 6e  ;.  char pattern
1c690 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LINESIZE];.  in
1c6a0 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70  t i;..  if( lemp
1c6b0 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20  ->tokenprefix ) 
1c6c0 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74  prefix = lemp->t
1c6d0 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c  okenprefix;.  el
1c6e0 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
1c6f0 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22        prefix = "
1c700 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f  ";.  in = file_o
1c710 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72  pen(lemp,".h","r
1c720 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b  b");.  if( in ){
1c730 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
1c740 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
1c750 26 26 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49  && fgets(line,LI
1c760 4e 45 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29  NESIZE,in); i++)
1c770 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  {.      sprintf(
1c780 70 61 74 74 65 72 6e 2c 22 23 64 65 66 69 6e 65  pattern,"#define
1c790 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c   %s%-30s %2d\n",
1c7a0 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d  prefix,lemp->sym
1c7b0 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29  bols[i]->name,i)
1c7c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  ;.      if( strc
1c7d0 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29  mp(line,pattern)
1c7e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
1c7f0 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
1c800 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d      if( i==lemp-
1c810 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20  >nterminal ){.  
1c820 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65      /* No change
1c830 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 44   in the file.  D
1c840 6f 6e 27 74 20 72 65 77 72 69 74 65 20 69 74 2e  on't rewrite it.
1c850 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1c860 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75  ;.    }.  }.  ou
1c870 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  t = file_open(le
1c880 6d 70 2c 22 2e 68 22 2c 22 77 62 22 29 3b 0a 20  mp,".h","wb");. 
1c890 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
1c8a0 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1c8b0 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
1c8c0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1c8d0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
1c8e0 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
1c8f0 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
1c900 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
1c910 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f    }.    fclose(o
1c920 75 74 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74  ut);  .  }.  ret
1c930 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63  urn;.}../* Reduc
1c940 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1c950 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c  e action tables,
1c960 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79   if possible, by
1c970 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f   making use.** o
1c980 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a  f defaults..**.*
1c990 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
1c9a0 6e 2c 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d  n, we take the m
1c9b0 6f 73 74 20 66 72 65 71 75 65 6e 74 20 52 45 44  ost frequent RED
1c9c0 55 43 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d  UCE action and m
1c9d0 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65  ake.** it the de
1c9e0 66 61 75 6c 74 2e 0a 2a 2f 0a 76 6f 69 64 20 43  fault..*/.void C
1c9f0 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 6c 65  ompressTables(le
1ca00 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
1ca10 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
1ca20 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1ca30 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1ca40 61 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72 75  ap, *ap2;.  stru
1ca50 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70  ct rule *rp, *rp
1ca60 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74  2, *rbest;.  int
1ca70 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74   nbest, n;.  int
1ca80 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   i;..  for(i=0; 
1ca90 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
1caa0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
1cab0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
1cac0 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a  .    nbest = 0;.
1cad0 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a 0a      rbest = 0;..
1cae0 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
1caf0 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
1cb00 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1cb10 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  ap->type!=REDUCE
1cb20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1cb30 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70     rp = ap->x.rp
1cb40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d  ;.      if( rp==
1cb50 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65  rbest ) continue
1cb60 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20  ;.      n = 1;. 
1cb70 20 20 20 20 20 66 6f 72 28 61 70 32 3d 61 70 2d       for(ap2=ap-
1cb80 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61 70 32 3d  >next; ap2; ap2=
1cb90 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  ap2->next){.    
1cba0 20 20 20 20 69 66 28 20 61 70 32 2d 3e 74 79 70      if( ap2->typ
1cbb0 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74  e!=REDUCE ) cont
1cbc0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 72 70  inue;.        rp
1cbd0 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a 20  2 = ap2->x.rp;. 
1cbe0 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d         if( rp2==
1cbf0 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65  rbest ) continue
1cc00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
1cc10 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20 20  2==rp ) n++;.   
1cc20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
1cc30 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20 20 20 20  >nbest ){.      
1cc40 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20 20    nbest = n;.   
1cc50 20 20 20 20 20 72 62 65 73 74 20 3d 20 72 70 3b       rbest = rp;
1cc60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cc70 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d  .    /* Do not m
1cc80 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20 69 66  ake a default if
1cc90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1cca0 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c 74 0a  ules to default.
1ccb0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74      ** is not at
1ccc0 20 6c 65 61 73 74 20 31 20 2a 2f 0a 20 20 20 20   least 1 */.    
1ccd0 69 66 28 20 6e 62 65 73 74 3c 31 20 29 20 63 6f  if( nbest<1 ) co
1cce0 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a  ntinue;...    /*
1ccf0 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e   Combine matchin
1cd00 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73  g REDUCE actions
1cd10 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64   into a single d
1cd20 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f  efault */.    fo
1cd30 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1cd40 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1cd50 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1cd60 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
1cd70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
1cd80 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1cd90 20 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20   assert( ap );. 
1cda0 20 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62     ap->sp = Symb
1cdb0 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74  ol_new("{default
1cdc0 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  }");.    for(ap=
1cdd0 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70  ap->next; ap; ap
1cde0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1cdf0 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
1ce00 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e  REDUCE && ap->x.
1ce10 72 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e  rp==rbest ) ap->
1ce20 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b  type = NOT_USED;
1ce30 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e  .    }.    stp->
1ce40 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74  ap = Action_sort
1ce50 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d  (stp->ap);.  }.}
1ce60 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
1ce70 20 74 77 6f 20 73 74 61 74 65 73 20 66 6f 72 20   two states for 
1ce80 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
1ce90 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 73  .  The smaller s
1cea0 74 61 74 65 20 69 73 20 74 68 65 0a 2a 2a 20 6f  tate is the.** o
1ceb0 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74  ne with the most
1cec0 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63   non-terminal ac
1ced0 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 79 20  tions.  If they 
1cee0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
1cef0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74  mber.** of non-t
1cf00 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2c  erminal actions,
1cf10 20 74 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c 65   then the smalle
1cf20 72 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  r is the one wit
1cf30 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f  h the most.** to
1cf40 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  ken actions..*/.
1cf50 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 65  static int state
1cf60 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f  ResortCompare(co
1cf70 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e  nst void *a, con
1cf80 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63  st void *b){.  c
1cf90 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
1cfa0 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74 20  e *pA = *(const 
1cfb0 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 61  struct state**)a
1cfc0 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
1cfd0 20 73 74 61 74 65 20 2a 70 42 20 3d 20 2a 28 63   state *pB = *(c
1cfe0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
1cff0 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a  e**)b;.  int n;.
1d000 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41 63  .  n = pB->nNtAc
1d010 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a  t - pA->nNtAct;.
1d020 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
1d030 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63    n = pB->nTknAc
1d040 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b  t - pA->nTknAct;
1d050 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
1d060 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d  .}.../*.** Renum
1d070 62 65 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73  ber and resort s
1d080 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74  tates so that st
1d090 61 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20  ates with fewer 
1d0a0 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72  choices.** occur
1d0b0 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78   at the end.  Ex
1d0c0 63 65 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65  cept, keep state
1d0d0 20 30 20 61 73 20 74 68 65 20 66 69 72 73 74 20   0 as the first 
1d0e0 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52  state..*/.void R
1d0f0 65 73 6f 72 74 53 74 61 74 65 73 28 6c 65 6d 70  esortStates(lemp
1d100 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
1d110 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp;.{.  int i;
1d120 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
1d130 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *stp;.  struct a
1d140 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f  ction *ap;..  fo
1d150 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1d160 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
1d170 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
1d180 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d  ted[i];.    stp-
1d190 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e  >nTknAct = stp->
1d1a0 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20 20 20  nNtAct = 0;.    
1d1b0 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 6c 65 6d  stp->iDflt = lem
1d1c0 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
1d1d0 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 73 74 70  ->nrule;.    stp
1d1e0 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f  ->iTknOfst = NO_
1d1f0 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d  OFFSET;.    stp-
1d200 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46  >iNtOfst = NO_OF
1d210 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70  FSET;.    for(ap
1d220 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
1d230 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1d240 20 20 69 66 28 20 63 6f 6d 70 75 74 65 5f 61 63    if( compute_ac
1d250 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d 30  tion(lemp,ap)>=0
1d260 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1d270 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65  ap->sp->index<le
1d280 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b  mp->nterminal ){
1d290 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e  .          stp->
1d2a0 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20  nTknAct++;.     
1d2b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 2d     }else if( ap-
1d2c0 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
1d2d0 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20  >nsymbol ){.    
1d2e0 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63        stp->nNtAc
1d2f0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
1d300 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
1d310 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f 6d 70 75  p->iDflt = compu
1d320 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20  te_action(lemp, 
1d330 61 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ap);.        }. 
1d340 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1d350 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70 2d 3e  .  qsort(&lemp->
1d360 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d 70 2d  sorted[1], lemp-
1d370 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a 65 6f  >nstate-1, sizeo
1d380 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30  f(lemp->sorted[0
1d390 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74 61 74  ]),.        stat
1d3a0 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 29 3b  eResortCompare);
1d3b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1d3c0 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
1d3d0 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f 72 74  {.    lemp->sort
1d3e0 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75 6d 20  ed[i]->statenum 
1d3f0 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a  = i;.  }.}.../**
1d400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1d410 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
1d420 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  et.c" **********
1d430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
1d450 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61 74 69  * Set manipulati
1d460 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  on routines for 
1d470 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
1d480 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
1d490 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a 65 20  static int size 
1d4a0 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65  = 0;../* Set the
1d4b0 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76 6f 69   set size */.voi
1d4c0 64 20 53 65 74 53 69 7a 65 28 6e 29 0a 69 6e 74  d SetSize(n).int
1d4d0 20 6e 3b 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e   n;.{.  size = n
1d4e0 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  +1;.}../* Alloca
1d4f0 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a  te a new set */.
1d500 63 68 61 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a  char *SetNew(){.
1d510 20 20 63 68 61 72 20 2a 73 3b 0a 20 20 69 6e 74    char *s;.  int
1d520 20 69 3b 0a 20 20 73 20 3d 20 28 63 68 61 72 2a   i;.  s = (char*
1d530 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 20 29 3b  )malloc( size );
1d540 0a 20 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20  .  if( s==0 ){. 
1d550 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d     extern void m
1d560 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20  emory_error();. 
1d570 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28     memory_error(
1d580 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1d590 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 73  ; i<size; i++) s
1d5a0 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [i] = 0;.  retur
1d5b0 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c  n s;.}../* Deall
1d5c0 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 76  ocate a set */.v
1d5d0 6f 69 64 20 53 65 74 46 72 65 65 28 73 29 0a 63  oid SetFree(s).c
1d5e0 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 66 72 65 65  har *s;.{.  free
1d5f0 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  (s);.}../* Add a
1d600 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1d610 74 68 65 20 73 65 74 2e 20 20 52 65 74 75 72 6e  the set.  Return
1d620 20 54 52 55 45 20 69 66 20 74 68 65 20 65 6c 65   TRUE if the ele
1d630 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64 0a 2a  ment was added.*
1d640 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 69  * and FALSE if i
1d650 74 20 77 61 73 20 61 6c 72 65 61 64 79 20 74 68  t was already th
1d660 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41  ere. */.int SetA
1d670 64 64 28 73 2c 65 29 0a 63 68 61 72 20 2a 73 3b  dd(s,e).char *s;
1d680 0a 69 6e 74 20 65 3b 0a 7b 0a 20 20 69 6e 74 20  .int e;.{.  int 
1d690 72 76 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b  rv;.  rv = s[e];
1d6a0 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72  .  s[e] = 1;.  r
1d6b0 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a  eturn !rv;.}../*
1d6c0 20 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d 65   Add every eleme
1d6d0 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e 20  nt of s2 to s1. 
1d6e0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1d6f0 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69  s1 changes. */.i
1d700 6e 74 20 53 65 74 55 6e 69 6f 6e 28 73 31 2c 73  nt SetUnion(s1,s
1d710 32 29 0a 63 68 61 72 20 2a 73 31 3b 0a 63 68 61  2).char *s1;.cha
1d720 72 20 2a 73 32 3b 0a 7b 0a 20 20 69 6e 74 20 69  r *s2;.{.  int i
1d730 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 70 72  , progress;.  pr
1d740 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f  ogress = 0;.  fo
1d750 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
1d760 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 32 5b  ++){.    if( s2[
1d770 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
1d780 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69 5d 3d  ;.    if( s1[i]=
1d790 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 67  =0 ){.      prog
1d7a0 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ress = 1;.      
1d7b0 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d  s1[i] = 1;.    }
1d7c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72  .  }.  return pr
1d7d0 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  ogress;.}./*****
1d7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d7f0 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
1d800 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a  "table.c" ******
1d810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d820 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c  ******/./*.** Al
1d830 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  l code in this f
1d840 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75 74  ile has been aut
1d850 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
1d860 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73  ated.** from a s
1d870 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20  pecification in 
1d880 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  the file.**     
1d890 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e           "table.
1d8a0 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73  q".** by the ass
1d8b0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 63  ociative array c
1d8c0 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f  ode building pro
1d8d0 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a  gram "aagen"..**
1d8e0 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69   Do not edit thi
1d8f0 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64  s file!  Instead
1d900 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63 69  , edit the speci
1d910 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65  fication.** file
1d920 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67  , then rerun aag
1d930 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64  en..*/./*.** Cod
1d940 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  e for processing
1d950 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c   tables in the L
1d960 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
1d970 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41  rator..*/..PRIVA
1d980 54 45 20 69 6e 74 20 73 74 72 68 61 73 68 28 78  TE int strhash(x
1d990 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 69  ).char *x;.{.  i
1d9a0 6e 74 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nt h = 0;.  whil
1d9b0 65 28 20 2a 78 29 20 68 20 3d 20 68 2a 31 33 20  e( *x) h = h*13 
1d9c0 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75  + *(x++);.  retu
1d9d0 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b  rn h;.}../* Work
1d9e0 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20 73  s like strdup, s
1d9f0 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61 20  ort of.  Save a 
1da00 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63  string in malloc
1da10 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a  ed memory, but.*
1da20 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20 69  * keep strings i
1da30 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68 61  n a table so tha
1da40 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e  t the same strin
1da50 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65  g is not in more
1da60 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61  .** than one pla
1da70 63 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 53 74 72  ce..*/.char *Str
1da80 73 61 66 65 28 79 29 0a 63 68 61 72 20 2a 79 3b  safe(y).char *y;
1da90 0a 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  .{.  char *z;.. 
1daa0 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e   z = Strsafe_fin
1dab0 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  d(y);.  if( z==0
1dac0 20 26 26 20 28 7a 3d 6d 61 6c 6c 6f 63 28 20 73   && (z=malloc( s
1dad0 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d 30  trlen(y)+1 ))!=0
1dae0 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a   ){.    strcpy(z
1daf0 2c 79 29 3b 0a 20 20 20 20 53 74 72 73 61 66 65  ,y);.    Strsafe
1db00 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a  _insert(z);.  }.
1db10 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29    MemoryCheck(z)
1db20 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
1db30 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
1db40 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1db50 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
1db60 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  ture for each.**
1db70 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1db80 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e  ay of type "x1".
1db90 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 31 20  .*/.struct s_x1 
1dba0 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  {.  int size;   
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1dbc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
1dbd0 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f  ilable slots. */
1dbe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dbf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1dc00 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  Must be a power 
1dc10 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61  of 2 greater tha
1dc20 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  n or */.        
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20    /*   equal to 
1dc50 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74  1 */.  int count
1dc60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1dc70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  * Number of curr
1dc80 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c  ently slots fill
1dc90 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ed */.  struct s
1dca0 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f  _x1node *tbl;  /
1dcb0 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65  * The data store
1dcc0 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75  d here */.  stru
1dcd0 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74  ct s_x1node **ht
1dce0 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65  ;  /* Hash table
1dcf0 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a   for lookups */.
1dd00 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  };../* There is 
1dd10 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
1dd20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
1dd30 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c  or every data el
1dd40 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61  ement.** in an a
1dd50 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1dd60 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a   of type "x1"..*
1dd70 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1dd80 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63 68   s_x1node {.  ch
1dd90 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
1dda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ddb0 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
1ddc0 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78  ct s_x1node *nex
1ddd0 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
1dde0 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
1ddf0 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
1de00 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x1node **fro
1de10 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
1de20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65  link */.} x1node
1de30 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
1de40 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
1de50 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
1de60 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
1de70 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
1de80 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78 31 61  struct s_x1 *x1a
1de90 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
1dea0 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
1deb0 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53   array */.void S
1dec0 74 72 73 61 66 65 5f 69 6e 69 74 28 29 7b 0a 20  trsafe_init(){. 
1ded0 20 69 66 28 20 78 31 61 20 29 20 72 65 74 75 72   if( x1a ) retur
1dee0 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73 74 72 75  n;.  x1a = (stru
1def0 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28  ct s_x1*)malloc(
1df00 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
1df10 5f 78 31 29 20 29 3b 0a 20 20 69 66 28 20 78 31  _x1) );.  if( x1
1df20 61 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69  a ){.    x1a->si
1df30 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 78  ze = 1024;.    x
1df40 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  1a->count = 0;. 
1df50 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78     x1a->tbl = (x
1df60 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a  1node*)malloc( .
1df70 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 31        (sizeof(x1
1df80 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
1df90 31 6e 6f 64 65 2a 29 29 2a 31 30 32 34 20 29 3b  1node*))*1024 );
1dfa0 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e 74 62  .    if( x1a->tb
1dfb0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
1dfc0 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20 20 78  ee(x1a);.      x
1dfd0 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  1a = 0;.    }els
1dfe0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
1dff0 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20 3d 20        x1a->ht = 
1e000 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d  (x1node**)&(x1a-
1e010 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20  >tbl[1024]);.   
1e020 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30     for(i=0; i<10
1e030 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74  24; i++) x1a->ht
1e040 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
1e050 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
1e060 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
1e070 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
1e080 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
1e090 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
1e0a0 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
1e0b0 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
1e0c0 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
1e0d0 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74  t Strsafe_insert
1e0e0 28 64 61 74 61 29 0a 63 68 61 72 20 2a 64 61 74  (data).char *dat
1e0f0 61 3b 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e  a;.{.  x1node *n
1e100 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  p;.  int h;.  in
1e110 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31 61  t ph;..  if( x1a
1e120 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1e130 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 64    ph = strhash(d
1e140 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26  ata);.  h = ph &
1e150 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
1e160 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68    np = x1a->ht[h
1e170 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
1e180 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
1e190 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d  (np->data,data)=
1e1a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
1e1b0 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
1e1c0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
1e1d0 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
1e1e0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
1e1f0 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
1e200 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
1e210 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
1e220 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
1e230 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
1e240 20 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e   if( x1a->count>
1e250 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x1a->size ){.  
1e260 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
1e270 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
1e280 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
1e290 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73  nt i,size;.    s
1e2a0 74 72 75 63 74 20 73 5f 78 31 20 61 72 72 61 79  truct s_x1 array
1e2b0 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
1e2c0 20 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d 3e 73   = size = x1a->s
1e2d0 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
1e2e0 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f  .count = x1a->co
1e2f0 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
1e300 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61  bl = (x1node*)ma
1e310 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a  lloc(.      (siz
1e320 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69  eof(x1node) + si
1e330 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 73  zeof(x1node*))*s
1e340 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61  ize );.    if( a
1e350 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
1e360 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
1e370 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
1e380 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
1e390 72 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65  ray.ht = (x1node
1e3a0 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73  **)&(array.tbl[s
1e3b0 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
1e3c0 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
1e3d0 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
1e3e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1e3f0 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x1a->count; i++
1e400 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64 65 20  ){.      x1node 
1e410 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
1e420 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
1e430 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x1a->tbl[i]);.  
1e440 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28      h = strhash(
1e450 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28  oldnp->data) & (
1e460 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  size-1);.      n
1e470 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
1e480 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
1e490 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
1e4a0 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
1e4b0 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
1e4c0 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
1e4d0 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
1e4e0 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
1e4f0 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e  ->data = oldnp->
1e500 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e  data;.      newn
1e510 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61  p->from = &(arra
1e520 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20  y.ht[h]);.      
1e530 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65  array.ht[h] = ne
1e540 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  wnp;.    }.    f
1e550 72 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20  ree(x1a->tbl);. 
1e560 20 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79 3b     *x1a = array;
1e570 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74  .  }.  /* Insert
1e580 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f   the new data */
1e590 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61  .  h = ph & (x1a
1e5a0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
1e5b0 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61  = &(x1a->tbl[x1a
1e5c0 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e  ->count++]);.  n
1e5d0 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
1e5e0 20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d    if( x1a->ht[h]
1e5f0 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x1a->ht[h]->f
1e600 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
1e610 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
1e620 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31  x1a->ht[h];.  x1
1e630 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
1e640 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31   np->from = &(x1
1e650 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
1e660 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
1e670 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1e680 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
1e690 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
1e6a0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
1e6b0 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
1e6c0 20 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73 61 66   */.char *Strsaf
1e6d0 65 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68 61 72  e_find(key).char
1e6e0 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68   *key;.{.  int h
1e6f0 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a  ;.  x1node *np;.
1e700 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20  .  if( x1a==0 ) 
1e710 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20  return 0;.  h = 
1e720 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20 28  strhash(key) & (
1e730 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x1a->size-1);.  
1e740 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  np = x1a->ht[h];
1e750 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
1e760 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
1e770 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20  p->data,key)==0 
1e780 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20  ) break;.    np 
1e790 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
1e7a0 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70    return np ? np
1e7b0 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->data : 0;.}../
1e7c0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1e7d0 65 72 20 74 6f 20 74 68 65 20 28 74 65 72 6d 69  er to the (termi
1e7e0 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e  nal or nontermin
1e7f0 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22 2e 0a  al) symbol "x"..
1e800 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
1e810 73 79 6d 62 6f 6c 20 69 66 20 74 68 69 73 20 69  symbol if this i
1e820 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
1e830 20 22 78 22 20 68 61 73 20 62 65 65 6e 20 73 65   "x" has been se
1e840 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 79  en..*/.struct sy
1e850 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77  mbol *Symbol_new
1e860 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20  (x).char *x;.{. 
1e870 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1e880 73 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62  sp;..  sp = Symb
1e890 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69 66  ol_find(x);.  if
1e8a0 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ( sp==0 ){.    s
1e8b0 70 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  p = (struct symb
1e8c0 6f 6c 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  ol *)malloc( siz
1e8d0 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
1e8e0 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79  l) );.    Memory
1e8f0 43 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73  Check(sp);.    s
1e900 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66  p->name = Strsaf
1e910 65 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79  e(x);.    sp->ty
1e920 70 65 20 3d 20 69 73 75 70 70 65 72 28 2a 78 29  pe = isupper(*x)
1e930 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f   ? TERMINAL : NO
1e940 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73  NTERMINAL;.    s
1e950 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  p->rule = 0;.   
1e960 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20   sp->fallback = 
1e970 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20  0;.    sp->prec 
1e980 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73  = -1;.    sp->as
1e990 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73  soc = UNK;.    s
1e9a0 70 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b  p->firstset = 0;
1e9b0 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20  .    sp->lambda 
1e9c0 3d 20 42 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73  = B_FALSE;.    s
1e9d0 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20  p->destructor = 
1e9e0 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74 61 74  0;.    sp->datat
1e9f0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d  ype = 0;.    Sym
1ea00 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70  bol_insert(sp,sp
1ea10 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72  ->name);.  }.  r
1ea20 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20  eturn sp;.}../* 
1ea30 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62  Compare two symb
1ea40 6f 6c 73 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20  ols for working 
1ea50 70 75 72 70 6f 73 65 73 0a 2a 2a 0a 2a 2a 20 53  purposes.**.** S
1ea60 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69  ymbols that begi
1ea70 6e 20 77 69 74 68 20 75 70 70 65 72 20 63 61 73  n with upper cas
1ea80 65 20 6c 65 74 74 65 72 73 20 28 74 65 72 6d 69  e letters (termi
1ea90 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73 29 0a  nals or tokens).
1eaa0 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20 62 65 66  ** must sort bef
1eab0 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74 68 61 74  ore symbols that
1eac0 20 62 65 67 69 6e 20 77 69 74 68 20 6c 6f 77 65   begin with lowe
1ead0 72 20 63 61 73 65 20 6c 65 74 74 65 72 73 0a 2a  r case letters.*
1eae0 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73  * (non-terminals
1eaf0 29 2e 20 20 4f 74 68 65 72 20 74 68 61 6e 20 74  ).  Other than t
1eb00 68 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64  hat, the order d
1eb10 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a  oes not matter..
1eb20 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78  **.** We find ex
1eb30 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61  perimentally tha
1eb40 74 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79  t leaving the sy
1eb50 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f  mbols in their o
1eb60 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72  riginal.** order
1eb70 20 28 74 68 65 20 6f 72 64 65 72 20 74 68 65 79   (the order they
1eb80 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65   appeared in the
1eb90 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67   grammar file) g
1eba0 69 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c  ives the.** smal
1ebb0 6c 65 73 74 20 70 61 72 73 65 72 20 74 61 62 6c  lest parser tabl
1ebc0 65 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f  es in SQLite..*/
1ebd0 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28  .int Symbolcmpp(
1ebe0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
1ebf0 61 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  a, struct symbol
1ec00 20 2a 2a 62 29 7b 0a 20 20 69 6e 74 20 69 31 20   **b){.  int i1 
1ec10 3d 20 28 2a 2a 61 29 2e 69 6e 64 65 78 20 2b 20  = (**a).index + 
1ec20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a 61 29 2e  10000000*((**a).
1ec30 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20  name[0]>'Z');.  
1ec40 69 6e 74 20 69 32 20 3d 20 28 2a 2a 62 29 2e 69  int i2 = (**b).i
1ec50 6e 64 65 78 20 2b 20 31 30 30 30 30 30 30 30 2a  ndex + 10000000*
1ec60 28 28 2a 2a 62 29 2e 6e 61 6d 65 5b 30 5d 3e 27  ((**b).name[0]>'
1ec70 5a 27 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 31  Z');.  return i1
1ec80 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65  -i2;.}../* There
1ec90 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
1eca0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ecb0 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
1ecc0 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
1ecd0 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
1ece0 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x2"..*/.struc
1ecf0 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73  t s_x2 {.  int s
1ed00 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1ed10 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
1ed20 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
1ed30 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed50 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
1ed60 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
1ed70 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
1eda0 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
1edb0 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
1edc0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1edd0 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
1ede0 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
1edf0 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a  truct s_x2node *
1ee00 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
1ee10 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
1ee20 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
1ee30 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
1ee40 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
1ee50 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
1ee60 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
1ee70 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
1ee80 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
1ee90 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
1eea0 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
1eeb0 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
1eec0 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x2"..*/.typedef
1eed0 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
1eee0 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62   {.  struct symb
1eef0 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ol *data;       
1ef00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ef10 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72  e data */.  char
1ef20 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20   *key;          
1ef30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ef40 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
1ef50 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x2node *next; 
1ef60 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
1ef70 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
1ef80 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
1ef90 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x2node **from; 
1efa0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
1efb0 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a  k */.} x2node;..
1efc0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
1efd0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1efe0 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
1eff0 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
1f000 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
1f010 75 63 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a  uct s_x2 *x2a;..
1f020 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
1f030 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
1f040 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62  ray */.void Symb
1f050 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28  ol_init(){.  if(
1f060 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20   x2a ) return;. 
1f070 20 78 32 61 20 3d 20 28 73 74 72 75 63 74 20 73   x2a = (struct s
1f080 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  _x2*)malloc( siz
1f090 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 32 29  eof(struct s_x2)
1f0a0 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b   );.  if( x2a ){
1f0b0 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d  .    x2a->size =
1f0c0 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63   128;.    x2a->c
1f0d0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32  ount = 0;.    x2
1f0e0 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65  a->tbl = (x2node
1f0f0 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20  *)malloc( .     
1f100 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29   (sizeof(x2node)
1f110 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65   + sizeof(x2node
1f120 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69  *))*128 );.    i
1f130 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x2a->tbl==0 )
1f140 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 32 61  {.      free(x2a
1f150 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30  );.      x2a = 0
1f160 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1f170 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1f180 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64  x2a->ht = (x2nod
1f190 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31  e**)&(x2a->tbl[1
1f1a0 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  28]);.      for(
1f1b0 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29  i=0; i<128; i++)
1f1c0 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x2a->ht[i] = 0;
1f1d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
1f1e0 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
1f1f0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
1f200 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
1f210 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
1f220 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
1f230 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
1f240 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
1f250 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  en */.int Symbol
1f260 5f 69 6e 73 65 72 74 28 64 61 74 61 2c 6b 65 79  _insert(data,key
1f270 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  ).struct symbol 
1f280 2a 64 61 74 61 3b 0a 63 68 61 72 20 2a 6b 65 79  *data;.char *key
1f290 3b 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70  ;.{.  x2node *np
1f2a0 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74  ;.  int h;.  int
1f2b0 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d   ph;..  if( x2a=
1f2c0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1f2d0 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65   ph = strhash(ke
1f2e0 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28  y);.  h = ph & (
1f2f0 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x2a->size-1);.  
1f300 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b  np = x2a->ht[h];
1f310 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
1f320 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
1f330 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
1f340 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
1f350 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
1f360 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
1f370 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
1f380 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
1f390 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
1f3a0 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
1f3b0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1f3c0 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
1f3d0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
1f3e0 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61   x2a->count>=x2a
1f3f0 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
1f400 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
1f410 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
1f420 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
1f430 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  ,size;.    struc
1f440 74 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20  t s_x2 array;.  
1f450 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73    array.size = s
1f460 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a  ize = x2a->size*
1f470 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
1f480 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b  nt = x2a->count;
1f490 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
1f4a0 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x2node*)malloc
1f4b0 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28  (.      (sizeof(
1f4c0 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x2node) + sizeof
1f4d0 28 78 32 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20  (x2node*))*size 
1f4e0 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
1f4f0 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
1f500 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
1f510 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
1f520 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
1f530 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26  ht = (x2node**)&
1f540 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d  (array.tbl[size]
1f550 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1f560 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  i<size; i++) arr
1f570 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
1f580 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61    for(i=0; i<x2a
1f590 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
1f5a0 20 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64       x2node *old
1f5b0 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
1f5c0 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d    oldnp = &(x2a-
1f5d0 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
1f5e0 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e  h = strhash(oldn
1f5f0 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d  p->key) & (size-
1f600 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20  1);.      newnp 
1f610 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d  = &(array.tbl[i]
1f620 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72  );.      if( arr
1f630 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79  ay.ht[h] ) array
1f640 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  .ht[h]->from = &
1f650 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  (newnp->next);. 
1f660 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74       newnp->next
1f670 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a   = array.ht[h];.
1f680 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79        newnp->key
1f690 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20   = oldnp->key;. 
1f6a0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61       newnp->data
1f6b0 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a   = oldnp->data;.
1f6c0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f        newnp->fro
1f6d0 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68  m = &(array.ht[h
1f6e0 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e  ]);.      array.
1f6f0 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20  ht[h] = newnp;. 
1f700 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32     }.    free(x2
1f710 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32  a->tbl);.    *x2
1f720 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20  a = array;.  }. 
1f730 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
1f740 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d  ew data */.  h =
1f750 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65   ph & (x2a->size
1f760 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32  -1);.  np = &(x2
1f770 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e  a->tbl[x2a->coun
1f780 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79  t++]);.  np->key
1f790 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61   = key;.  np->da
1f7a0 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28  ta = data;.  if(
1f7b0 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32   x2a->ht[h] ) x2
1f7c0 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  a->ht[h]->from =
1f7d0 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20   &(np->next);.  
1f7e0 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e  np->next = x2a->
1f7f0 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74  ht[h];.  x2a->ht
1f800 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e  [h] = np;.  np->
1f810 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74  from = &(x2a->ht
1f820 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  [h]);.  return 1
1f830 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
1f840 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
1f850 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
1f860 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74   given key.  Ret
1f870 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e  urn NULL.** if n
1f880 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73  o such key. */.s
1f890 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
1f8a0 6d 62 6f 6c 5f 66 69 6e 64 28 6b 65 79 29 0a 63  mbol_find(key).c
1f8b0 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e  har *key;.{.  in
1f8c0 74 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e  t h;.  x2node *n
1f8d0 70 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  p;..  if( x2a==0
1f8e0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
1f8f0 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20   = strhash(key) 
1f900 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x2a->size-1);
1f910 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b  .  np = x2a->ht[
1f920 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
1f930 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
1f940 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
1f950 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
1f960 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
1f970 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
1f980 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
1f990 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ./* Return the n
1f9a0 2d 74 68 20 64 61 74 61 2e 20 20 52 65 74 75 72  -th data.  Retur
1f9b0 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f  n NULL if n is o
1f9c0 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a  ut of range. */.
1f9d0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
1f9e0 79 6d 62 6f 6c 5f 4e 74 68 28 6e 29 0a 69 6e 74  ymbol_Nth(n).int
1f9f0 20 6e 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73   n;.{.  struct s
1fa00 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69  ymbol *data;.  i
1fa10 66 28 20 78 32 61 20 26 26 20 6e 3e 30 20 26 26  f( x2a && n>0 &&
1fa20 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29   n<=x2a->count )
1fa30 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 78 32 61  {.    data = x2a
1fa40 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b  ->tbl[n-1].data;
1fa50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61  .  }else{.    da
1fa60 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ta = 0;.  }.  re
1fa70 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a  turn data;.}../*
1fa80 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
1fa90 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 2a 2f   of the array */
1faa0 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e  .int Symbol_coun
1fab0 74 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78  t().{.  return x
1fac0 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20  2a ? x2a->count 
1fad0 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
1fae0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  n an array of po
1faf0 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61  inters to all da
1fb00 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ta in the table.
1fb10 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73  .** The array is
1fb20 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
1fb30 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e  alloc.  Return N
1fb40 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c  ULL if memory al
1fb50 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62  location.** prob
1fb60 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20  lems, or if the 
1fb70 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20  array is empty. 
1fb80 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
1fb90 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f   **Symbol_arrayo
1fba0 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  f().{.  struct s
1fbb0 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20  ymbol **array;. 
1fbc0 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69   int i,size;.  i
1fbd0 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75  f( x2a==0 ) retu
1fbe0 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78  rn 0;.  size = x
1fbf0 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72  2a->count;.  arr
1fc00 61 79 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  ay = (struct sym
1fc10 62 6f 6c 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73  bol **)malloc( s
1fc20 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
1fc30 62 6f 6c 20 2a 29 2a 73 69 7a 65 20 29 3b 0a 20  bol *)*size );. 
1fc40 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20   if( array ){.  
1fc50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1fc60 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d  e; i++) array[i]
1fc70 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64   = x2a->tbl[i].d
1fc80 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ata;.  }.  retur
1fc90 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43  n array;.}../* C
1fca0 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69  ompare two confi
1fcb0 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74  gurations */.int
1fcc0 20 43 6f 6e 66 69 67 63 6d 70 28 61 2c 62 29 0a   Configcmp(a,b).
1fcd0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
1fce0 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
1fcf0 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b 0a 20  *b;.{.  int x;. 
1fd00 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65   x = a->rp->inde
1fd10 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78  x - b->rp->index
1fd20 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78  ;.  if( x==0 ) x
1fd30 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64   = a->dot - b->d
1fd40 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a  ot;.  return x;.
1fd50 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
1fd60 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56  o states */.PRIV
1fd70 41 54 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70  ATE int statecmp
1fd80 28 61 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e  (a,b).struct con
1fd90 66 69 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63  fig *a;.struct c
1fda0 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e  onfig *b;.{.  in
1fdb0 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30  t rc;.  for(rc=0
1fdc0 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20  ; rc==0 && a && 
1fdd0 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62  b;  a=a->bp, b=b
1fde0 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20  ->bp){.    rc = 
1fdf0 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62  a->rp->index - b
1fe00 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20  ->rp->index;.   
1fe10 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
1fe20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f  = a->dot - b->do
1fe30 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  t;.  }.  if( rc=
1fe40 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20  =0 ){.    if( a 
1fe50 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66  ) rc = 1;.    if
1fe60 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20  ( b ) rc = -1;. 
1fe70 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1fe80 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61  }../* Hash a sta
1fe90 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e  te */.PRIVATE in
1fea0 74 20 73 74 61 74 65 68 61 73 68 28 61 29 0a 73  t statehash(a).s
1feb0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b  truct config *a;
1fec0 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20  .{.  int h=0;.  
1fed0 77 68 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20  while( a ){.    
1fee0 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72  h = h*571 + a->r
1fef0 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d  p->index*37 + a-
1ff00 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d  >dot;.    a = a-
1ff10 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  >bp;.  }.  retur
1ff20 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63  n h;.}../* Alloc
1ff30 61 74 65 20 61 20 6e 65 77 20 73 74 61 74 65 20  ate a new state 
1ff40 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72  structure */.str
1ff50 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65  uct state *State
1ff60 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63  _new().{.  struc
1ff70 74 20 73 74 61 74 65 20 2a 6e 65 77 3b 0a 20 20  t state *new;.  
1ff80 6e 65 77 20 3d 20 28 73 74 72 75 63 74 20 73 74  new = (struct st
1ff90 61 74 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  ate *)malloc( si
1ffa0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61 74  zeof(struct stat
1ffb0 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68  e) );.  MemoryCh
1ffc0 65 63 6b 28 6e 65 77 29 3b 0a 20 20 72 65 74 75  eck(new);.  retu
1ffd0 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68  rn new;.}../* Th
1ffe0 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
1fff0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
20000 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
20010 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
20020 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
20030 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74  type "x3"..*/.st
20040 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e  ruct s_x3 {.  in
20050 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
20060 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
20070 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
20080 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
20090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200a0 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
200b0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
200c0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
200d0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
200e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
200f0 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
20100 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
20110 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20120 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
20130 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
20140 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
20150 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
20160 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
20170 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
20180 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  3node **ht;  /* 
20190 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
201a0 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
201b0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
201c0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
201d0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
201e0 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
201f0 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
20200 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
20210 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x3"..*/.type
20220 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e  def struct s_x3n
20230 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
20240 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20  tate *data;     
20250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20260 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
20270 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
20280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20290 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
202a0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
202b0 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
202c0 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
202d0 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
202e0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
202f0 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
20300 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
20310 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x3node;../* Th
20320 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
20330 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
20340 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
20350 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
20360 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
20370 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c  _x3 *x3a;../* Al
20380 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
20390 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
203a0 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  /.void State_ini
203b0 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61 20 29  t(){.  if( x3a )
203c0 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20 3d   return;.  x3a =
203d0 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29 6d   (struct s_x3*)m
203e0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
203f0 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20 20  ruct s_x3) );.  
20400 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20 78  if( x3a ){.    x
20410 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a  3a->size = 128;.
20420 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d      x3a->count =
20430 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62 6c   0;.    x3a->tbl
20440 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x3node*)mall
20450 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
20460 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
20470 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 31 32  eof(x3node*))*12
20480 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 33 61  8 );.    if( x3a
20490 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
204a0 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20 20 20    free(x3a);.   
204b0 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20 20 20     x3a = 0;.    
204c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
204d0 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e 68   i;.      x3a->h
204e0 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28  t = (x3node**)&(
204f0 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a  x3a->tbl[128]);.
20500 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
20510 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e  <128; i++) x3a->
20520 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
20530 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
20540 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
20550 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
20560 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
20570 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
20580 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
20590 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
205a0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
205b0 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74  int State_insert
205c0 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72 75 63  (data,key).struc
205d0 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 0a 73  t state *data;.s
205e0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
205f0 79 3b 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  y;.{.  x3node *n
20600 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  p;.  int h;.  in
20610 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61  t ph;..  if( x3a
20620 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
20630 20 20 70 68 20 3d 20 73 74 61 74 65 68 61 73 68    ph = statehash
20640 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20  (key);.  h = ph 
20650 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
20660 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b  .  np = x3a->ht[
20670 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
20680 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65  ){.    if( state
20690 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
206a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
206b0 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
206c0 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
206d0 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
206e0 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
206f0 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
20700 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
20710 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
20720 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
20730 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
20740 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74    if( x3a->count
20750 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x3a->size ){. 
20760 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
20770 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
20780 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
20790 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20  int i,size;.    
207a0 73 74 72 75 63 74 20 73 5f 78 33 20 61 72 72 61  struct s_x3 arra
207b0 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
207c0 65 20 3d 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e  e = size = x3a->
207d0 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
207e0 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63  y.count = x3a->c
207f0 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
20800 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d  tbl = (x3node*)m
20810 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69  alloc(.      (si
20820 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73  zeof(x3node) + s
20830 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a  izeof(x3node*))*
20840 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  size );.    if( 
20850 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
20860 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
20870 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
20880 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
20890 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64  rray.ht = (x3nod
208a0 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
208b0 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  size]);.    for(
208c0 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
208d0 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
208e0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
208f0 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x3a->count; i+
20900 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65  +){.      x3node
20910 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
20920 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
20930 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x3a->tbl[i]);. 
20940 20 20 20 20 20 68 20 3d 20 73 74 61 74 65 68 61       h = stateha
20950 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26  sh(oldnp->key) &
20960 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
20970 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
20980 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
20990 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
209a0 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
209b0 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
209c0 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
209d0 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
209e0 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
209f0 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
20a00 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
20a10 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
20a20 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
20a30 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
20a40 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
20a50 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
20a60 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
20a70 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a  free(x3a->tbl);.
20a80 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79      *x3a = array
20a90 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
20aa0 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
20ab0 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33  /.  h = ph & (x3
20ac0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
20ad0 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33   = &(x3a->tbl[x3
20ae0 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
20af0 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
20b00 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
20b10 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b  ;.  if( x3a->ht[
20b20 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d  h] ) x3a->ht[h]-
20b30 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
20b40 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
20b50 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
20b60 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x3a->ht[h] = np;
20b70 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
20b80 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x3a->ht[h]);.  r
20b90 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
20ba0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20bb0 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
20bc0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
20bd0 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
20be0 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
20bf0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  y. */.struct sta
20c00 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 6b  te *State_find(k
20c10 65 79 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ey).struct confi
20c20 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20  g *key;.{.  int 
20c30 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b  h;.  x3node *np;
20c40 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29  ..  if( x3a==0 )
20c50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
20c60 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 20   statehash(key) 
20c70 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
20c80 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b  .  np = x3a->ht[
20c90 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
20ca0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65  ){.    if( state
20cb0 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
20cc0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
20cd0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
20ce0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
20cf0 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
20d00 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
20d10 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
20d20 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e  s to all data in
20d30 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54   the table..** T
20d40 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
20d50 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
20d60 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
20d70 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
20d80 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c  ion.** problems,
20d90 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79   or if the array
20da0 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74   is empty. */.st
20db0 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61  ruct state **Sta
20dc0 74 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20  te_arrayof().{. 
20dd0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a   struct state **
20de0 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73  array;.  int i,s
20df0 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d  ize;.  if( x3a==
20e00 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
20e10 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e  size = x3a->coun
20e20 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74  t;.  array = (st
20e30 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29 6d 61  ruct state **)ma
20e40 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
20e50 75 63 74 20 73 74 61 74 65 20 2a 29 2a 73 69 7a  uct state *)*siz
20e60 65 20 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79  e );.  if( array
20e70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
20e80 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
20e90 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62  ray[i] = x3a->tb
20ea0 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20  l[i].data;.  }. 
20eb0 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d   return array;.}
20ec0 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66  ../* Hash a conf
20ed0 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49  iguration */.PRI
20ee0 56 41 54 45 20 69 6e 74 20 63 6f 6e 66 69 67 68  VATE int configh
20ef0 61 73 68 28 61 29 0a 73 74 72 75 63 74 20 63 6f  ash(a).struct co
20f00 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74  nfig *a;.{.  int
20f10 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37   h=0;.  h = h*57
20f20 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  1 + a->rp->index
20f30 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20  *37 + a->dot;.  
20f40 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
20f50 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
20f60 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
20f70 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
20f80 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
20f90 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
20fa0 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a  f type "x4"..*/.
20fb0 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20  struct s_x4 {.  
20fc0 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
20fd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
20fe0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
20ff0 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21010 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
21020 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
21030 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
21040 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21060 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
21070 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
21080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21090 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
210a0 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
210b0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
210c0 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
210d0 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
210e0 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
210f0 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x4node **ht;  /
21100 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
21110 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
21120 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
21130 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
21140 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
21150 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
21160 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
21170 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
21180 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79  type "x4"..*/.ty
21190 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
211a0 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  4node {.  struct
211b0 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20   config *data;  
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
211e0 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
211f0 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
21200 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
21210 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
21220 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
21230 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
21240 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
21250 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  4node;../* There
21260 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
21270 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
21280 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
21290 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
212a0 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 34  atic struct s_x4
212b0 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x4a;../* Alloc
212c0 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
212d0 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
212e0 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  oid Configtable_
212f0 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 34  init(){.  if( x4
21300 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 34  a ) return;.  x4
21310 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 34  a = (struct s_x4
21320 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
21330 28 73 74 72 75 63 74 20 73 5f 78 34 29 20 29 3b  (struct s_x4) );
21340 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a 20 20  .  if( x4a ){.  
21350 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34    x4a->size = 64
21360 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74  ;.    x4a->count
21370 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74   = 0;.    x4a->t
21380 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61  bl = (x4node*)ma
21390 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69  lloc( .      (si
213a0 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73  zeof(x4node) + s
213b0 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a  izeof(x4node*))*
213c0 36 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 34  64 );.    if( x4
213d0 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
213e0 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20     free(x4a);.  
213f0 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20      x4a = 0;.   
21400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
21410 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e  t i;.      x4a->
21420 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26  ht = (x4node**)&
21430 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a  (x4a->tbl[64]);.
21440 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21450 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68  <64; i++) x4a->h
21460 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
21470 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
21480 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
21490 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
214a0 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
214b0 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
214c0 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
214d0 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
214e0 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
214f0 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  nt Configtable_i
21500 6e 73 65 72 74 28 64 61 74 61 29 0a 73 74 72 75  nsert(data).stru
21510 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b  ct config *data;
21520 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b  .{.  x4node *np;
21530 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
21540 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d  ph;..  if( x4a==
21550 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
21560 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28  ph = confighash(
21570 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20  data);.  h = ph 
21580 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x4a->size-1);
21590 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b  .  np = x4a->ht[
215a0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
215b0 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69  ){.    if( Confi
215c0 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61  gcmp(np->data,da
215d0 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ta)==0 ){.      
215e0 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
215f0 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
21600 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
21610 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
21620 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
21630 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
21640 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
21650 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
21660 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
21670 20 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f   }.  if( x4a->co
21680 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29  unt>=x4a->size )
21690 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
216a0 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
216b0 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
216c0 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20     int i,size;. 
216d0 20 20 20 73 74 72 75 63 74 20 73 5f 78 34 20 61     struct s_x4 a
216e0 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
216f0 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 34  size = size = x4
21700 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
21710 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61  rray.count = x4a
21720 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
21730 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  ay.tbl = (x4node
21740 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  *)malloc(.      
21750 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20  (sizeof(x4node) 
21760 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a  + sizeof(x4node*
21770 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69  ))*size );.    i
21780 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
21790 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
217a0 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
217b0 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
217c0 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34    array.ht = (x4
217d0 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
217e0 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66  bl[size]);.    f
217f0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
21800 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
21810 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
21820 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b  0; i<x4a->count;
21830 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e   i++){.      x4n
21840 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
21850 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
21860 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x4a->tbl[i])
21870 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66  ;.      h = conf
21880 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61  ighash(oldnp->da
21890 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a  ta) & (size-1);.
218a0 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28        newnp = &(
218b0 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20  array.tbl[i]);. 
218c0 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68       if( array.h
218d0 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b  t[h] ) array.ht[
218e0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77  h]->from = &(new
218f0 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20  np->next);.     
21900 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61   newnp->next = a
21910 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20  rray.ht[h];.    
21920 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
21930 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
21940 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
21950 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
21960 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
21970 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
21980 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e  }.    free(x4a->
21990 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d  tbl);.    *x4a =
219a0 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
219b0 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
219c0 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
219d0 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
219e0 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e  ;.  np = &(x4a->
219f0 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x4a->count++
21a00 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d  ]);.  np->data =
21a10 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61   data;.  if( x4a
21a20 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68  ->ht[h] ) x4a->h
21a30 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
21a40 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e  p->next);.  np->
21a50 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68  next = x4a->ht[h
21a60 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20  ];.  x4a->ht[h] 
21a70 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d  = np;.  np->from
21a80 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29   = &(x4a->ht[h])
21a90 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
21aa0 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
21ab0 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73  nter to data ass
21ac0 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76  igned to the giv
21ad0 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20  en key.  Return 
21ae0 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75  NULL.** if no su
21af0 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63  ch key. */.struc
21b00 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
21b10 74 61 62 6c 65 5f 66 69 6e 64 28 6b 65 79 29 0a  table_find(key).
21b20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
21b30 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey;.{.  int h;. 
21b40 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x4node *np;..  
21b50 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74  if( x4a==0 ) ret
21b60 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e  urn 0;.  h = con
21b70 66 69 67 68 61 73 68 28 6b 65 79 29 20 26 20 28  fighash(key) & (
21b80 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x4a->size-1);.  
21b90 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  np = x4a->ht[h];
21ba0 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
21bb0 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d      if( Configcm
21bc0 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d  p(np->data,key)=
21bd0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
21be0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
21bf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f   }.  return np ?
21c00 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d   np->data : 0;.}
21c10 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  ../* Remove all 
21c20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61  data from the ta
21c30 62 6c 65 2e 20 20 50 61 73 73 20 65 61 63 68 20  ble.  Pass each 
21c40 64 61 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63  data to the func
21c50 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69  tion "f".** as i
21c60 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28  t is removed.  (
21c70 22 66 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20  "f" may be null 
21c80 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 73 74  to avoid this st
21c90 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  ep.) */.void Con
21ca0 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 66  figtable_clear(f
21cb0 29 0a 69 6e 74 28 2a 66 29 28 2f 2a 20 73 74 72  ).int(*f)(/* str
21cc0 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29  uct config * */)
21cd0 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ;.{.  int i;.  i
21ce0 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61  f( x4a==0 || x4a
21cf0 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74  ->count==0 ) ret
21d00 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66  urn;.  if( f ) f
21d10 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63  or(i=0; i<x4a->c
21d20 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28  ount; i++) (*f)(
21d30 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61  x4a->tbl[i].data
21d40 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
21d50 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20  x4a->size; i++) 
21d60 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x4a->ht[i] = 0;.
21d70 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x4a->count = 0
21d80 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.