/ Hex Artifact Content
Login

Artifact b71e494b59ffd4a878e22c00e33e442958a4a1f5:


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 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
2660: 62 6f 6c 20 2a 77 69 6c 64 63 61 72 64 3b 20 2f  bol *wildcard; /
2670: 2a 20 54 6f 6b 65 6e 20 74 68 61 74 20 6d 61 74  * Token that mat
2680: 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20 2a 2f  ches anything */
2690: 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  .  char *name;  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26b0: 61 6d 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ame of the gener
26c0: 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 20  ated parser */. 
26d0: 20 63 68 61 72 20 2a 61 72 67 3b 20 20 20 20 20   char *arg;     
26e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63            /* Dec
26f0: 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  laration of the 
2700: 33 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3th argument to 
2710: 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72  parser */.  char
2720: 20 2a 74 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20   *tokentype;    
2730: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
2740: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
2750: 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73   in the parser s
2760: 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tack */.  char *
2770: 76 61 72 74 79 70 65 3b 20 20 20 20 20 20 20 20  vartype;        
2780: 20 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c     /* The defaul
2790: 74 20 74 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65  t type of non-te
27a0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a  rminal symbols *
27b0: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 72 74 3b  /.  char *start;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 72  Name of the star
27e0: 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65  t symbol for the
27f0: 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68   grammar */.  ch
2800: 61 72 20 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20  ar *stacksize;  
2810: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2820: 66 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61  f the parser sta
2830: 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e  ck */.  char *in
2840: 63 6c 75 64 65 3b 20 20 20 20 20 20 20 20 20 20  clude;          
2850: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 75 74 20   /* Code to put 
2860: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2870: 74 68 65 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20  the C file */.  
2880: 69 6e 74 20 20 69 6e 63 6c 75 64 65 6c 6e 3b 20  int  includeln; 
2890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
28a0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72   number for star
28b0: 74 20 6f 66 20 69 6e 63 6c 75 64 65 20 63 6f 64  t of include cod
28c0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72  e */.  char *err
28d0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
28e0: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
28f0: 74 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  te when an error
2900: 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e   is seen */.  in
2910: 74 20 20 65 72 72 6f 72 6c 6e 3b 20 20 20 20 20  t  errorln;     
2920: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
2930: 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72 74 20  umber for start 
2940: 6f 66 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  of error code */
2950: 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f  .  char *overflo
2960: 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  w;          /* C
2970: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
2980: 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c  n a stack overfl
2990: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 20 6f 76 65  ow */.  int  ove
29a0: 72 66 6c 6f 77 6c 6e 3b 20 20 20 20 20 20 20 20  rflowln;        
29b0: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
29c0: 66 6f 72 20 73 74 61 72 74 20 6f 66 20 6f 76 65  for start of ove
29d0: 72 66 6c 6f 77 20 63 6f 64 65 20 2a 2f 0a 20 20  rflow code */.  
29e0: 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b 20 20  char *failure;  
29f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2a00: 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e 20 70   to execute on p
2a10: 61 72 73 65 72 20 66 61 69 6c 75 72 65 20 2a 2f  arser failure */
2a20: 0a 20 20 69 6e 74 20 20 66 61 69 6c 75 72 65 6c  .  int  failurel
2a30: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  n;          /* L
2a40: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  ine number for s
2a50: 74 61 72 74 20 6f 66 20 66 61 69 6c 75 72 65 20  tart of failure 
2a60: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
2a70: 61 63 63 65 70 74 3b 20 20 20 20 20 20 20 20 20  accept;         
2a80: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2a90: 65 63 75 74 65 20 77 68 65 6e 20 74 68 65 20 70  ecute when the p
2aa0: 61 72 73 65 72 20 65 78 63 65 70 74 73 20 2a 2f  arser excepts */
2ab0: 0a 20 20 69 6e 74 20 20 61 63 63 65 70 74 6c 6e  .  int  acceptln
2ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
2ad0: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ine number for t
2ae0: 68 65 20 73 74 61 72 74 20 6f 66 20 61 63 63 65  he start of acce
2af0: 70 74 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  pt code */.  cha
2b00: 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20 20  r *extracode;   
2b10: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61 70        /* Code ap
2b20: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67 65  pended to the ge
2b30: 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f 0a  nerated file */.
2b40: 20 20 69 6e 74 20 20 65 78 74 72 61 63 6f 64 65    int  extracode
2b50: 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ln;        /* Li
2b60: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ne number for th
2b70: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 65  e start of the e
2b80: 78 74 72 61 20 63 6f 64 65 20 2a 2f 0a 20 20 63  xtra code */.  c
2b90: 68 61 72 20 2a 74 6f 6b 65 6e 64 65 73 74 3b 20  har *tokendest; 
2ba0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2bb0: 74 6f 20 65 78 65 63 75 74 65 20 74 6f 20 64 65  to execute to de
2bc0: 73 74 72 6f 79 20 74 6f 6b 65 6e 20 64 61 74 61  stroy token data
2bd0: 20 2a 2f 0a 20 20 69 6e 74 20 20 74 6f 6b 65 6e   */.  int  token
2be0: 64 65 73 74 6c 6e 3b 20 20 20 20 20 20 20 20 2f  destln;        /
2bf0: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
2c00: 72 20 74 6f 6b 65 6e 20 64 65 73 74 72 6f 79 65  r token destroye
2c10: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  r code */.  char
2c20: 20 2a 76 61 72 64 65 73 74 3b 20 20 20 20 20 20   *vardest;      
2c30: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72       /* Code for
2c40: 20 74 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e   the default non
2c50: 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75  -terminal destru
2c60: 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 20 76  ctor */.  int  v
2c70: 61 72 64 65 73 74 6c 6e 3b 20 20 20 20 20 20 20  ardestln;       
2c80: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
2c90: 72 20 66 6f 72 20 64 65 66 61 75 6c 74 20 6e 6f  r for default no
2ca0: 6e 2d 74 65 72 6d 20 64 65 73 74 72 75 63 74 6f  n-term destructo
2cb0: 72 20 63 6f 64 65 2a 2f 0a 20 20 63 68 61 72 20  r code*/.  char 
2cc0: 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  *filename;      
2cd0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2ce0: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
2cf0: 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65  .  char *outname
2d00: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2d10: 61 6d 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ame of the curre
2d20: 6e 74 20 6f 75 74 70 75 74 20 66 69 6c 65 20 2a  nt output file *
2d30: 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70  /.  char *tokenp
2d40: 72 65 66 69 78 3b 20 20 20 20 20 20 20 2f 2a 20  refix;       /* 
2d50: 41 20 70 72 65 66 69 78 20 61 64 64 65 64 20 74  A prefix added t
2d60: 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e  o token names in
2d70: 20 74 68 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a   the .h file */.
2d80: 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b    int nconflict;
2d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2da0: 6d 62 65 72 20 6f 66 20 70 61 72 73 69 6e 67 20  mber of parsing 
2db0: 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69  conflicts */.  i
2dc0: 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b 20 20 20  nt tablesize;   
2dd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2de0: 6f 66 20 74 68 65 20 70 61 72 73 65 20 74 61 62  of the parse tab
2df0: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  les */.  int bas
2e00: 69 73 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20  isflag;         
2e10: 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20    /* Print only 
2e20: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
2e30: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61  ions */.  int ha
2e40: 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20  s_fallback;     
2e50: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2e60: 79 20 25 66 61 6c 6c 62 61 63 6b 20 69 73 20 73  y %fallback is s
2e70: 65 65 6e 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  een in the gramm
2e80: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72  er */.  char *ar
2e90: 67 76 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  gv0;            
2ea0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2eb0: 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23  program */.};..#
2ec0: 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65  define MemoryChe
2ed0: 63 6b 28 58 29 20 69 66 28 28 58 29 3d 3d 30 29  ck(X) if((X)==0)
2ee0: 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20 76 6f 69  { \.  extern voi
2ef0: 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29  d memory_error()
2f00: 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72  ; \.  memory_err
2f10: 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a  or(); \.}../****
2f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
2f30: 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c  m the file "tabl
2f40: 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.h" ***********
2f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f60: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c  ******/./*.** Al
2f70: 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  l code in this f
2f80: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75 74  ile has been aut
2f90: 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
2fa0: 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73  ated.** from a s
2fb0: 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20  pecification in 
2fc0: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  the file.**     
2fd0: 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e           "table.
2fe0: 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73  q".** by the ass
2ff0: 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 63  ociative array c
3000: 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f  ode building pro
3010: 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a  gram "aagen"..**
3020: 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69   Do not edit thi
3030: 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64  s file!  Instead
3040: 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63 69  , edit the speci
3050: 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65  fication.** file
3060: 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67  , then rerun aag
3070: 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64  en..*/./*.** Cod
3080: 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  e for processing
3090: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c   tables in the L
30a0: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
30b0: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 6f  rator..*/../* Ro
30c0: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
30d0: 69 6e 67 20 61 20 73 74 72 69 6e 67 73 20 2a 2f  ing a strings */
30e0: 0a 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 28  ..char *Strsafe(
30f0: 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73 61 66 65  );..void Strsafe
3100: 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f  _init(/* void */
3110: 29 3b 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  );.int Strsafe_i
3120: 6e 73 65 72 74 28 2f 2a 20 63 68 61 72 20 2a 20  nsert(/* char * 
3130: 2a 2f 29 3b 0a 63 68 61 72 20 2a 53 74 72 73 61  */);.char *Strsa
3140: 66 65 5f 66 69 6e 64 28 2f 2a 20 63 68 61 72 20  fe_find(/* char 
3150: 2a 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69  * */);../* Routi
3160: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
3170: 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20   symbols of the 
3180: 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75  grammar */..stru
3190: 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
31a0: 6c 5f 6e 65 77 28 29 3b 0a 69 6e 74 20 53 79 6d  l_new();.int Sym
31b0: 62 6f 6c 63 6d 70 70 28 2f 2a 20 73 74 72 75 63  bolcmpp(/* struc
31c0: 74 20 73 79 6d 62 6f 6c 20 2a 2a 2c 20 73 74 72  t symbol **, str
31d0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 20 2a 2f  uct symbol ** */
31e0: 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69  );.void Symbol_i
31f0: 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b  nit(/* void */);
3200: 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
3210: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 73 79 6d  rt(/* struct sym
3220: 62 6f 6c 20 2a 2c 20 63 68 61 72 20 2a 20 2a 2f  bol *, char * */
3230: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
3240: 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 2f 2a   *Symbol_find(/*
3250: 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a 73 74 72   char * */);.str
3260: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
3270: 6f 6c 5f 4e 74 68 28 2f 2a 20 69 6e 74 20 2a 2f  ol_Nth(/* int */
3280: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  );.int Symbol_co
3290: 75 6e 74 28 2f 2a 20 20 2a 2f 29 3b 0a 73 74 72  unt(/*  */);.str
32a0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d  uct symbol **Sym
32b0: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20  bol_arrayof(/*  
32c0: 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  */);../* Routine
32d0: 73 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20  s to manage the 
32e0: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a  state table */..
32f0: 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 2f 2a  int Configcmp(/*
3300: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
3310: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
3320: 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74  * */);.struct st
3330: 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29  ate *State_new()
3340: 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  ;.void State_ini
3350: 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69  t(/* void */);.i
3360: 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28  nt State_insert(
3370: 2f 2a 20 73 74 72 75 63 74 20 73 74 61 74 65 20  /* struct state 
3380: 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  *, struct config
3390: 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73   * */);.struct s
33a0: 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64  tate *State_find
33b0: 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69  (/* struct confi
33c0: 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  g * */);.struct 
33d0: 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72  state **State_ar
33e0: 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a  rayof(/*  */);..
33f0: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64  /* Routines used
3400: 20 66 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20   for efficiency 
3410: 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  in Configlist_ad
3420: 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69  d */..void Confi
3430: 67 74 61 62 6c 65 5f 69 6e 69 74 28 2f 2a 20 76  gtable_init(/* v
3440: 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20 43 6f 6e  oid */);.int Con
3450: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
3460: 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  /* struct config
3470: 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63   * */);.struct c
3480: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62  onfig *Configtab
3490: 6c 65 5f 66 69 6e 64 28 2f 2a 20 73 74 72 75 63  le_find(/* struc
34a0: 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a  t config * */);.
34b0: 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
34c0: 5f 63 6c 65 61 72 28 2f 2a 20 69 6e 74 28 2a 29  _clear(/* int(*)
34d0: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
34e0: 29 20 2a 2f 29 3b 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ) */);./********
34f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
3500: 74 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e  the file "action
3510: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
3520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3530: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
3540: 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 70  nes processing p
3550: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 69 6e  arser actions in
3560: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
3570: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
3580: 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
3590: 65 77 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e  ew parser action
35a0: 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74 69 6f   */.struct actio
35b0: 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 29 7b  n *Action_new(){
35c0: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
35d0: 20 61 63 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73   action *freelis
35e0: 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
35f0: 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a 0a 20 20  action *new;..  
3600: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
3610: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
3620: 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
3630: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
3640: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
3650: 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
3660: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 29 2a 61  struct action)*a
3670: 6d 74 20 29 3b 0a 20 20 20 20 69 66 28 20 66 72  mt );.    if( fr
3680: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
3690: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
36a0: 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  r,"Unable to all
36b0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
36c0: 20 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63   a new parser ac
36d0: 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65  tion.");.      e
36e0: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
36f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74    for(i=0; i<amt
3700: 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73  -1; i++) freelis
3710: 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65  t[i].next = &fre
3720: 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
3730: 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e  freelist[amt-1].
3740: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  next = 0;.  }.  
3750: 6e 65 77 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a  new = freelist;.
3760: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65    freelist = fre
3770: 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
3780: 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a  eturn new;.}../*
3790: 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 61 63 74   Compare two act
37a0: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  ions */.static i
37b0: 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28 61 70 31  nt actioncmp(ap1
37c0: 2c 61 70 32 29 0a 73 74 72 75 63 74 20 61 63 74  ,ap2).struct act
37d0: 69 6f 6e 20 2a 61 70 31 3b 0a 73 74 72 75 63 74  ion *ap1;.struct
37e0: 20 61 63 74 69 6f 6e 20 2a 61 70 32 3b 0a 7b 0a   action *ap2;.{.
37f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d    int rc;.  rc =
3800: 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20   ap1->sp->index 
3810: 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78  - ap2->sp->index
3820: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20  ;.  if( rc==0 ) 
3830: 72 63 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74  rc = (int)ap1->t
3840: 79 70 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e  ype - (int)ap2->
3850: 74 79 70 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d  type;.  if( rc==
3860: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
3870: 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52 45 44 55   ap1->type==REDU
3880: 43 45 20 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d  CE || ap1->type=
3890: 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 20  =RD_RESOLVED || 
38a0: 61 70 31 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c  ap1->type==CONFL
38b0: 49 43 54 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ICT);.    assert
38c0: 28 20 61 70 32 2d 3e 74 79 70 65 3d 3d 52 45 44  ( ap2->type==RED
38d0: 55 43 45 20 7c 7c 20 61 70 32 2d 3e 74 79 70 65  UCE || ap2->type
38e0: 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==RD_RESOLVED ||
38f0: 20 61 70 32 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46   ap2->type==CONF
3900: 4c 49 43 54 29 3b 0a 20 20 20 20 72 63 20 3d 20  LICT);.    rc = 
3910: 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78  ap1->x.rp->index
3920: 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e   - ap2->x.rp->in
3930: 64 65 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  dex;.  }.  retur
3940: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  n rc;.}../* Sort
3950: 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20   parser actions 
3960: 2a 2f 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  */.struct action
3970: 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 61 70   *Action_sort(ap
3980: 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ).struct action 
3990: 2a 61 70 3b 0a 7b 0a 20 20 61 70 20 3d 20 28 73  *ap;.{.  ap = (s
39a0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d  truct action *)m
39b0: 73 6f 72 74 28 28 63 68 61 72 20 2a 29 61 70 2c  sort((char *)ap,
39c0: 28 63 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e 65  (char **)&ap->ne
39d0: 78 74 2c 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20  xt,actioncmp);. 
39e0: 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76   return ap;.}..v
39f0: 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 61  oid Action_add(a
3a00: 70 70 2c 74 79 70 65 2c 73 70 2c 61 72 67 29 0a  pp,type,sp,arg).
3a10: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2a  struct action **
3a20: 61 70 70 3b 0a 65 6e 75 6d 20 65 5f 61 63 74 69  app;.enum e_acti
3a30: 6f 6e 20 74 79 70 65 3b 0a 73 74 72 75 63 74 20  on type;.struct 
3a40: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 63 68 61 72  symbol *sp;.char
3a50: 20 2a 61 72 67 3b 0a 7b 0a 20 20 73 74 72 75 63   *arg;.{.  struc
3a60: 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a 20  t action *new;. 
3a70: 20 6e 65 77 20 3d 20 41 63 74 69 6f 6e 5f 6e 65   new = Action_ne
3a80: 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78 74  w();.  new->next
3a90: 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20   = *app;.  *app 
3aa0: 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e 74 79  = new;.  new->ty
3ab0: 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e 65 77  pe = type;.  new
3ac0: 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69 66 28  ->sp = sp;.  if(
3ad0: 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a   type==SHIFT ){.
3ae0: 20 20 20 20 6e 65 77 2d 3e 78 2e 73 74 70 20 3d      new->x.stp =
3af0: 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
3b00: 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )arg;.  }else{. 
3b10: 20 20 20 6e 65 77 2d 3e 78 2e 72 70 20 3d 20 28     new->x.rp = (
3b20: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29 61 72  struct rule *)ar
3b30: 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  g;.  }.}./******
3b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b50: 20 4e 65 77 20 63 6f 64 65 20 74 6f 20 69 6d 70   New code to imp
3b60: 6c 65 6d 65 6e 74 20 74 68 65 20 22 61 63 74 74  lement the "actt
3b70: 61 62 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a 2a 2a  ab" module *****
3b80: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  ******/./*.** Th
3b90: 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d  is module implem
3ba0: 65 6e 74 73 20 72 6f 75 74 69 6e 65 73 20 75 73  ents routines us
3bb0: 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  e to construct t
3bc0: 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74  he yy_action[] t
3bd0: 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  able..*/../*.** 
3be0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
3bf0: 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65   yy_action table
3c00: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
3c10: 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  ion is an instan
3c20: 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c  ce of.** the fol
3c30: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
3c40: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
3c50: 63 74 20 61 63 74 74 61 62 20 61 63 74 74 61 62  ct acttab acttab
3c60: 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61 62 20  ;.struct acttab 
3c70: 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b  {.  int nAction;
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
3ca0: 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41 63 74  ed slots in aAct
3cb0: 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ion[] */.  int n
3cc0: 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20  ActionAlloc;    
3cd0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73          /* Slots
3ce0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
3cf0: 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74  Action[] */.  st
3d00: 72 75 63 74 20 7b 0a 20 20 20 20 69 6e 74 20 6c  ruct {.    int l
3d10: 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20  ookahead;       
3d20: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
3d30: 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  f the lookahead 
3d40: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  token */.    int
3d50: 20 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20   action;        
3d60: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f          /* Actio
3d70: 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65  n to take on the
3d80: 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64   given lookahead
3d90: 20 2a 2f 0a 20 20 7d 20 2a 61 41 63 74 69 6f 6e   */.  } *aAction
3da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3db0: 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61 63 74     /* The yy_act
3dc0: 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e 64 65  ion[] table unde
3dd0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
3de0: 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68 65 61  /.    *aLookahea
3df0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3e00: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 65 77   /* A single new
3e10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
3e20: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f 6f 6b   */.  int mnLook
3e30: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
3e40: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 4c     /* Minimum aL
3e50: 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61  ookahead[].looka
3e60: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e  head */.  int mn
3e70: 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Action;         
3e80: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e         /* Action
3e90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3ea0: 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a   mnLookahead */.
3eb0: 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68 65 61    int mxLookahea
3ec0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
3ed0: 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f 6b 61  * Maximum aLooka
3ee0: 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  head[].lookahead
3ef0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
3f00: 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  head;           
3f10: 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f 74 73     /* Used slots
3f20: 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d   in aLookahead[]
3f30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61   */.  int nLooka
3f40: 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20 20 20  headAlloc;      
3f50: 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f     /* Slots allo
3f60: 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b 61 68  cated in aLookah
3f70: 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  ead[] */.};../* 
3f80: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
3f90: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3fa0: 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61  the yy_action ta
3fb0: 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61  ble */.#define a
3fc0: 63 74 74 61 62 5f 73 69 7a 65 28 58 29 20 28 28  cttab_size(X) ((
3fd0: 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a 2f 2a  X)->nAction)../*
3fe0: 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74   The value for t
3ff0: 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e  he N-th entry in
4000: 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a 23 64   yy_action */.#d
4010: 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79 61  efine acttab_yya
4020: 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28 58 29  ction(X,N)  ((X)
4030: 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61 63 74  ->aAction[N].act
4040: 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c  ion)../* The val
4050: 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20  ue for the N-th 
4060: 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f 6f 6b  entry in yy_look
4070: 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ahead */.#define
4080: 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68   acttab_yylookah
4090: 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e  ead(X,N)  ((X)->
40a0: 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b 61  aAction[N].looka
40b0: 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65 20 61  head)../* Free a
40c0: 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
40d0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
40e0: 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a 76 6f  ven acttab */.vo
40f0: 69 64 20 61 63 74 74 61 62 5f 66 72 65 65 28 61  id acttab_free(a
4100: 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66 72 65  cttab *p){.  fre
4110: 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20 29 3b  e( p->aAction );
4120: 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c 6f 6f  .  free( p->aLoo
4130: 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72 65 65  kahead );.  free
4140: 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c  ( p );.}../* All
4150: 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63 74 74  ocate a new actt
4160: 61 62 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ab structure */.
4170: 61 63 74 74 61 62 20 2a 61 63 74 74 61 62 5f 61  acttab *acttab_a
4180: 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20 61 63  lloc(void){.  ac
4190: 74 74 61 62 20 2a 70 20 3d 20 6d 61 6c 6c 6f 63  ttab *p = malloc
41a0: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
41b0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
41c0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
41d0: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
41e0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
41f0: 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22 29 3b  a new acttab.");
4200: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
4210: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  }.  memset(p, 0,
4220: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
4230: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20  return p;.}../* 
4240: 41 64 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e  Add a new action
4250: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
4260: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a  transaction set.
4270: 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61  */.void acttab_a
4280: 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c  ction(acttab *p,
4290: 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20   int lookahead, 
42a0: 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69  int action){.  i
42b0: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
42c0: 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41  >=p->nLookaheadA
42d0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
42e0: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b  LookaheadAlloc +
42f0: 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f  = 25;.    p->aLo
4300: 6f 6b 61 68 65 61 64 20 3d 20 72 65 61 6c 6c 6f  okahead = reallo
4310: 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  c( p->aLookahead
4320: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4340: 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68  izeof(p->aLookah
4350: 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b  ead[0])*p->nLook
4360: 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20 20  aheadAlloc );.  
4370: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
4380: 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ead==0 ){.      
4390: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
43a0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22  malloc failed\n"
43b0: 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  );.      exit(1)
43c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
43d0: 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d  ( p->nLookahead=
43e0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c  =0 ){.    p->mxL
43f0: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
4400: 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c  head;.    p->mnL
4410: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
4420: 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41  head;.    p->mnA
4430: 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a  ction = action;.
4440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
4450: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c   p->mxLookahead<
4460: 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e 6d  lookahead ) p->m
4470: 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  xLookahead = loo
4480: 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66 28 20  kahead;.    if( 
4490: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c  p->mnLookahead>l
44a0: 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20  ookahead ){.    
44b0: 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64    p->mnLookahead
44c0: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
44d0: 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20      p->mnAction 
44e0: 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a  = action;.    }.
44f0: 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68    }.  p->aLookah
4500: 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ead[p->nLookahea
4510: 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  d].lookahead = l
4520: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e 61  ookahead;.  p->a
4530: 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f  Lookahead[p->nLo
4540: 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e 20  okahead].action 
4550: 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e  = action;.  p->n
4560: 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a  Lookahead++;.}..
4570: 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 72  /*.** Add the tr
4580: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62 75  ansaction set bu
4590: 69 6c 74 20 75 70 20 77 69 74 68 20 70 72 69 6f  ilt up with prio
45a0: 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61  r calls to actta
45b0: 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e  b_action().** in
45c0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 61  to the current a
45d0: 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68  ction table.  Th
45e0: 65 6e 20 72 65 73 65 74 20 74 68 65 20 74 72 61  en reset the tra
45f0: 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62 61 63  nsaction set bac
4600: 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74 79  k.** to an empty
4610: 20 73 65 74 20 69 6e 20 70 72 65 70 61 72 61 74   set in preparat
4620: 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20 72 6f  ion for a new ro
4630: 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f 61 63  und of acttab_ac
4640: 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a  tion() calls..**
4650: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
4660: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 61  ffset into the a
4670: 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74  ction table of t
4680: 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69  he new transacti
4690: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74 61  on..*/.int actta
46a0: 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61 62 20  b_insert(acttab 
46b0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *p){.  int i, j,
46c0: 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28   k, n;.  assert(
46d0: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30   p->nLookahead>0
46e0: 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   );..  /* Make s
46f0: 75 72 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75  ure we have enou
4700: 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  gh space to hold
4710: 20 74 68 65 20 65 78 70 61 6e 64 65 64 20 61 63   the expanded ac
4720: 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20  tion table.  ** 
4730: 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73  in the worst cas
4740: 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20 63 61  e.  The worst ca
4750: 73 65 20 6f 63 63 75 72 73 20 69 66 20 74 68 65  se occurs if the
4760: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
4770: 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70  .  ** must be ap
4780: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75  pended to the cu
4790: 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62  rrent action tab
47a0: 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d  le.  */.  n = p-
47b0: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 31  >mxLookahead + 1
47c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63 74 69  ;.  if( p->nActi
47d0: 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41 63  on + n >= p->nAc
47e0: 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  tionAlloc ){.   
47f0: 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20   int oldAlloc = 
4800: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b  p->nActionAlloc;
4810: 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e 41  .    p->nActionA
4820: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f  lloc = p->nActio
4830: 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74 69  n + n + p->nActi
4840: 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20 20  onAlloc + 20;.  
4850: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20 72    p->aAction = r
4860: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69  ealloc( p->aActi
4870: 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
4890: 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b  zeof(p->aAction[
48a0: 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  0])*p->nActionAl
48b0: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  loc);.    if( p-
48c0: 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20  >aAction==0 ){. 
48d0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
48e0: 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
48f0: 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ed\n");.      ex
4900: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
4910: 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b   for(i=oldAlloc;
4920: 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c   i<p->nActionAll
4930: 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  oc; i++){.      
4940: 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f  p->aAction[i].lo
4950: 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20  okahead = -1;.  
4960: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69      p->aAction[i
4970: 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20  ].action = -1;. 
4980: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
4990: 63 61 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67  can the existing
49a0: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f   action table lo
49b0: 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66  oking for an off
49c0: 73 65 74 20 77 68 65 72 65 20 77 65 20 63 61 6e  set where we can
49d0: 0a 20 20 2a 2a 20 69 6e 73 65 72 74 20 74 68 65  .  ** insert the
49e0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
49f0: 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c 20  tion set.  Fall 
4a00: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
4a10: 77 68 65 6e 20 74 68 61 74 0a 20 20 2a 2a 20 6f  when that.  ** o
4a20: 66 66 73 65 74 20 69 73 20 66 6f 75 6e 64 2e 20  ffset is found. 
4a30: 20 49 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61   In the worst ca
4a40: 73 65 2c 20 77 65 20 66 61 6c 6c 20 6f 75 74 20  se, we fall out 
4a50: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e  of the loop when
4a60: 0a 20 20 2a 2a 20 69 20 72 65 61 63 68 65 73 20  .  ** i reaches 
4a70: 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63  p->nAction, whic
4a80: 68 20 6d 65 61 6e 73 20 77 65 20 61 70 70 65 6e  h means we appen
4a90: 64 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61  d the new transa
4aa0: 63 74 69 6f 6e 20 73 65 74 2e 0a 20 20 2a 2a 0a  ction set..  **.
4ab0: 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e    ** i is the in
4ac0: 64 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f  dex in p->aActio
4ad0: 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c  n[] where p->mnL
4ae0: 6f 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65  ookahead is inse
4af0: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  rted..  */.  for
4b00: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63 74 69  (i=0; i<p->nActi
4b10: 6f 6e 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61  on+p->mnLookahea
4b20: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
4b30: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
4b40: 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20 20  ookahead<0 ){.  
4b50: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
4b60: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
4b70: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20  +){.        k = 
4b80: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
4b90: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
4ba0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
4bb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30  .        if( k<0
4bc0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4bd0: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
4be0: 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30  [k].lookahead>=0
4bf0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4c00: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d  }.      if( j<p-
4c10: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f  >nLookahead ) co
4c20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
4c30: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74  r(j=0; j<p->nAct
4c40: 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ion; j++){.     
4c50: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
4c60: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[j].lookahead==
4c70: 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  j+p->mnLookahead
4c80: 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  -i ) break;.    
4c90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
4ca0: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20  =p->nAction ){. 
4cb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f         break;  /
4cc0: 2a 20 46 69 74 73 20 69 6e 20 65 6d 70 74 79 20  * Fits in empty 
4cd0: 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20 20 7d  slots */.      }
4ce0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
4cf0: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f  ->aAction[i].loo
4d00: 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f  kahead==p->mnLoo
4d10: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
4d20: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69  if( p->aAction[i
4d30: 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41  ].action!=p->mnA
4d40: 63 74 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65  ction ) continue
4d50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
4d60: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
4d70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4d80: 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  k = p->aLookahea
4d90: 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d  d[j].lookahead -
4da0: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
4db0: 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + i;.        if(
4dc0: 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41   k<0 || k>=p->nA
4dd0: 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20  ction ) break;. 
4de0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c         if( p->aL
4df0: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
4e00: 61 68 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f  ahead!=p->aActio
4e10: 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29  n[k].lookahead )
4e20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4e30: 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  if( p->aLookahea
4e40: 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e  d[j].action!=p->
4e50: 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f  aAction[k].actio
4e60: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  n ) break;.     
4e70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70   }.      if( j<p
4e80: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63  ->nLookahead ) c
4e90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e  ontinue;.      n
4ea0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
4eb0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
4ec0: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
4ed0: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4ee0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29  j].lookahead<0 )
4ef0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
4f00: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
4f10: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[j].lookahead==
4f20: 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  j+p->mnLookahead
4f30: 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  -i ) n++;.      
4f40: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70  }.      if( n==p
4f50: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a  ->nLookahead ){.
4f60: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20          break;  
4f70: 2f 2a 20 53 61 6d 65 20 61 73 20 61 20 70 72 69  /* Same as a pri
4f80: 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  or transaction s
4f90: 65 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  et */.      }.  
4fa0: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73    }.  }.  /* Ins
4fb0: 65 72 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ert transaction 
4fc0: 73 65 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20  set at index i. 
4fd0: 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  */.  for(j=0; j<
4fe0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a  p->nLookahead; j
4ff0: 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e  ++){.    k = p->
5000: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
5010: 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c  okahead - p->mnL
5020: 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20  ookahead + i;.  
5030: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20    p->aAction[k] 
5040: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
5050: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70  j];.    if( k>=p
5060: 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e  ->nAction ) p->n
5070: 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20  Action = k+1;.  
5080: 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  }.  p->nLookahea
5090: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74  d = 0;..  /* Ret
50a0: 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74  urn the offset t
50b0: 68 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20  hat is added to 
50c0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
50d0: 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
50e0: 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74  e.  ** index int
50f0: 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74  o yy_action of t
5100: 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72  he action */.  r
5110: 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c  eturn i - p->mnL
5120: 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a  ookahead;.}../**
5130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5140: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
5150: 6c 65 20 22 61 73 73 65 72 74 2e 63 22 20 2a 2a  le "assert.c" **
5160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
5180: 2a 20 41 20 6d 6f 72 65 20 65 66 66 69 63 69 65  * A more efficie
5190: 6e 74 20 77 61 79 20 6f 66 20 68 61 6e 64 6c 69  nt way of handli
51a0: 6e 67 20 61 73 73 65 72 74 69 6f 6e 73 2e 0a 2a  ng assertions..*
51b0: 2f 0a 76 6f 69 64 20 6d 79 61 73 73 65 72 74 28  /.void myassert(
51c0: 66 69 6c 65 2c 6c 69 6e 65 29 0a 63 68 61 72 20  file,line).char 
51d0: 2a 66 69 6c 65 3b 0a 69 6e 74 20 6c 69 6e 65 3b  *file;.int line;
51e0: 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64  .{.  fprintf(std
51f0: 65 72 72 2c 22 41 73 73 65 72 74 69 6f 6e 20 66  err,"Assertion f
5200: 61 69 6c 65 64 20 6f 6e 20 6c 69 6e 65 20 25 64  ailed on line %d
5210: 20 6f 66 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c   of file \"%s\"\
5220: 6e 22 2c 6c 69 6e 65 2c 66 69 6c 65 29 3b 0a 20  n",line,file);. 
5230: 20 65 78 69 74 28 31 29 3b 0a 7d 0a 2f 2a 2a 2a   exit(1);.}./***
5240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5250: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
5260: 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a  e "build.c" ****
5270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
5290: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e   Routines to con
52a0: 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69  struction the fi
52b0: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
52c0: 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  ne for the LEMON
52d0: 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72  .** parser gener
52e0: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e  ator..*/../* Fin
52f0: 64 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  d a precedence s
5300: 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72  ymbol of every r
5310: 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ule in the gramm
5320: 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65  ar..** .** Those
5330: 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76   rules which hav
5340: 65 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  e a precedence s
5350: 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74  ymbol coded in t
5360: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d  he input.** gram
5370: 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b  mar using the "[
5380: 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75  symbol]" constru
5390: 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20  ct will already 
53a0: 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e  have the.** rp->
53b0: 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69  precsym field fi
53c0: 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c  lled.  Other rul
53d0: 65 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72  es take as their
53e0: 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73   precedence.** s
53f0: 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20  ymbol the first 
5400: 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20  RHS symbol with 
5410: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
5420: 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a  ence.  If there.
5430: 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73  ** are not RHS s
5440: 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65  ymbols with a de
5450: 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65  fined precedence
5460: 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65  , the precedence
5470: 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64  .** symbol field
5480: 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a   is left blank..
5490: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65  */.void FindRule
54a0: 50 72 65 63 65 64 65 6e 63 65 73 28 78 70 29 0a  Precedences(xp).
54b0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70  struct lemon *xp
54c0: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ;.{.  struct rul
54d0: 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d  e *rp;.  for(rp=
54e0: 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  xp->rule; rp; rp
54f0: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
5500: 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d  if( rp->precsym=
5510: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
5520: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  i, j;.      for(
5530: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20  i=0; i<rp->nrhs 
5540: 26 26 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d  && rp->precsym==
5550: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
5560: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
5570: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
5580: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d  .        if( sp-
5590: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
55a0: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
55b0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d    for(j=0; j<sp-
55c0: 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
55e0: 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70  sp->subsym[j]->p
55f0: 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rec>=0 ){.      
5600: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
5610: 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d  sym = sp->subsym
5620: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [j];.           
5630: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5650: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
5660: 65 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d  e if( sp->prec>=
5670: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
5680: 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72 70 2d  p->precsym = rp-
5690: 3e 72 68 73 5b 69 5d 3b 0a 09 7d 0a 20 20 20 20  >rhs[i];..}.    
56a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
56b0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69  return;.}../* Fi
56c0: 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e  nd all nontermin
56d0: 61 6c 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67  als which will g
56e0: 65 6e 65 72 61 74 65 20 74 68 65 20 65 6d 70 74  enerate the empt
56f0: 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65  y string..** The
5700: 6e 20 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f  n go back and co
5710: 6d 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20  mpute the first 
5720: 73 65 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f  sets of every no
5730: 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68  nterminal..** Th
5740: 65 20 66 69 72 73 74 20 73 65 74 20 69 73 20 74  e first set is t
5750: 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65  he set of all te
5760: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77  rminal symbols w
5770: 68 69 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a  hich can begin.*
5780: 2a 20 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72  * a string gener
5790: 61 74 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e  ated by that non
57a0: 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69  terminal..*/.voi
57b0: 64 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28  d FindFirstSets(
57c0: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
57d0: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
57e0: 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74  t i, j;.  struct
57f0: 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74   rule *rp;.  int
5800: 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f   progress;..  fo
5810: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
5820: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
5830: 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b    lemp->symbols[
5840: 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 42 5f 46  i]->lambda = B_F
5850: 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ALSE;.  }.  for(
5860: 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i=lemp->ntermina
5870: 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  l; i<lemp->nsymb
5880: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  ol; i++){.    le
5890: 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
58a0: 66 69 72 73 74 73 65 74 20 3d 20 53 65 74 4e 65  firstset = SetNe
58b0: 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  w();.  }..  /* F
58c0: 69 72 73 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c  irst compute all
58d0: 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f   lambdas */.  do
58e0: 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d  {.    progress =
58f0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c   0;.    for(rp=l
5900: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
5910: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
5920: 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e     if( rp->lhs->
5930: 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74 69 6e 75  lambda ) continu
5940: 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
5950: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
5960: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 73 74 72  +){.         str
5970: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
5980: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
5990: 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79        if( sp->ty
59a0: 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  pe!=TERMINAL || 
59b0: 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41  sp->lambda==B_FA
59c0: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  LSE ) break;.   
59d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
59e0: 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20  ==rp->nrhs ){.  
59f0: 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c        rp->lhs->l
5a00: 61 6d 62 64 61 20 3d 20 42 5f 54 52 55 45 3b 0a  ambda = B_TRUE;.
5a10: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
5a20: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
5a30: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
5a40: 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a 20  ogress );..  /* 
5a50: 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20  Now compute all 
5a60: 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20  first sets */.  
5a70: 64 6f 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73  do{.    struct s
5a80: 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a  ymbol *s1, *s2;.
5a90: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30      progress = 0
5aa0: 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d  ;.    for(rp=lem
5ab0: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
5ac0: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  rp->next){.     
5ad0: 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20   s1 = rp->lhs;. 
5ae0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5af0: 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
5b00: 20 20 20 20 20 20 20 20 73 32 20 3d 20 72 70 2d          s2 = rp-
5b10: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
5b20: 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 54   if( s2->type==T
5b30: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
5b40: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d       progress +=
5b50: 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73   SetAdd(s1->firs
5b60: 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29 3b  tset,s2->index);
5b70: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5b80: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
5b90: 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d 55  if( s2->type==MU
5ba0: 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
5bb0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
5bc0: 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<s2->nsubsym;
5bd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
5be0: 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53     progress += S
5bf0: 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73  etAdd(s1->firsts
5c00: 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a 5d  et,s2->subsym[j]
5c10: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
5c20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5c30: 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 20 69 66  break;..}else if
5c40: 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20 20 20  ( s1==s2 ){.    
5c50: 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e 6c 61        if( s1->la
5c60: 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29 20  mbda==B_FALSE ) 
5c70: 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 7b 0a 20  break;..}else{. 
5c80: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
5c90: 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31  s += SetUnion(s1
5ca0: 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 66  ->firstset,s2->f
5cb0: 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20  irstset);.      
5cc0: 20 20 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62      if( s2->lamb
5cd0: 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29 20 62 72  da==B_FALSE ) br
5ce0: 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a  eak;..}.      }.
5cf0: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
5d00: 70 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 65  progress );.  re
5d10: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  turn;.}../* Comp
5d20: 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74  ute all LR(0) st
5d30: 61 74 65 73 20 66 6f 72 20 74 68 65 20 67 72 61  ates for the gra
5d40: 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20  mmar.  Links.** 
5d50: 61 72 65 20 61 64 64 65 64 20 74 6f 20 62 65 74  are added to bet
5d60: 77 65 65 6e 20 73 6f 6d 65 20 73 74 61 74 65 73  ween some states
5d70: 20 73 6f 20 74 68 61 74 20 74 68 65 20 4c 52 28   so that the LR(
5d80: 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a  1) follow sets.*
5d90: 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65  * can be compute
5da0: 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56  d later..*/.PRIV
5db0: 41 54 45 20 73 74 72 75 63 74 20 73 74 61 74 65  ATE struct state
5dc0: 20 2a 67 65 74 73 74 61 74 65 28 2f 2a 20 73 74   *getstate(/* st
5dd0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29  ruct lemon * */)
5de0: 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20 72 65  ;  /* forward re
5df0: 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20  ference */.void 
5e00: 46 69 6e 64 53 74 61 74 65 73 28 6c 65 6d 70 29  FindStates(lemp)
5e10: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
5e20: 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp;.{.  struct 
5e30: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74  symbol *sp;.  st
5e40: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a  ruct rule *rp;..
5e50: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69    Configlist_ini
5e60: 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  t();..  /* Find 
5e70: 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  the start symbol
5e80: 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
5e90: 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20  start ){.    sp 
5ea0: 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65  = Symbol_find(le
5eb0: 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20  mp->start);.    
5ec0: 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20  if( sp==0 ){.   
5ed0: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
5ee0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54  ->filename,0,."T
5ef0: 68 65 20 73 70 65 63 69 66 69 65 64 20 73 74 61  he specified sta
5f00: 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22  rt symbol \"%s\"
5f10: 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e   is not \.in a n
5f20: 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68  onterminal of th
5f30: 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73  e grammar.  \"%s
5f40: 5c 22 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  \" will be used 
5f50: 61 73 20 74 68 65 20 73 74 61 72 74 20 5c 0a 73  as the start \.s
5f60: 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c  ymbol instead.",
5f70: 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70  lemp->start,lemp
5f80: 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d  ->rule->lhs->nam
5f90: 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e  e);.      lemp->
5fa0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
5fb0: 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c    sp = lemp->rul
5fc0: 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a 20 20  e->lhs;.    }.  
5fd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20  }else{.    sp = 
5fe0: 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b  lemp->rule->lhs;
5ff0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
6000: 73 75 72 65 20 74 68 65 20 73 74 61 72 74 20 73  sure the start s
6010: 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63  ymbol doesn't oc
6020: 63 75 72 20 6f 6e 20 74 68 65 20 72 69 67 68 74  cur on the right
6030: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 0a 20 20  -hand side of.  
6040: 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20 20 52 65  ** any rule.  Re
6050: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
6060: 20 69 74 20 64 6f 65 73 2e 20 20 28 59 41 43 43   it does.  (YACC
6070: 20 77 6f 75 6c 64 20 67 65 6e 65 72 61 74 65 20   would generate 
6080: 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72 74  a new.  ** start
6090: 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20   symbol in this 
60a0: 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28  case.) */.  for(
60b0: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
60c0: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
60d0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
60e0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
60f0: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
6100: 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d   if( rp->rhs[i]=
6110: 3d 73 70 20 29 7b 20 20 20 2f 2a 20 46 49 58 20  =sp ){   /* FIX 
6120: 4d 45 3a 20 20 44 65 61 6c 20 77 69 74 68 20 6d  ME:  Deal with m
6130: 75 6c 74 69 74 65 72 6d 69 6e 61 6c 73 20 2a 2f  ultiterminals */
6140: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
6150: 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
6160: 2c 30 2c 0a 22 54 68 65 20 73 74 61 72 74 20 73  ,0,."The start s
6170: 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63 63  ymbol \"%s\" occ
6180: 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69 67  urs on the \.rig
6190: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
61a0: 61 20 72 75 6c 65 2e 20 54 68 69 73 20 77 69 6c  a rule. This wil
61b0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 20 70 61  l result in a pa
61c0: 72 73 65 72 20 77 68 69 63 68 20 5c 0a 64 6f 65  rser which \.doe
61d0: 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70 65  s not work prope
61e0: 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b  rly.",sp->name);
61f0: 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  .        lemp->e
6200: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
6210: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
6220: 2f 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e  /* The basis con
6230: 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 20 66  figuration set f
6240: 6f 72 20 74 68 65 20 66 69 72 73 74 20 73 74 61  or the first sta
6250: 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20 72  te.  ** is all r
6260: 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65 20  ules which have 
6270: 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  the start symbol
6280: 20 61 73 20 74 68 65 69 72 0a 20 20 2a 2a 20 6c   as their.  ** l
6290: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 2a 2f  eft-hand side */
62a0: 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72 75  .  for(rp=sp->ru
62b0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
62c0: 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 73 74 72  extlhs){.    str
62d0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63  uct config *newc
62e0: 66 70 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d  fp;.    newcfp =
62f0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62   Configlist_addb
6300: 61 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20  asis(rp,0);.    
6310: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
6320: 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ws,0);.  }..  /*
6330: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72   Compute the fir
6340: 73 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f  st state.  All o
6350: 74 68 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c  ther states will
6360: 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65   be.  ** compute
6370: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
6380: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75  during the compu
6390: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  tation of the fi
63a0: 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68  rst one..  ** Th
63b0: 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
63c0: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
63d0: 73 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65  state is not use
63e0: 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  d. */.  (void)ge
63f0: 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20  tstate(lemp);.  
6400: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
6410: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6420: 6f 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  o a state which 
6430: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
6440: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
6450: 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20  n.** list which 
6460: 68 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66  has been built f
6470: 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e  rom calls to Con
6480: 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a  figlist_add..*/.
6490: 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69  PRIVATE void bui
64a0: 6c 64 73 68 69 66 74 73 28 2f 2a 20 73 74 72 75  ldshifts(/* stru
64b0: 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75  ct lemon *, stru
64c0: 63 74 20 73 74 61 74 65 20 2a 20 2a 2f 29 3b 20  ct state * */); 
64d0: 2f 2a 20 46 6f 72 77 64 20 72 65 66 20 2a 2f 0a  /* Forwd ref */.
64e0: 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73  PRIVATE struct s
64f0: 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 6c  tate *getstate(l
6500: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
6510: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72  n *lemp;.{.  str
6520: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c  uct config *cfp,
6530: 20 2a 62 70 3b 0a 20 20 73 74 72 75 63 74 20 73   *bp;.  struct s
6540: 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a  tate *stp;..  /*
6550: 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6f 72   Extract the sor
6560: 74 65 64 20 62 61 73 69 73 20 6f 66 20 74 68 65  ted basis of the
6570: 20 6e 65 77 20 73 74 61 74 65 2e 20 20 54 68 65   new state.  The
6580: 20 62 61 73 69 73 20 77 61 73 20 63 6f 6e 73 74   basis was const
6590: 72 75 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 70  ructed.  ** by p
65a0: 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 22 43  rior calls to "C
65b0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
65c0: 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66  is()". */.  Conf
65d0: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
65e0: 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f 6e 66 69  ();.  bp = Confi
65f0: 67 6c 69 73 74 5f 62 61 73 69 73 28 29 3b 0a 0a  glist_basis();..
6600: 20 20 2f 2a 20 47 65 74 20 61 20 73 74 61 74 65    /* Get a state
6610: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 62   with the same b
6620: 61 73 69 73 20 2a 2f 0a 20 20 73 74 70 20 3d 20  asis */.  stp = 
6630: 53 74 61 74 65 5f 66 69 6e 64 28 62 70 29 3b 0a  State_find(bp);.
6640: 20 20 69 66 28 20 73 74 70 20 29 7b 0a 20 20 20    if( stp ){.   
6650: 20 2f 2a 20 41 20 73 74 61 74 65 20 77 69 74 68   /* A state with
6660: 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73 20   the same basis 
6670: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 21 20  already exists! 
6680: 20 43 6f 70 79 20 61 6c 6c 20 74 68 65 20 66 6f   Copy all the fo
6690: 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20 2a 2a 20  llow-set.    ** 
66a0: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
66b0: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65  s from the state
66c0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
66d0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ion into the.   
66e0: 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20   ** preexisting 
66f0: 73 74 61 74 65 2c 20 74 68 65 6e 20 72 65 74 75  state, then retu
6700: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
6710: 74 68 65 20 70 72 65 65 78 69 73 74 69 6e 67 20  the preexisting 
6720: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 72  state */.    str
6730: 75 63 74 20 63 6f 6e 66 69 67 20 2a 78 2c 20 2a  uct config *x, *
6740: 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d 62 70 2c  y;.    for(x=bp,
6750: 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78 20 26 26   y=stp->bp; x &&
6760: 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20 79 3d 79   y; x=x->bp, y=y
6770: 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20 50 6c 69  ->bp){.      Pli
6780: 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62 70 6c 70  nk_copy(&y->bplp
6790: 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20 20 20 20  ,x->bplp);.     
67a0: 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 78 2d   Plink_delete(x-
67b0: 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20 20 78 2d  >fplp);.      x-
67c0: 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70 6c 70 20  >fplp = x->bplp 
67d0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  = 0;.    }.    c
67e0: 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fp = Configlist_
67f0: 72 65 74 75 72 6e 28 29 3b 0a 20 20 20 20 43 6f  return();.    Co
6800: 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 63 66 70  nfiglist_eat(cfp
6810: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6820: 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c 79 20 69  /* This really i
6830: 73 20 61 20 6e 65 77 20 73 74 61 74 65 2e 20 20  s a new state.  
6840: 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 74 68  Construct all th
6850: 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a 20 20 20  e details */.   
6860: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73   Configlist_clos
6870: 75 72 65 28 6c 65 6d 70 29 3b 20 20 20 20 2f 2a  ure(lemp);    /*
6880: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   Compute the con
6890: 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75  figuration closu
68a0: 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  re */.    Config
68b0: 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20 20 20 20  list_sort();    
68c0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 74         /* Sort t
68d0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
68e0: 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20   closure */.    
68f0: 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfp = Configlist
6900: 5f 72 65 74 75 72 6e 28 29 3b 20 20 20 2f 2a 20  _return();   /* 
6910: 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  Get a pointer to
6920: 20 74 68 65 20 63 6f 6e 66 69 67 20 6c 69 73 74   the config list
6930: 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 53 74   */.    stp = St
6940: 61 74 65 5f 6e 65 77 28 29 3b 20 20 20 20 20 20  ate_new();      
6950: 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 74       /* A new st
6960: 61 74 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ate structure */
6970: 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b  .    MemoryCheck
6980: 28 73 74 70 29 3b 0a 20 20 20 20 73 74 70 2d 3e  (stp);.    stp->
6990: 62 70 20 3d 20 62 70 3b 20 20 20 20 20 20 20 20  bp = bp;        
69a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d          /* Remem
69b0: 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ber the configur
69c0: 61 74 69 6f 6e 20 62 61 73 69 73 20 2a 2f 0a 20  ation basis */. 
69d0: 20 20 20 73 74 70 2d 3e 63 66 70 20 3d 20 63 66     stp->cfp = cf
69e0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
69f0: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
6a00: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c  configuration cl
6a10: 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 73 74 70  osure */.    stp
6a20: 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20 6c 65 6d  ->statenum = lem
6a30: 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a 20  p->nstate++; /* 
6a40: 45 76 65 72 79 20 73 74 61 74 65 20 67 65 74 73  Every state gets
6a50: 20 61 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62   a sequence numb
6a60: 65 72 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61  er */.    stp->a
6a70: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
6a80: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 63 74         /* No act
6a90: 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a 20 20  ions, yet. */.  
6aa0: 20 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73    State_insert(s
6ab0: 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20 20 20 2f  tp,stp->bp);   /
6ac0: 2a 20 41 64 64 20 74 6f 20 74 68 65 20 73 74 61  * Add to the sta
6ad0: 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  te table */.    
6ae0: 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65 6d 70  buildshifts(lemp
6af0: 2c 73 74 70 29 3b 20 20 20 20 20 20 20 2f 2a 20  ,stp);       /* 
6b00: 52 65 63 75 72 73 69 76 65 6c 79 20 63 6f 6d 70  Recursively comp
6b10: 75 74 65 20 73 75 63 63 65 73 73 6f 72 20 73 74  ute successor st
6b20: 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  ates */.  }.  re
6b30: 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a  turn stp;.}../*.
6b40: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
6b50: 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 61 72  f two symbols ar
6b60: 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 69  e the same..*/.i
6b70: 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 61  nt same_symbol(a
6b80: 2c 62 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  ,b).struct symbo
6b90: 6c 20 2a 61 3b 0a 73 74 72 75 63 74 20 73 79 6d  l *a;.struct sym
6ba0: 62 6f 6c 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20  bol *b;.{.  int 
6bb0: 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20  i;.  if( a==b ) 
6bc0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
6bd0: 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45  a->type!=MULTITE
6be0: 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20  RMINAL ) return 
6bf0: 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65  0;.  if( b->type
6c00: 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  !=MULTITERMINAL 
6c10: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
6c20: 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d  ( a->nsubsym!=b-
6c30: 3e 6e 73 75 62 73 79 6d 20 29 20 72 65 74 75 72  >nsubsym ) retur
6c40: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
6c50: 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b  i<a->nsubsym; i+
6c60: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73  +){.    if( a->s
6c70: 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62  ubsym[i]!=b->sub
6c80: 73 79 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  sym[i] ) return 
6c90: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
6ca0: 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75  1;.}../* Constru
6cb0: 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72  ct all successor
6cc0: 20 73 74 61 74 65 73 20 74 6f 20 74 68 65 20 67   states to the g
6cd0: 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22  iven state.  A "
6ce0: 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74  successor".** st
6cf0: 61 74 65 20 69 73 20 61 6e 79 20 73 74 61 74 65  ate is any state
6d00: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 72 65   which can be re
6d10: 61 63 68 65 64 20 62 79 20 61 20 73 68 69 66 74  ached by a shift
6d20: 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56   action..*/.PRIV
6d30: 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68  ATE void buildsh
6d40: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 0a 73  ifts(lemp,stp).s
6d50: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
6d60: 70 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  p;.struct state 
6d70: 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  *stp;     /* The
6d80: 20 73 74 61 74 65 20 66 72 6f 6d 20 77 68 69 63   state from whic
6d90: 68 20 73 75 63 63 65 73 73 6f 72 73 20 61 72 65  h successors are
6da0: 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 7b 0a 20   computed */.{. 
6db0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
6dc0: 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  cfp;  /* For loo
6dd0: 70 69 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f  ping thru the co
6de0: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
6df0: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
6e00: 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20  t config *bcfp; 
6e10: 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72  /* For the inner
6e20: 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20   loop on config 
6e30: 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22  closure of "stp"
6e40: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
6e50: 66 69 67 20 2a 6e 65 77 3b 20 20 2f 2a 20 2a 2f  fig *new;  /* */
6e60: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
6e70: 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f   *sp;   /* Symbo
6e80: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
6e90: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
6ea0: 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20  tion "cfp" */.  
6eb0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62  struct symbol *b
6ec0: 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66  sp;  /* Symbol f
6ed0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74  ollowing the dot
6ee0: 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   in configuratio
6ef0: 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74  n "bcfp" */.  st
6f00: 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73  ruct state *news
6f10: 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  tp; /* A pointer
6f20: 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20   to a successor 
6f30: 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45  state */..  /* E
6f40: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
6f50: 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65  n becomes comple
6f60: 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74  te after it cont
6f70: 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63 63  ibutes to a succ
6f80: 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  essor.  ** state
6f90: 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c  .  Initially, al
6fa0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  l configurations
6fb0: 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20   are incomplete 
6fc0: 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70  */.  for(cfp=stp
6fd0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
6fe0: 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e  cfp->next) cfp->
6ff0: 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c  status = INCOMPL
7000: 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  ETE;..  /* Loop 
7010: 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66  through all conf
7020: 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  igurations of th
7030: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f  e state "stp" */
7040: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
7050: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
7060: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
7070: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
7080: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
7090: 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64  ue;    /* Alread
70a0: 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20  y used by inner 
70b0: 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  loop */.    if( 
70c0: 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72  cfp->dot>=cfp->r
70d0: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
70e0: 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68  ue;  /* Can't sh
70f0: 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ift this config 
7100: 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  */.    Configlis
7110: 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20 20  t_reset();      
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65 77  /* Reset the new
7140: 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20   config set */. 
7150: 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d     sp = cfp->rp-
7160: 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20  >rhs[cfp->dot]; 
7170: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7180: 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20  ymbol after the 
7190: 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  dot */..    /* F
71a0: 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75  or every configu
71b0: 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74  ration in the st
71c0: 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20  ate "stp" which 
71d0: 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22  has the symbol "
71e0: 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  sp".    ** follo
71f0: 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64  wing its dot, ad
7200: 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69  d the same confi
7210: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
7220: 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a  basis set under.
7230: 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
7240: 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68 65  ion but with the
7250: 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65   dot shifted one
7260: 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72   symbol to the r
7270: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ight. */.    for
7280: 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b  (bcfp=cfp; bcfp;
7290: 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74   bcfp=bcfp->next
72a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63 66  ){.      if( bcf
72b0: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
72c0: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ETE ) continue; 
72d0: 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73     /* Already us
72e0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
72f0: 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d  bcfp->dot>=bcfp-
7300: 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  >rp->nrhs ) cont
7310: 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73  inue; /* Can't s
7320: 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f  hift this one */
7330: 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63 66  .      bsp = bcf
7340: 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d  p->rp->rhs[bcfp-
7350: 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20  >dot];          
7360: 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61   /* Get symbol a
7370: 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20  fter dot */.    
7380: 20 20 69 66 28 20 21 73 61 6d 65 5f 73 79 6d 62    if( !same_symb
7390: 6f 6c 28 62 73 70 2c 73 70 29 20 29 20 63 6f 6e  ol(bsp,sp) ) con
73a0: 74 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20 4d  tinue;      /* M
73b0: 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20 66  ust be same as f
73c0: 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20  or "cfp" */.    
73d0: 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d    bcfp->status =
73e0: 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20   COMPLETE;      
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7400: 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ark this config 
7410: 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  as used */.     
7420: 20 6e 65 77 20 3d 20 43 6f 6e 66 69 67 6c 69 73   new = Configlis
7430: 74 5f 61 64 64 62 61 73 69 73 28 62 63 66 70 2d  t_addbasis(bcfp-
7440: 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29  >rp,bcfp->dot+1)
7450: 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64  ;.      Plink_ad
7460: 64 28 26 6e 65 77 2d 3e 62 70 6c 70 2c 62 63 66  d(&new->bplp,bcf
7470: 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  p);.    }..    /
7480: 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20  * Get a pointer 
7490: 74 6f 20 74 68 65 20 73 74 61 74 65 20 64 65 73  to the state des
74a0: 63 72 69 62 65 64 20 62 79 20 74 68 65 20 62 61  cribed by the ba
74b0: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
74c0: 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e  n set.    ** con
74d0: 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 65 20  structed in the 
74e0: 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a  preceding loop *
74f0: 2f 0a 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67  /.    newstp = g
7500: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a  etstate(lemp);..
7510: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
7520: 20 22 6e 65 77 73 74 70 22 20 69 73 20 72 65 61   "newstp" is rea
7530: 63 68 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ched from the st
7540: 61 74 65 20 22 73 74 70 22 20 62 79 20 61 20 73  ate "stp" by a s
7550: 68 69 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20  hift action.    
7560: 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c  ** on the symbol
7570: 20 22 73 70 22 20 2a 2f 0a 20 20 20 20 69 66 28   "sp" */.    if(
7580: 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
7590: 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
75a0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
75b0: 6f 72 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73  or(i=0; i<sp->ns
75c0: 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubsym; i++){.   
75d0: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
75e0: 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73  &stp->ap,SHIFT,s
75f0: 70 2d 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63 68  p->subsym[i],(ch
7600: 61 72 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20  ar*)newstp);.   
7610: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
7620: 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64        Action_add
7630: 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c  (&stp->ap,SHIFT,
7640: 73 70 2c 28 63 68 61 72 20 2a 29 6e 65 77 73 74  sp,(char *)newst
7650: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  p);.    }.  }.}.
7660: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
7670: 20 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e   the propagation
7680: 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46   links.*/.void F
7690: 69 6e 64 4c 69 6e 6b 73 28 6c 65 6d 70 29 0a 73  indLinks(lemp).s
76a0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
76b0: 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p;.{.  int i;.  
76c0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
76d0: 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74  fp, *other;.  st
76e0: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
76f0: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
7700: 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73  *plp;..  /* Hous
7710: 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a  ekeeping detail:
7720: 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65  .  ** Add to eve
7730: 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e  ry propagate lin
7740: 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b  k a pointer back
7750: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f   to the state to
7760: 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20  .  ** which the 
7770: 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64  link is attached
7780: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
7790: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
77a0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
77b0: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
77c0: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
77d0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
77e0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
77f0: 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70    cfp->stp = stp
7800: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7810: 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61  * Convert all ba
7820: 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72  cklinks into for
7830: 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c  ward links.  Onl
7840: 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20  y the forward.  
7850: 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65  ** links are use
7860: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d  d in the follow-
7870: 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e  set computation.
7880: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
7890: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
78a0: 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
78b0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
78c0: 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d      for(cfp=stp-
78d0: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
78e0: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
78f0: 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70   for(plp=cfp->bp
7900: 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70  lp; plp; plp=plp
7910: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
7920: 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66   other = plp->cf
7930: 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b  p;.        Plink
7940: 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c  _add(&other->fpl
7950: 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a  p,cfp);.      }.
7960: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
7970: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c  Compute all foll
7980: 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  owsets..**.** A 
7990: 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65  followset is the
79a0: 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62   set of all symb
79b0: 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f  ols which can co
79c0: 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  me immediately.*
79d0: 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67  * after a config
79e0: 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  uration..*/.void
79f0: 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28   FindFollowSets(
7a00: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
7a10: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
7a20: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  t i;.  struct co
7a30: 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
7a40: 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
7a50: 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a    int progress;.
7a60: 20 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20    int change;.. 
7a70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
7a80: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
7a90: 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70      for(cfp=lemp
7aa0: 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70  ->sorted[i]->cfp
7ab0: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
7ac0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70  next){.      cfp
7ad0: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
7ae0: 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  PLETE;.    }.  }
7af0: 0a 20 20 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72  .  .  do{.    pr
7b00: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
7b10: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7b20: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
7b30: 20 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d       for(cfp=lem
7b40: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66  p->sorted[i]->cf
7b50: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
7b60: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
7b70: 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d  if( cfp->status=
7b80: 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74  =COMPLETE ) cont
7b90: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  inue;.        fo
7ba0: 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b  r(plp=cfp->fplp;
7bb0: 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e   plp; plp=plp->n
7bc0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
7bd0: 63 68 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f  change = SetUnio
7be0: 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c  n(plp->cfp->fws,
7bf0: 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20  cfp->fws);.     
7c00: 20 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 20       if( change 
7c10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
7c20: 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20  lp->cfp->status 
7c30: 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20  = INCOMPLETE;.  
7c40: 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65            progre
7c50: 73 73 20 3d 20 31 3b 0a 09 20 20 7d 0a 09 7d 0a  ss = 1;..  }..}.
7c60: 20 20 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61          cfp->sta
7c70: 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a  tus = COMPLETE;.
7c80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7c90: 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73  }while( progress
7ca0: 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   );.}..static in
7cb0: 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69  t resolve_confli
7cc0: 63 74 28 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74  ct();../* Comput
7cd0: 65 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  e the reduce act
7ce0: 69 6f 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76  ions, and resolv
7cf0: 65 20 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a  e conflicts..*/.
7d00: 76 6f 69 64 20 46 69 6e 64 41 63 74 69 6f 6e 73  void FindActions
7d10: 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
7d20: 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
7d30: 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63 74  nt i,j;.  struct
7d40: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20   config *cfp;.  
7d50: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
7d60: 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  p;.  struct symb
7d70: 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74  ol *sp;.  struct
7d80: 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f 2a   rule *rp;..  /*
7d90: 20 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65 20   Add all of the 
7da0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 0a  reduce actions .
7db0: 20 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61 63    ** A reduce ac
7dc0: 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66 6f  tion is added fo
7dd0: 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f  r each element o
7de0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20  f the followset 
7df0: 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67  of.  ** a config
7e00: 75 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68 61  uration which ha
7e10: 73 20 69 74 73 20 64 6f 74 20 61 74 20 74 68 65  s its dot at the
7e20: 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e 0a   extreme right..
7e30: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
7e40: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
7e50: 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20  i++){   /* Loop 
7e60: 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20  over all states 
7e70: 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  */.    stp = lem
7e80: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
7e90: 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63    for(cfp=stp->c
7ea0: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
7eb0: 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f  ->next){  /* Loo
7ec0: 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69  p over all confi
7ed0: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  gurations */.   
7ee0: 20 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e     if( cfp->rp->
7ef0: 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29  nrhs==cfp->dot )
7f00: 7b 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 64  {        /* Is d
7f10: 6f 74 20 61 74 20 65 78 74 72 65 6d 65 20 72 69  ot at extreme ri
7f20: 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght? */.        
7f30: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d  for(j=0; j<lemp-
7f40: 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29  >nterminal; j++)
7f50: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
7f60: 53 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77 73  SetFind(cfp->fws
7f70: 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ,j) ){.         
7f80: 20 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64 75     /* Add a redu
7f90: 63 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  ce action to the
7fa0: 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69   state "stp" whi
7fb0: 63 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20 62  ch will reduce b
7fc0: 79 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  y the.          
7fd0: 20 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e    ** rule "cfp->
7fe0: 72 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61  rp" if the looka
7ff0: 68 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20 22  head symbol is "
8000: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
8010: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  " */.           
8020: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70   Action_add(&stp
8030: 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70  ->ap,REDUCE,lemp
8040: 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68  ->symbols[j],(ch
8050: 61 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20  ar *)cfp->rp);. 
8060: 20 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20           }..}.  
8070: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8080: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61 63  .  /* Add the ac
8090: 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f  cepting token */
80a0: 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61  .  if( lemp->sta
80b0: 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53  rt ){.    sp = S
80c0: 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d  ymbol_find(lemp-
80d0: 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28  >start);.    if(
80e0: 20 73 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65   sp==0 ) sp = le
80f0: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
8100: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d   }else{.    sp =
8110: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
8120: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74  ;.  }.  /* Add t
8130: 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  o the first stat
8140: 65 20 28 77 68 69 63 68 20 69 73 20 61 6c 77 61  e (which is alwa
8150: 79 73 20 74 68 65 20 73 74 61 72 74 69 6e 67 20  ys the starting 
8160: 73 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20 2a  state of the.  *
8170: 2a 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  * finite state m
8180: 61 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69 6f  achine) an actio
8190: 6e 20 74 6f 20 41 43 43 45 50 54 20 69 66 20 74  n to ACCEPT if t
81a0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20  he lookahead is 
81b0: 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e  the.  ** start n
81c0: 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a  onterminal.  */.
81d0: 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65    Action_add(&le
81e0: 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61  mp->sorted[0]->a
81f0: 70 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a  p,ACCEPT,sp,0);.
8200: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f  .  /* Resolve co
8210: 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72  nflicts */.  for
8220: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
8230: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
8240: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
8250: 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74 72  p, *nap;.    str
8260: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
8270: 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
8280: 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61  sorted[i];.    a
8290: 73 73 65 72 74 28 20 73 74 70 2d 3e 61 70 20 29  ssert( stp->ap )
82a0: 3b 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20  ;.    stp->ap = 
82b0: 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d  Action_sort(stp-
82c0: 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70  >ap);.    for(ap
82d0: 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20  =stp->ap; ap && 
82e0: 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d  ap->next; ap=ap-
82f0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f  >next){.      fo
8300: 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20  r(nap=ap->next; 
8310: 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d  nap && nap->sp==
8320: 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d  ap->sp; nap=nap-
8330: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
8340: 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69   /* The two acti
8350: 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61  ons "ap" and "na
8360: 70 22 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  p" have the same
8370: 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20   lookahead..    
8380: 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f       ** Figure o
8390: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f  ut which one sho
83a0: 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20  uld be used */. 
83b0: 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63          lemp->nc
83c0: 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c  onflict += resol
83d0: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e  ve_conflict(ap,n
83e0: 61 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 29  ap,lemp->errsym)
83f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8400: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74    }..  /* Report
8410: 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61   an error for ea
8420: 63 68 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e  ch rule that can
8430: 20 6e 65 76 65 72 20 62 65 20 72 65 64 75 63 65   never be reduce
8440: 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  d. */.  for(rp=l
8450: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
8460: 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e  p=rp->next) rp->
8470: 63 61 6e 52 65 64 75 63 65 20 3d 20 42 5f 46 41  canReduce = B_FA
8480: 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  LSE;.  for(i=0; 
8490: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
84a0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
84b0: 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20   action *ap;.   
84c0: 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f   for(ap=lemp->so
84d0: 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b  rted[i]->ap; ap;
84e0: 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
84f0: 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
8500: 65 3d 3d 52 45 44 55 43 45 20 29 20 61 70 2d 3e  e==REDUCE ) ap->
8510: 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20  x.rp->canReduce 
8520: 3d 20 42 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a  = B_TRUE;.    }.
8530: 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d    }.  for(rp=lem
8540: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
8550: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
8560: 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65  f( rp->canReduce
8570: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8580: 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
8590: 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
85a0: 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c 65  eline,"This rule
85b0: 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64 75   can not be redu
85c0: 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65  ced.\n");.    le
85d0: 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
85e0: 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76    }.}../* Resolv
85f0: 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65 74  e a conflict bet
8600: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76  ween the two giv
8610: 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20  en actions.  If 
8620: 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20  the.** conflict 
8630: 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76 65  can't be resolve
8640: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
8650: 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47  o..**.** NO LONG
8660: 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f  ER TRUE:.**   To
8670: 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   resolve a confl
8680: 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20  ict, first look 
8690: 74 6f 20 73 65 65 20 69 66 20 65 69 74 68 65 72  to see if either
86a0: 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20   action.**   is 
86b0: 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65  on an error rule
86c0: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
86d0: 20 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e   take the action
86e0: 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e   which.**   is n
86f0: 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ot associated wi
8700: 74 68 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c  th the error rul
8710: 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f  e.  If neither o
8720: 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69  r both.**   acti
8730: 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61 74  ons are associat
8740: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
8750: 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20   rule, then try 
8760: 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63  to.**   use prec
8770: 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76  edence to resolv
8780: 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a  e the conflict..
8790: 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
87a0: 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46  action is a SHIF
87b0: 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  T, then it must 
87c0: 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a  be apx.  This.**
87d0: 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20   function won't 
87e0: 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70  work if apx->typ
87f0: 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70  e==REDUCE and ap
8800: 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a  y->type==SHIFT..
8810: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
8820: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61  solve_conflict(a
8830: 70 78 2c 61 70 79 2c 65 72 72 73 79 6d 29 0a 73  px,apy,errsym).s
8840: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
8850: 78 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  x;.struct action
8860: 20 2a 61 70 79 3b 0a 73 74 72 75 63 74 20 73 79   *apy;.struct sy
8870: 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20  mbol *errsym;   
8880: 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 73 79 6d  /* The error sym
8890: 62 6f 6c 20 28 69 66 20 64 65 66 69 6e 65 64 2e  bol (if defined.
88a0: 20 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65    NULL otherwise
88b0: 29 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20  ) */.{.  struct 
88c0: 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70  symbol *spx, *sp
88d0: 79 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20  y;.  int errcnt 
88e0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61  = 0;.  assert( a
88f0: 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20  px->sp==apy->sp 
8900: 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  );  /* Otherwise
8910: 20 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20   there would be 
8920: 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  no conflict */. 
8930: 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d   if( apx->type==
8940: 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79  SHIFT && apy->ty
8950: 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20  pe==REDUCE ){.  
8960: 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b    spx = apx->sp;
8970: 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e  .    spy = apy->
8980: 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20  x.rp->precsym;. 
8990: 20 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c     if( spy==0 ||
89a0: 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20   spx->prec<0 || 
89b0: 73 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20  spy->prec<0 ){. 
89c0: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75       /* Not enou
89d0: 67 68 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e  gh precedence in
89e0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  formation. */.  
89f0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
8a00: 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20  CONFLICT;.      
8a10: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  errcnt++;.    }e
8a20: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
8a30: 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20 20  c>spy->prec ){  
8a40: 20 20 2f 2a 20 4c 6f 77 65 72 20 70 72 65 63 65    /* Lower prece
8a50: 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20  dence wins */.  
8a60: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
8a70: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  RD_RESOLVED;.   
8a80: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
8a90: 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29  prec<spy->prec )
8aa0: 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  {.      apx->typ
8ab0: 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b  e = SH_RESOLVED;
8ac0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
8ad0: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
8ae0: 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f  rec && spx->asso
8af0: 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20 55  c==RIGHT ){ /* U
8b00: 73 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  se operator */. 
8b10: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
8b20: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20   RD_RESOLVED;   
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73            /* ass
8b50: 6f 63 69 61 74 69 76 69 74 79 20 2a 2f 0a 20 20  ociativity */.  
8b60: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
8b70: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
8b80: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
8b90: 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62  LEFT ){  /* to b
8ba0: 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20  reak tie */.    
8bb0: 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48    apx->type = SH
8bc0: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
8bd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
8be0: 72 74 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73  rt( spx->prec==s
8bf0: 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d  py->prec && spx-
8c00: 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a  >assoc==NONE );.
8c10: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
8c20: 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20  = CONFLICT;.    
8c30: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
8c40: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70  }.  }else if( ap
8c50: 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  x->type==REDUCE 
8c60: 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45  && apy->type==RE
8c70: 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20  DUCE ){.    spx 
8c80: 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65  = apx->x.rp->pre
8c90: 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20  csym;.    spy = 
8ca0: 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apy->x.rp->precs
8cb0: 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d  ym;.    if( spx=
8cc0: 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20  =0 || spy==0 || 
8cd0: 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20  spx->prec<0 ||. 
8ce0: 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c     spy->prec<0 |
8cf0: 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  | spx->prec==spy
8d00: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
8d10: 61 70 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46  apy->type = CONF
8d20: 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63  LICT;.      errc
8d30: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nt++;.    }else 
8d40: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70  if( spx->prec>sp
8d50: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
8d60: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
8d70: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
8d80: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
8d90: 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c<spy->prec ){. 
8da0: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
8db0: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
8dc0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
8dd0: 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20   assert( .      
8de0: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45  apx->type==SH_RE
8df0: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
8e00: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45  apx->type==RD_RE
8e10: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
8e20: 61 70 78 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c  apx->type==CONFL
8e30: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
8e40: 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c  ->type==SH_RESOL
8e50: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
8e60: 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c  ->type==RD_RESOL
8e70: 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  VED ||.      apy
8e80: 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43 54  ->type==CONFLICT
8e90: 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54  .    );.    /* T
8ea0: 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54 20  he REDUCE/SHIFT 
8eb0: 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70 70  case cannot happ
8ec0: 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46 54  en because SHIFT
8ed0: 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20  s come before.  
8ee0: 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e 20    ** REDUCEs on 
8ef0: 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77 65  the list.  If we
8f00: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
8f10: 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65 63  t it must be bec
8f20: 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  ause.    ** the 
8f30: 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74 20  parser conflict 
8f40: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
8f50: 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20   resolved. */.  
8f60: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
8f70: 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t;.}./**********
8f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
8f90: 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69   the file "confi
8fa0: 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  glist.c" *******
8fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fc0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
8fd0: 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e 67  es to processing
8fe0: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
8ff0: 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64 69   list and buildi
9000: 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e  ng a state.** in
9010: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
9020: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
9030: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
9040: 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74 20  onfig *freelist 
9050: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  = 0;      /* Lis
9060: 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69 67  t of free config
9070: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  urations */.stat
9080: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
9090: 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20 20   *current = 0;  
90a0: 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c       /* Top of l
90b0: 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61  ist of configura
90c0: 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
90d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a  struct config **
90e0: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20  currentend = 0; 
90f0: 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73    /* Last on lis
9100: 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  t of configs */.
9110: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
9120: 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30 3b  nfig *basis = 0;
9130: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
9140: 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73  of list of basis
9150: 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74   configs */.stat
9160: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
9170: 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30 3b   **basisend = 0;
9180: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c       /* End of l
9190: 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e  ist of basis con
91a0: 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75  figs */../* Retu
91b0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
91c0: 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74  a new configurat
91d0: 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 73  ion */.PRIVATE s
91e0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
91f0: 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74 72  wconfig(){.  str
9200: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 3b  uct config *new;
9210: 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d  .  if( freelist=
9220: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
9230: 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 33  .    int amt = 3
9240: 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d  ;.    freelist =
9250: 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20   (struct config 
9260: 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
9270: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 2a  (struct config)*
9280: 61 6d 74 20 29 3b 0a 20 20 20 20 69 66 28 20 66  amt );.    if( f
9290: 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
92a0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
92b0: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
92c0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
92d0: 72 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72  r a new configur
92e0: 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20  ation.");.      
92f0: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
9300: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d     for(i=0; i<am
9310: 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69  t-1; i++) freeli
9320: 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72  st[i].next = &fr
9330: 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20  eelist[i+1];.   
9340: 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d   freelist[amt-1]
9350: 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  .next = 0;.  }. 
9360: 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73 74 3b   new = freelist;
9370: 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72  .  freelist = fr
9380: 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20  eelist->next;.  
9390: 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f  return new;.}../
93a0: 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74  * The configurat
93b0: 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f 20  ion "old" is no 
93c0: 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a 50  longer used */.P
93d0: 52 49 56 41 54 45 20 76 6f 69 64 20 64 65 6c 65  RIVATE void dele
93e0: 74 65 63 6f 6e 66 69 67 28 6f 6c 64 29 0a 73 74  teconfig(old).st
93f0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64  ruct config *old
9400: 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20  ;.{.  old->next 
9410: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
9420: 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a  eelist = old;.}.
9430: 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20  ./* Initialized 
9440: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
9450: 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a  n list builder *
9460: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
9470: 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75 72 72  t_init(){.  curr
9480: 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65  ent = 0;.  curre
9490: 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74  ntend = &current
94a0: 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20  ;.  basis = 0;. 
94b0: 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73   basisend = &bas
94c0: 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c  is;.  Configtabl
94d0: 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74 75  e_init();.  retu
94e0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61  rn;.}../* Initia
94f0: 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67  lized the config
9500: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69  uration list bui
9510: 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  lder */.void Con
9520: 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 7b  figlist_reset(){
9530: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a  .  current = 0;.
9540: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26    currentend = &
9550: 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73  current;.  basis
9560: 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64   = 0;.  basisend
9570: 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e   = &basis;.  Con
9580: 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 30  figtable_clear(0
9590: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
95a0: 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20 63  /* Add another c
95b0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
95c0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
95d0: 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  n list */.struct
95e0: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
95f0: 69 73 74 5f 61 64 64 28 72 70 2c 64 6f 74 29 0a  ist_add(rp,dot).
9600: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
9610: 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20      /* The rule 
9620: 2a 2f 0a 69 6e 74 20 64 6f 74 3b 20 20 20 20 20  */.int dot;     
9630: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9640: 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f 66 20  into the RHS of 
9650: 74 68 65 20 72 75 6c 65 20 77 68 65 72 65 20 74  the rule where t
9660: 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 7b  he dot goes */.{
9670: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
9680: 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20   *cfp, model;.. 
9690: 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74   assert( current
96a0: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65  end!=0 );.  mode
96b0: 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64  l.rp = rp;.  mod
96c0: 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  el.dot = dot;.  
96d0: 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c  cfp = Configtabl
96e0: 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a  e_find(&model);.
96f0: 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a    if( cfp==0 ){.
9700: 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e      cfp = newcon
9710: 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  fig();.    cfp->
9720: 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70  rp = rp;.    cfp
9730: 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20  ->dot = dot;.   
9740: 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e   cfp->fws = SetN
9750: 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73  ew();.    cfp->s
9760: 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  tp = 0;.    cfp-
9770: 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c  >fplp = cfp->bpl
9780: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
9790: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66  next = 0;.    cf
97a0: 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a  p->bp = 0;.    *
97b0: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70  currentend = cfp
97c0: 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64  ;.    currentend
97d0: 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20   = &cfp->next;. 
97e0: 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69     Configtable_i
97f0: 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a  nsert(cfp);.  }.
9800: 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a    return cfp;.}.
9810: 0a 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73 20  ./* Add a basis 
9820: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
9830: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
9840: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  on list */.struc
9850: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
9860: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70  list_addbasis(rp
9870: 2c 64 6f 74 29 0a 73 74 72 75 63 74 20 72 75 6c  ,dot).struct rul
9880: 65 20 2a 72 70 3b 0a 69 6e 74 20 64 6f 74 3b 0a  e *rp;.int dot;.
9890: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
98a0: 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a  g *cfp, model;..
98b0: 20 20 61 73 73 65 72 74 28 20 62 61 73 69 73 65    assert( basise
98c0: 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nd!=0 );.  asser
98d0: 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30  t( currentend!=0
98e0: 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d   );.  model.rp =
98f0: 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74   rp;.  model.dot
9900: 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20   = dot;.  cfp = 
9910: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64  Configtable_find
9920: 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20  (&model);.  if( 
9930: 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66  cfp==0 ){.    cf
9940: 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b  p = newconfig();
9950: 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72  .    cfp->rp = r
9960: 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20  p;.    cfp->dot 
9970: 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e  = dot;.    cfp->
9980: 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a  fws = SetNew();.
9990: 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30      cfp->stp = 0
99a0: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20  ;.    cfp->fplp 
99b0: 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b  = cfp->bplp = 0;
99c0: 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d  .    cfp->next =
99d0: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20   0;.    cfp->bp 
99e0: 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e  = 0;.    *curren
99f0: 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20  tend = cfp;.    
9a00: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66  currentend = &cf
9a10: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61  p->next;.    *ba
9a20: 73 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20  sisend = cfp;.  
9a30: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 63 66    basisend = &cf
9a40: 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69  p->bp;.    Confi
9a50: 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66  gtable_insert(cf
9a60: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
9a70: 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70   cfp;.}../* Comp
9a80: 75 74 65 20 74 68 65 20 63 6c 6f 73 75 72 65 20  ute the closure 
9a90: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
9aa0: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
9ab0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f  d Configlist_clo
9ac0: 73 75 72 65 28 6c 65 6d 70 29 0a 73 74 72 75 63  sure(lemp).struc
9ad0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
9ae0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
9af0: 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b 0a   *cfp, *newcfp;.
9b00: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
9b10: 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74 72  p, *newrp;.  str
9b20: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20  uct symbol *sp, 
9b30: 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 64  *xsp;.  int i, d
9b40: 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ot;..  assert( c
9b50: 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a  urrentend!=0 );.
9b60: 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65 6e    for(cfp=curren
9b70: 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  t; cfp; cfp=cfp-
9b80: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20 3d  >next){.    rp =
9b90: 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64 6f   cfp->rp;.    do
9ba0: 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20 20  t = cfp->dot;.  
9bb0: 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e 6e    if( dot>=rp->n
9bc0: 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rhs ) continue;.
9bd0: 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73      sp = rp->rhs
9be0: 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 73  [dot];.    if( s
9bf0: 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d  p->type==NONTERM
9c00: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  INAL ){.      if
9c10: 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26 26  ( sp->rule==0 &&
9c20: 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73 79   sp!=lemp->errsy
9c30: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  m ){.        Err
9c40: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
9c50: 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22 4e  name,rp->line,"N
9c60: 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73 5c  onterminal \"%s\
9c70: 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e 22  " has no rules."
9c80: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  ,.          sp->
9c90: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c  name);.        l
9ca0: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
9cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
9cc0: 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75 6c  or(newrp=sp->rul
9cd0: 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70 3d  e; newrp; newrp=
9ce0: 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b  newrp->nextlhs){
9cf0: 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66 70 20  .        newcfp 
9d00: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
9d10: 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20 20  (newrp,0);.     
9d20: 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b 20     for(i=dot+1; 
9d30: 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
9d40: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73 70 20  {.          xsp 
9d50: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
9d60: 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d          if( xsp-
9d70: 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
9d80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
9d90: 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77  etAdd(newcfp->fw
9da0: 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  s,xsp->index);. 
9db0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9dc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
9dd0: 65 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65 3d  e if( xsp->type=
9de0: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
9df0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
9e00: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
9e10: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78 73 70 2d   for(k=0; k<xsp-
9e20: 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a  >nsubsym; k++){.
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65                Se
9e40: 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73  tAdd(newcfp->fws
9e50: 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d  , xsp->subsym[k]
9e60: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
9e70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9e80: 20 20 20 20 62 72 65 61 6b 3b 0a 09 20 20 7d 65      break;..  }e
9e90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
9ea0: 20 53 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70   SetUnion(newcfp
9eb0: 2d 3e 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74  ->fws,xsp->first
9ec0: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  set);.          
9ed0: 20 20 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64    if( xsp->lambd
9ee0: 61 3d 3d 42 5f 46 41 4c 53 45 20 29 20 62 72 65  a==B_FALSE ) bre
9ef0: 61 6b 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20  ak;..  }..}.    
9f00: 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
9f10: 72 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28  rhs ) Plink_add(
9f20: 26 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66  &cfp->fplp,newcf
9f30: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
9f40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  }.  }.  return;.
9f50: 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63  }../* Sort the c
9f60: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9f70: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
9f80: 6c 69 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63  list_sort(){.  c
9f90: 75 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74  urrent = (struct
9fa0: 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28   config *)msort(
9fb0: 28 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74 2c  (char *)current,
9fc0: 28 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72 65  (char **)&(curre
9fd0: 6e 74 2d 3e 6e 65 78 74 29 2c 43 6f 6e 66 69 67  nt->next),Config
9fe0: 63 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65  cmp);.  currente
9ff0: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
a000: 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65  ;.}../* Sort the
a010: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
a020: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
a030: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
a040: 74 62 61 73 69 73 28 29 7b 0a 20 20 62 61 73 69  tbasis(){.  basi
a050: 73 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  s = (struct conf
a060: 69 67 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72  ig *)msort((char
a070: 20 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72   *)current,(char
a080: 20 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 62   **)&(current->b
a090: 70 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20  p),Configcmp);. 
a0a0: 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20   basisend = 0;. 
a0b0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
a0c0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
a0d0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
a0e0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
a0f0: 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73   list and.** res
a100: 65 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73  et the list */.s
a110: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
a120: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
a130: 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  ){.  struct conf
a140: 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d  ig *old;.  old =
a150: 20 63 75 72 72 65 6e 74 3b 0a 20 20 63 75 72 72   current;.  curr
a160: 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65  ent = 0;.  curre
a170: 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74  ntend = 0;.  ret
a180: 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52  urn old;.}../* R
a190: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
a1a0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
a1b0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
a1c0: 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73   list and.** res
a1d0: 65 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73  et the list */.s
a1e0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
a1f0: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29  nfiglist_basis()
a200: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
a210: 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20  g *old;.  old = 
a220: 62 61 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d  basis;.  basis =
a230: 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d   0;.  basisend =
a240: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64   0;.  return old
a250: 3b 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c  ;.}../* Free all
a260: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
a270: 20 67 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61   given configura
a280: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
a290: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74  d Configlist_eat
a2a0: 28 63 66 70 29 0a 73 74 72 75 63 74 20 63 6f 6e  (cfp).struct con
a2b0: 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74  fig *cfp;.{.  st
a2c0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78  ruct config *nex
a2d0: 74 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20 63 66  tcfp;.  for(; cf
a2e0: 70 3b 20 63 66 70 3d 6e 65 78 74 63 66 70 29 7b  p; cfp=nextcfp){
a2f0: 0a 20 20 20 20 6e 65 78 74 63 66 70 20 3d 20 63  .    nextcfp = c
a300: 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 61 73  fp->next;.    as
a310: 73 65 72 74 28 20 63 66 70 2d 3e 66 70 6c 70 3d  sert( cfp->fplp=
a320: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
a330: 28 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30 20 29  ( cfp->bplp==0 )
a340: 3b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 66  ;.    if( cfp->f
a350: 77 73 20 29 20 53 65 74 46 72 65 65 28 63 66 70  ws ) SetFree(cfp
a360: 2d 3e 66 77 73 29 3b 0a 20 20 20 20 64 65 6c 65  ->fws);.    dele
a370: 74 65 63 6f 6e 66 69 67 28 63 66 70 29 3b 0a 20  teconfig(cfp);. 
a380: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f   }.  return;.}./
a390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3a0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
a3b0: 22 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a 2a 2a  "error.c" ******
a3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
a3e0: 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 69 6e  ** Code for prin
a3f0: 74 69 6e 67 20 65 72 72 6f 72 20 6d 65 73 73 61  ting error messa
a400: 67 65 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20  ge..*/../* Find 
a410: 61 20 67 6f 6f 64 20 70 6c 61 63 65 20 74 6f 20  a good place to 
a420: 62 72 65 61 6b 20 22 6d 73 67 22 20 73 6f 20 74  break "msg" so t
a430: 68 61 74 20 69 74 73 20 6c 65 6e 67 74 68 20 69  hat its length i
a440: 73 20 61 74 20 6c 65 61 73 74 20 22 6d 69 6e 22  s at least "min"
a450: 0a 2a 2a 20 62 75 74 20 6e 6f 20 6d 6f 72 65 20  .** but no more 
a460: 74 68 61 6e 20 22 6d 61 78 22 2e 20 20 4d 61 6b  than "max".  Mak
a470: 65 20 74 68 65 20 70 6f 69 6e 74 20 61 73 20 63  e the point as c
a480: 6c 6f 73 65 20 74 6f 20 6d 61 78 20 61 73 20 70  lose to max as p
a490: 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ossible..*/.stat
a4a0: 69 63 20 69 6e 74 20 66 69 6e 64 62 72 65 61 6b  ic int findbreak
a4b0: 28 6d 73 67 2c 6d 69 6e 2c 6d 61 78 29 0a 63 68  (msg,min,max).ch
a4c0: 61 72 20 2a 6d 73 67 3b 0a 69 6e 74 20 6d 69 6e  ar *msg;.int min
a4d0: 3b 0a 69 6e 74 20 6d 61 78 3b 0a 7b 0a 20 20 69  ;.int max;.{.  i
a4e0: 6e 74 20 69 2c 73 70 6f 74 3b 0a 20 20 63 68 61  nt i,spot;.  cha
a4f0: 72 20 63 3b 0a 20 20 66 6f 72 28 69 3d 73 70 6f  r c;.  for(i=spo
a500: 74 3d 6d 69 6e 3b 20 69 3c 3d 6d 61 78 3b 20 69  t=min; i<=max; i
a510: 2b 2b 29 7b 0a 20 20 20 20 63 20 3d 20 6d 73 67  ++){.    c = msg
a520: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  [i];.    if( c==
a530: 27 5c 74 27 20 29 20 6d 73 67 5b 69 5d 20 3d 20  '\t' ) msg[i] = 
a540: 27 20 27 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ' ';.    if( c==
a550: 27 5c 6e 27 20 29 7b 20 6d 73 67 5b 69 5d 20 3d  '\n' ){ msg[i] =
a560: 20 27 20 27 3b 20 73 70 6f 74 20 3d 20 69 3b 20   ' '; spot = i; 
a570: 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69 66 28  break; }.    if(
a580: 20 63 3d 3d 30 20 29 7b 20 73 70 6f 74 20 3d 20   c==0 ){ spot = 
a590: 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  i; break; }.    
a5a0: 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 69 3c  if( c=='-' && i<
a5b0: 6d 61 78 2d 31 20 29 20 73 70 6f 74 20 3d 20 69  max-1 ) spot = i
a5c0: 2b 31 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  +1;.    if( c=='
a5d0: 20 27 20 29 20 73 70 6f 74 20 3d 20 69 3b 0a 20   ' ) spot = i;. 
a5e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 70 6f 74   }.  return spot
a5f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65  ;.}../*.** The e
a600: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
a610: 73 70 6c 69 74 20 61 63 72 6f 73 73 20 6d 75 6c  split across mul
a620: 74 69 70 6c 65 20 6c 69 6e 65 73 20 69 66 20 6e  tiple lines if n
a630: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
a640: 2a 20 73 70 6c 69 74 73 20 6f 63 63 75 72 20 61  * splits occur a
a650: 74 20 61 20 73 70 61 63 65 2c 20 69 66 20 74 68  t a space, if th
a660: 65 72 65 20 69 73 20 61 20 73 70 61 63 65 20 61  ere is a space a
a670: 76 61 69 6c 61 62 6c 65 20 6e 65 61 72 20 74 68  vailable near th
a680: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65 20  e end.** of the 
a690: 6c 69 6e 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  line..*/.#define
a6a0: 20 45 52 52 4d 53 47 53 49 5a 45 20 20 31 30 30   ERRMSGSIZE  100
a6b0: 30 30 20 2f 2a 20 48 6f 70 65 20 74 68 69 73 20  00 /* Hope this 
a6c0: 69 73 20 62 69 67 20 65 6e 6f 75 67 68 2e 20 20  is big enough.  
a6d0: 4e 6f 20 77 61 79 20 74 6f 20 65 72 72 6f 72 20  No way to error 
a6e0: 63 68 65 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65  check */.#define
a6f0: 20 4c 49 4e 45 57 49 44 54 48 20 20 20 20 20 20   LINEWIDTH      
a700: 37 39 20 2f 2a 20 4d 61 78 20 77 69 64 74 68 20  79 /* Max width 
a710: 6f 66 20 61 6e 79 20 6f 75 74 70 75 74 20 6c 69  of any output li
a720: 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  ne */.#define PR
a730: 45 46 49 58 4c 49 4d 49 54 20 20 20 20 33 30 20  EFIXLIMIT    30 
a740: 2f 2a 20 4d 61 78 20 77 69 64 74 68 20 6f 66 20  /* Max width of 
a750: 74 68 65 20 70 72 65 66 69 78 20 6f 6e 20 65 61  the prefix on ea
a760: 63 68 20 6c 69 6e 65 20 2a 2f 0a 76 6f 69 64 20  ch line */.void 
a770: 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63  ErrorMsg(const c
a780: 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69  har *filename, i
a790: 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74  nt lineno, const
a7a0: 20 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e   char *format, .
a7b0: 2e 2e 29 7b 0a 20 20 63 68 61 72 20 65 72 72 6d  ..){.  char errm
a7c0: 73 67 5b 45 52 52 4d 53 47 53 49 5a 45 5d 3b 0a  sg[ERRMSGSIZE];.
a7d0: 20 20 63 68 61 72 20 70 72 65 66 69 78 5b 50 52    char prefix[PR
a7e0: 45 46 49 58 4c 49 4d 49 54 2b 31 30 5d 3b 0a 20  EFIXLIMIT+10];. 
a7f0: 20 69 6e 74 20 65 72 72 6d 73 67 73 69 7a 65 3b   int errmsgsize;
a800: 0a 20 20 69 6e 74 20 70 72 65 66 69 78 73 69 7a  .  int prefixsiz
a810: 65 3b 0a 20 20 69 6e 74 20 61 76 61 69 6c 61 62  e;.  int availab
a820: 6c 65 77 69 64 74 68 3b 0a 20 20 76 61 5f 6c 69  lewidth;.  va_li
a830: 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 65 6e 64  st ap;.  int end
a840: 2c 20 72 65 73 74 61 72 74 2c 20 62 61 73 65 3b  , restart, base;
a850: 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ..  va_start(ap,
a860: 20 66 6f 72 6d 61 74 29 3b 0a 20 20 2f 2a 20 50   format);.  /* P
a870: 72 65 70 61 72 65 20 61 20 70 72 65 66 69 78 20  repare a prefix 
a880: 74 6f 20 62 65 20 70 72 65 70 65 6e 64 65 64 20  to be prepended 
a890: 74 6f 20 65 76 65 72 79 20 6f 75 74 70 75 74 20  to every output 
a8a0: 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 6c 69  line */.  if( li
a8b0: 6e 65 6e 6f 3e 30 20 29 7b 0a 20 20 20 20 73 70  neno>0 ){.    sp
a8c0: 72 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e  rintf(prefix,"%.
a8d0: 2a 73 3a 25 64 3a 20 22 2c 50 52 45 46 49 58 4c  *s:%d: ",PREFIXL
a8e0: 49 4d 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65  IMIT-10,filename
a8f0: 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 65 6c 73  ,lineno);.  }els
a900: 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70  e{.    sprintf(p
a910: 72 65 66 69 78 2c 22 25 2e 2a 73 3a 20 22 2c 50  refix,"%.*s: ",P
a920: 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69  REFIXLIMIT-10,fi
a930: 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70  lename);.  }.  p
a940: 72 65 66 69 78 73 69 7a 65 20 3d 20 73 74 72 6c  refixsize = strl
a950: 65 6e 28 70 72 65 66 69 78 29 3b 0a 20 20 61 76  en(prefix);.  av
a960: 61 69 6c 61 62 6c 65 77 69 64 74 68 20 3d 20 4c  ailablewidth = L
a970: 49 4e 45 57 49 44 54 48 20 2d 20 70 72 65 66 69  INEWIDTH - prefi
a980: 78 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 47 65 6e  xsize;..  /* Gen
a990: 65 72 61 74 65 20 74 68 65 20 65 72 72 6f 72 20  erate the error 
a9a0: 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 76 73 70  message */.  vsp
a9b0: 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 66 6f 72  rintf(errmsg,for
a9c0: 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e  mat,ap);.  va_en
a9d0: 64 28 61 70 29 3b 0a 20 20 65 72 72 6d 73 67 73  d(ap);.  errmsgs
a9e0: 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28 65 72 72  ize = strlen(err
a9f0: 6d 73 67 29 3b 0a 20 20 2f 2a 20 52 65 6d 6f 76  msg);.  /* Remov
aa00: 65 20 74 72 61 69 6c 69 6e 67 20 27 5c 6e 27 73  e trailing '\n's
aa10: 20 66 72 6f 6d 20 74 68 65 20 65 72 72 6f 72 20   from the error 
aa20: 6d 65 73 73 61 67 65 2e 20 2a 2f 0a 20 20 77 68  message. */.  wh
aa30: 69 6c 65 28 20 65 72 72 6d 73 67 73 69 7a 65 3e  ile( errmsgsize>
aa40: 30 20 26 26 20 65 72 72 6d 73 67 5b 65 72 72 6d  0 && errmsg[errm
aa50: 73 67 73 69 7a 65 2d 31 5d 3d 3d 27 5c 6e 27 20  sgsize-1]=='\n' 
aa60: 29 7b 0a 20 20 20 20 20 65 72 72 6d 73 67 5b 2d  ){.     errmsg[-
aa70: 2d 65 72 72 6d 73 67 73 69 7a 65 5d 20 3d 20 30  -errmsgsize] = 0
aa80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e  ;.  }..  /* Prin
aa90: 74 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  t the error mess
aaa0: 61 67 65 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20  age */.  base = 
aab0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 65 72 72 6d  0;.  while( errm
aac0: 73 67 5b 62 61 73 65 5d 21 3d 30 20 29 7b 0a 20  sg[base]!=0 ){. 
aad0: 20 20 20 65 6e 64 20 3d 20 72 65 73 74 61 72 74     end = restart
aae0: 20 3d 20 66 69 6e 64 62 72 65 61 6b 28 26 65 72   = findbreak(&er
aaf0: 72 6d 73 67 5b 62 61 73 65 5d 2c 30 2c 61 76 61  rmsg[base],0,ava
ab00: 69 6c 61 62 6c 65 77 69 64 74 68 29 3b 0a 20 20  ilablewidth);.  
ab10: 20 20 72 65 73 74 61 72 74 20 2b 3d 20 62 61 73    restart += bas
ab20: 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 65 72  e;.    while( er
ab30: 72 6d 73 67 5b 72 65 73 74 61 72 74 5d 3d 3d 27  rmsg[restart]=='
ab40: 20 27 20 29 20 72 65 73 74 61 72 74 2b 2b 3b 0a   ' ) restart++;.
ab50: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f      fprintf(stdo
ab60: 75 74 2c 22 25 73 25 2e 2a 73 5c 6e 22 2c 70 72  ut,"%s%.*s\n",pr
ab70: 65 66 69 78 2c 65 6e 64 2c 26 65 72 72 6d 73 67  efix,end,&errmsg
ab80: 5b 62 61 73 65 5d 29 3b 0a 20 20 20 20 62 61 73  [base]);.    bas
ab90: 65 20 3d 20 72 65 73 74 61 72 74 3b 0a 20 20 7d  e = restart;.  }
aba0: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
abb0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
abc0: 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a  le "main.c" ****
abd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
abe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
abf0: 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f  /./*.** Main pro
ac00: 67 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74 68  gram file for th
ac10: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
ac20: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
ac30: 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f   Report an out-o
ac40: 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69  f-memory conditi
ac50: 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20 54  on and abort.  T
ac60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
ac70: 69 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20 62  is used mostly b
ac80: 79 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68 65  y the "MemoryChe
ac90: 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74 72  ck" macro in str
aca0: 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65  uct.h.*/.void me
acb0: 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a 20 20  mory_error(){.  
acc0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
acd0: 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20  Out of memory.  
ace0: 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29 3b  Aborting...\n");
acf0: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 73  .  exit(1);.}..s
ad00: 74 61 74 69 63 20 69 6e 74 20 6e 44 65 66 69 6e  tatic int nDefin
ad10: 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  e = 0;      /* N
ad20: 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f 70 74 69  umber of -D opti
ad30: 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ons on the comma
ad40: 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74 61 74 69  nd line */.stati
ad50: 63 20 63 68 61 72 20 2a 2a 61 7a 44 65 66 69 6e  c char **azDefin
ad60: 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d 65 20  e = 0;  /* Name 
ad70: 6f 66 20 74 68 65 20 2d 44 20 6d 61 63 72 6f 73  of the -D macros
ad80: 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 72 6f 75   */../* This rou
ad90: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
ada0: 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ith the argument
adb0: 20 74 6f 20 65 61 63 68 20 2d 44 20 63 6f 6d 6d   to each -D comm
adc0: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e  and-line option.
add0: 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d 61 63 72  .** Add the macr
ade0: 6f 20 64 65 66 69 6e 65 64 20 74 6f 20 74 68 65  o defined to the
adf0: 20 61 7a 44 65 66 69 6e 65 20 61 72 72 61 79 2e   azDefine array.
ae00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ae10: 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 28  handle_D_option(
ae20: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72  char *z){.  char
ae30: 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65 66 69 6e   **paz;.  nDefin
ae40: 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69 6e 65 20  e++;.  azDefine 
ae50: 3d 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69  = realloc(azDefi
ae60: 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65 66  ne, sizeof(azDef
ae70: 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29  ine[0])*nDefine)
ae80: 3b 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e 65  ;.  if( azDefine
ae90: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
aea0: 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f  tf(stderr,"out o
aeb0: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
aec0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
aed0: 20 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65   paz = &azDefine
aee0: 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a  [nDefine-1];.  *
aef0: 70 61 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 74  paz = malloc( st
af00: 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69  rlen(z)+1 );.  i
af10: 66 28 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20  f( *paz==0 ){.  
af20: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
af30: 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  ,"out of memory\
af40: 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
af50: 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 2a  ;.  }.  strcpy(*
af60: 70 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28 7a  paz, z);.  for(z
af70: 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21  =*paz; *z && *z!
af80: 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a  ='='; z++){}.  *
af90: 7a 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68  z = 0;.}.../* Th
afa0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20  e main program. 
afb0: 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61   Parse the comma
afc0: 6e 64 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69  nd line and do i
afd0: 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e  t... */.int main
afe0: 28 61 72 67 63 2c 61 72 67 76 29 0a 69 6e 74 20  (argc,argv).int 
aff0: 61 72 67 63 3b 0a 63 68 61 72 20 2a 2a 61 72 67  argc;.char **arg
b000: 76 3b 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  v;.{.  static in
b010: 74 20 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20  t version = 0;. 
b020: 20 73 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c   static int rpfl
b030: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
b040: 20 69 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d   int basisflag =
b050: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
b060: 20 63 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20   compress = 0;. 
b070: 20 73 74 61 74 69 63 20 69 6e 74 20 71 75 69 65   static int quie
b080: 74 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  t = 0;.  static 
b090: 69 6e 74 20 73 74 61 74 69 73 74 69 63 73 20 3d  int statistics =
b0a0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
b0b0: 20 6d 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73   mhflag = 0;.  s
b0c0: 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f  tatic struct s_o
b0d0: 70 74 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d  ptions options[]
b0e0: 20 3d 20 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c   = {.    {OPT_FL
b0f0: 41 47 2c 20 22 62 22 2c 20 28 63 68 61 72 2a 29  AG, "b", (char*)
b100: 26 62 61 73 69 73 66 6c 61 67 2c 20 22 50 72 69  &basisflag, "Pri
b110: 6e 74 20 6f 6e 6c 79 20 74 68 65 20 62 61 73 69  nt only the basi
b120: 73 20 69 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a  s in report."},.
b130: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
b140: 63 22 2c 20 28 63 68 61 72 2a 29 26 63 6f 6d 70  c", (char*)&comp
b150: 72 65 73 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d  ress, "Don't com
b160: 70 72 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e  press the action
b170: 20 74 61 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b   table."},.    {
b180: 4f 50 54 5f 46 53 54 52 2c 20 22 44 22 2c 20 28  OPT_FSTR, "D", (
b190: 63 68 61 72 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f  char*)handle_D_o
b1a0: 70 74 69 6f 6e 2c 20 22 44 65 66 69 6e 65 20 61  ption, "Define a
b1b0: 6e 20 25 69 66 64 65 66 20 6d 61 63 72 6f 2e 22  n %ifdef macro."
b1c0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
b1d0: 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72  , "g", (char*)&r
b1e0: 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72  pflag, "Print gr
b1f0: 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63  ammar without ac
b200: 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f  tions."},.    {O
b210: 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63  PT_FLAG, "m", (c
b220: 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f  har*)&mhflag, "O
b230: 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64  utput a makehead
b240: 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  ers compatible f
b250: 69 6c 65 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ile"},.    {OPT_
b260: 46 4c 41 47 2c 20 22 71 22 2c 20 28 63 68 61 72  FLAG, "q", (char
b270: 2a 29 26 71 75 69 65 74 2c 20 22 28 51 75 69 65  *)&quiet, "(Quie
b280: 74 29 20 44 6f 6e 27 74 20 70 72 69 6e 74 20 74  t) Don't print t
b290: 68 65 20 72 65 70 6f 72 74 20 66 69 6c 65 2e 22  he report file."
b2a0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
b2b0: 2c 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73  , "s", (char*)&s
b2c0: 74 61 74 69 73 74 69 63 73 2c 0a 20 20 20 20 20  tatistics,.     
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 50                "P
b2f0: 72 69 6e 74 20 70 61 72 73 65 72 20 73 74 61 74  rint parser stat
b300: 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75  s to standard ou
b310: 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  tput."},.    {OP
b320: 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68  T_FLAG, "x", (ch
b330: 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50  ar*)&version, "P
b340: 72 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e  rint the version
b350: 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20   number."},.    
b360: 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d  {OPT_FLAG,0,0,0}
b370: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
b380: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65   struct lemon le
b390: 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61 72  m;..  OptInit(ar
b3a0: 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72  gv,options,stder
b3b0: 72 29 3b 0a 20 20 69 66 28 20 76 65 72 73 69 6f  r);.  if( versio
b3c0: 6e 20 29 7b 0a 20 20 20 20 20 70 72 69 6e 74 66  n ){.     printf
b3d0: 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20  ("Lemon version 
b3e0: 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78  1.0\n");.     ex
b3f0: 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66  it(0); .  }.  if
b400: 28 20 4f 70 74 4e 41 72 67 73 28 29 21 3d 31 20  ( OptNArgs()!=1 
b410: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
b420: 74 64 65 72 72 2c 22 45 78 61 63 74 6c 79 20 6f  tderr,"Exactly o
b430: 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75  ne filename argu
b440: 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72 65 64  ment is required
b450: 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
b460: 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  1);.  }.  memset
b470: 28 26 6c 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  (&lem, 0, sizeof
b480: 28 6c 65 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65 72  (lem));.  lem.er
b490: 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  rorcnt = 0;..  /
b4a0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
b4b0: 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74   machine */.  St
b4c0: 72 73 61 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20  rsafe_init();.  
b4d0: 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20  Symbol_init();. 
b4e0: 20 53 74 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20   State_init();. 
b4f0: 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20 61 72 67   lem.argv0 = arg
b500: 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65  v[0];.  lem.file
b510: 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67 28 30 29  name = OptArg(0)
b520: 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61  ;.  lem.basisfla
b530: 67 20 3d 20 62 61 73 69 73 66 6c 61 67 3b 0a 20  g = basisflag;. 
b540: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29   Symbol_new("$")
b550: 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d  ;.  lem.errsym =
b560: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65 72 72   Symbol_new("err
b570: 6f 72 22 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73  or");..  /* Pars
b580: 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  e the input file
b590: 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c 65 6d   */.  Parse(&lem
b5a0: 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72 72  );.  if( lem.err
b5b0: 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c 65 6d  orcnt ) exit(lem
b5c0: 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69 66  .errorcnt);.  if
b5d0: 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d 3d 30 20 29  ( lem.nrule==0 )
b5e0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
b5f0: 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d  derr,"Empty gram
b600: 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mar.\n");.    ex
b610: 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  it(1);.  }..  /*
b620: 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65 78   Count and index
b630: 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20   the symbols of 
b640: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
b650: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53   lem.nsymbol = S
b660: 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20  ymbol_count();. 
b670: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65   Symbol_new("{de
b680: 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e  fault}");.  lem.
b690: 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c  symbols = Symbol
b6a0: 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20 66 6f  _arrayof();.  fo
b6b0: 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73  r(i=0; i<=lem.ns
b6c0: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e  ymbol; i++) lem.
b6d0: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65  symbols[i]->inde
b6e0: 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 6c  x = i;.  qsort(l
b6f0: 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e  em.symbols,lem.n
b700: 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65 6f 66 28  symbol+1,sizeof(
b710: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c  struct symbol*),
b720: 0a 20 20 20 20 20 20 20 20 28 69 6e 74 28 2a 29  .        (int(*)
b730: 28 29 29 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a  ())Symbolcmpp);.
b740: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65    for(i=0; i<=le
b750: 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20  m.nsymbol; i++) 
b760: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  lem.symbols[i]->
b770: 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 66 6f 72  index = i;.  for
b780: 28 69 3d 31 3b 20 69 73 75 70 70 65 72 28 6c 65  (i=1; isupper(le
b790: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  m.symbols[i]->na
b7a0: 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20  me[0]); i++);.  
b7b0: 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d 20  lem.nterminal = 
b7c0: 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  i;..  /* Generat
b7d0: 65 20 61 20 72 65 70 72 69 6e 74 20 6f 66 20 74  e a reprint of t
b7e0: 68 65 20 67 72 61 6d 6d 61 72 2c 20 69 66 20 72  he grammar, if r
b7f0: 65 71 75 65 73 74 65 64 20 6f 6e 20 74 68 65 20  equested on the 
b800: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a  command line */.
b810: 20 20 69 66 28 20 72 70 66 6c 61 67 20 29 7b 0a    if( rpflag ){.
b820: 20 20 20 20 52 65 70 72 69 6e 74 28 26 6c 65 6d      Reprint(&lem
b830: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b840: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
b850: 65 20 73 69 7a 65 20 66 6f 72 20 61 6c 6c 20 66  e size for all f
b860: 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72 73 74 20  ollow and first 
b870: 73 65 74 73 20 2a 2f 0a 20 20 20 20 53 65 74 53  sets */.    SetS
b880: 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  ize(lem.ntermina
b890: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  l);..    /* Find
b8a0: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 20   the precedence 
b8b0: 66 6f 72 20 65 76 65 72 79 20 70 72 6f 64 75 63  for every produc
b8c0: 74 69 6f 6e 20 72 75 6c 65 20 28 74 68 61 74 20  tion rule (that 
b8d0: 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20  has one) */.    
b8e0: 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e  FindRulePreceden
b8f0: 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ces(&lem);..    
b900: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
b910: 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61  ambda-nontermina
b920: 6c 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ls and the first
b930: 2d 73 65 74 73 20 66 6f 72 20 65 76 65 72 79 0a  -sets for every.
b940: 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e      ** nontermin
b950: 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69  al */.    FindFi
b960: 72 73 74 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  rstSets(&lem);..
b970: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61      /* Compute a
b980: 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 2e  ll LR(0) states.
b990: 20 20 41 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f    Also record fo
b9a0: 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
b9b0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b  tion.    ** link
b9c0: 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 6f  s so that the fo
b9d0: 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20 62 65 20  llow-set can be 
b9e0: 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 20 2a  computed later *
b9f0: 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65  /.    lem.nstate
ba00: 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e 64 53 74   = 0;.    FindSt
ba10: 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20  ates(&lem);.    
ba20: 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20 53 74 61  lem.sorted = Sta
ba30: 74 65 5f 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20  te_arrayof();.. 
ba40: 20 20 20 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f     /* Tie up loo
ba50: 73 65 20 65 6e 64 73 20 6f 6e 20 74 68 65 20 70  se ends on the p
ba60: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
ba70: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b   */.    FindLink
ba80: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
ba90: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 6f 6c   Compute the fol
baa0: 6c 6f 77 20 73 65 74 20 6f 66 20 65 76 65 72 79  low set of every
bab0: 20 72 65 64 75 63 69 62 6c 65 20 63 6f 6e 66 69   reducible confi
bac0: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  guration */.    
bad0: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26  FindFollowSets(&
bae0: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
baf0: 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
bb00: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46   tables */.    F
bb10: 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29  indActions(&lem)
bb20: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  ;..    /* Compre
bb30: 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ss the action ta
bb40: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  bles */.    if( 
bb50: 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29 20 43 6f  compress==0 ) Co
bb60: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 26 6c 65  mpressTables(&le
bb70: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6f 72  m);..    /* Reor
bb80: 64 65 72 20 61 6e 64 20 72 65 6e 75 6d 62 65 72  der and renumber
bb90: 20 74 68 65 20 73 74 61 74 65 73 20 73 6f 20 74   the states so t
bba0: 68 61 74 20 73 74 61 74 65 73 20 77 69 74 68 20  hat states with 
bbb0: 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a 20 20  fewer choices.  
bbc0: 20 20 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68    ** occur at th
bbd0: 65 20 65 6e 64 2e 20 2a 2f 0a 20 20 20 20 52 65  e end. */.    Re
bbe0: 73 6f 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29  sortStates(&lem)
bbf0: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
bc00: 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74  te a report of t
bc10: 68 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  he parser genera
bc20: 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75  ted.  (the "y.ou
bc30: 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20  tput" file) */. 
bc40: 20 20 20 69 66 28 20 21 71 75 69 65 74 20 29 20     if( !quiet ) 
bc50: 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65  ReportOutput(&le
bc60: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
bc70: 72 61 74 65 20 74 68 65 20 73 6f 75 72 63 65 20  rate the source 
bc80: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72  code for the par
bc90: 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72  ser */.    Repor
bca0: 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66  tTable(&lem, mhf
bcb0: 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  lag);..    /* Pr
bcc0: 6f 64 75 63 65 20 61 20 68 65 61 64 65 72 20 66  oduce a header f
bcd0: 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 74  ile for use by t
bce0: 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68  he scanner.  (Th
bcf0: 69 73 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a  is step is.    *
bd00: 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  * omitted if the
bd10: 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20   "-m" option is 
bd20: 75 73 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b  used because mak
bd30: 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20  eheaders will.  
bd40: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68    ** generate th
bd50: 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20  e file for us.) 
bd60: 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c  */.    if( !mhfl
bd70: 61 67 20 29 20 52 65 70 6f 72 74 48 65 61 64 65  ag ) ReportHeade
bd80: 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69  r(&lem);.  }.  i
bd90: 66 28 20 73 74 61 74 69 73 74 69 63 73 20 29 7b  f( statistics ){
bda0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 61 72  .    printf("Par
bdb0: 73 65 72 20 73 74 61 74 69 73 74 69 63 73 3a 20  ser statistics: 
bdc0: 25 64 20 74 65 72 6d 69 6e 61 6c 73 2c 20 25 64  %d terminals, %d
bdd0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2c 20 25   nonterminals, %
bde0: 64 20 72 75 6c 65 73 5c 6e 22 2c 0a 20 20 20 20  d rules\n",.    
bdf0: 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c    lem.nterminal,
be00: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c   lem.nsymbol - l
be10: 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c 65  em.nterminal, le
be20: 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20 20 70 72  m.nrule);.    pr
be30: 69 6e 74 66 28 22 20 20 20 20 20 20 20 20 20 20  intf("          
be40: 20 20 20 20 20 20 20 20 20 25 64 20 73 74 61 74           %d stat
be50: 65 73 2c 20 25 64 20 70 61 72 73 65 72 20 74 61  es, %d parser ta
be60: 62 6c 65 20 65 6e 74 72 69 65 73 2c 20 25 64 20  ble entries, %d 
be70: 63 6f 6e 66 6c 69 63 74 73 5c 6e 22 2c 0a 20 20  conflicts\n",.  
be80: 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65 2c 20      lem.nstate, 
be90: 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 2c 20 6c  lem.tablesize, l
bea0: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20  em.nconflict);. 
beb0: 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 63 6f   }.  if( lem.nco
bec0: 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 66 70  nflict ){.    fp
bed0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 64  rintf(stderr,"%d
bee0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63   parsing conflic
bef0: 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f 6e 66  ts.\n",lem.nconf
bf00: 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20 65 78 69  lict);.  }.  exi
bf10: 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 2b  t(lem.errorcnt +
bf20: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b   lem.nconflict);
bf30: 0a 20 20 72 65 74 75 72 6e 20 28 6c 65 6d 2e 65  .  return (lem.e
bf40: 72 72 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63  rrorcnt + lem.nc
bf50: 6f 6e 66 6c 69 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a  onflict);.}./***
bf60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf70: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
bf80: 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  "msort.c" ******
bf90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bfa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
bfb0: 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65   A generic merge
bfc0: 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a  -sort program..*
bfd0: 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c  *.** USAGE:.** L
bfe0: 65 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f  et "ptr" be a po
bff0: 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74  inter to some st
c000: 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73  ructure which is
c010: 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a   at the head of.
c020: 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  ** a null-termin
c030: 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e  ated list.  Then
c040: 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73   to sort the lis
c050: 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  t call:.**.**   
c060: 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74    ptr = msort(pt
c070: 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63  r,&(ptr->next),c
c080: 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e  mpfnc);.**.** In
c090: 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70   the above, "cmp
c0a0: 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65  fnc" is a pointe
c0b0: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
c0c0: 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a  which compares.*
c0d0: 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  * two instances 
c0e0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
c0f0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20   and returns an 
c100: 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a  integer, as in.*
c110: 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73  * strcmp.  The s
c120: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
c130: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
c140: 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
c150: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d  e.** second elem
c160: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65  ent of the linke
c170: 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64  d list.  This ad
c180: 64 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f  dress is used to
c190: 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
c1a0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e  offset to the "n
c1b0: 65 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69  ext" field withi
c1c0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  n the structure.
c1d0: 20 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a    The offset to.
c1e0: 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  ** the "next" fi
c1f0: 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  eld must be cons
c200: 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72  tant for all str
c210: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c  uctures in the l
c220: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ist..**.** The f
c230: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
c240: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68  a new pointer wh
c250: 69 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20  ich is the head 
c260: 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61  of the list.** a
c270: 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a  fter sorting..**
c280: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
c290: 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f  * Merge-sort..*/
c2a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
c2b0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
c2c0: 6e 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69  next structure i
c2d0: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
c2e0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45  t..*/.#define NE
c2f0: 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29  XT(A) (*(char**)
c300: 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
c310: 29 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a 2f 2a  )A)+offset))../*
c320: 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20  .** Inputs:.**  
c330: 20 61 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74   a:       A sort
c340: 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  ed, null-termina
c350: 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  ted linked list.
c360: 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e    (May be null).
c370: 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20 20 20 41  .**   b:       A
c380: 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65   sorted, null-te
c390: 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20  rminated linked 
c3a0: 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e  list.  (May be n
c3b0: 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20  ull)..**   cmp: 
c3c0: 20 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f      A pointer to
c3d0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
c3e0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 6f  function..**   o
c3f0: 66 66 73 65 74 3a 20 20 4f 66 66 73 65 74 20 69  ffset:  Offset i
c400: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
c410: 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  to the "next" fi
c420: 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eld..**.** Retur
c430: 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20  n Value:.**   A 
c440: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
c450: 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20  ead of a sorted 
c460: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
c470: 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20  the elements.** 
c480: 20 20 6f 66 20 62 6f 74 68 20 61 20 61 6e 64 20    of both a and 
c490: 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66  b..**.** Side ef
c4a0: 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20  fects:.**   The 
c4b0: 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20  "next" pointers 
c4c0: 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  for elements in 
c4d0: 74 68 65 20 6c 69 73 74 73 20 61 20 61 6e 64 20  the lists a and 
c4e0: 62 20 61 72 65 0a 2a 2a 20 20 20 63 68 61 6e 67  b are.**   chang
c4f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
c500: 61 72 20 2a 6d 65 72 67 65 28 61 2c 62 2c 63 6d  ar *merge(a,b,cm
c510: 70 2c 6f 66 66 73 65 74 29 0a 63 68 61 72 20 2a  p,offset).char *
c520: 61 3b 0a 63 68 61 72 20 2a 62 3b 0a 69 6e 74 20  a;.char *b;.int 
c530: 28 2a 63 6d 70 29 28 29 3b 0a 69 6e 74 20 6f 66  (*cmp)();.int of
c540: 66 73 65 74 3b 0a 7b 0a 20 20 63 68 61 72 20 2a  fset;.{.  char *
c550: 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20 20 69  ptr, *head;..  i
c560: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 68  f( a==0 ){.    h
c570: 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c 73 65  ead = b;.  }else
c580: 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20 20 20   if( b==0 ){.   
c590: 20 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d 65 6c   head = a;.  }el
c5a0: 73 65 7b 0a 20 20 20 20 69 66 28 20 28 2a 63 6d  se{.    if( (*cm
c5b0: 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20  p)(a,b)<0 ){.   
c5c0: 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20     ptr = a;.    
c5d0: 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20    a = NEXT(a);. 
c5e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c5f0: 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 62  ptr = b;.      b
c600: 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20   = NEXT(b);.    
c610: 7d 0a 20 20 20 20 68 65 61 64 20 3d 20 70 74 72  }.    head = ptr
c620: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 61 20 26  ;.    while( a &
c630: 26 20 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  & b ){.      if(
c640: 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20 29   (*cmp)(a,b)<0 )
c650: 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28 70  {.        NEXT(p
c660: 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 20 20 20  tr) = a;.       
c670: 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20   ptr = a;.      
c680: 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20    a = NEXT(a);. 
c690: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c6a0: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
c6b0: 62 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d  b;.        ptr =
c6c0: 20 62 3b 0a 20 20 20 20 20 20 20 20 62 20 3d 20   b;.        b = 
c6d0: 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 20 20 7d  NEXT(b);.      }
c6e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
c6f0: 20 29 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61   ) NEXT(ptr) = a
c700: 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 4e 45  ;.    else    NE
c710: 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 7d  XT(ptr) = b;.  }
c720: 0a 20 20 72 65 74 75 72 6e 20 68 65 61 64 3b 0a  .  return head;.
c730: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a  }../*.** Inputs:
c740: 0a 2a 2a 20 20 20 6c 69 73 74 3a 20 20 20 20 20  .**   list:     
c750: 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69   Pointer to a si
c760: 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20 6c 69 73 74  ngly-linked list
c770: 20 6f 66 20 73 74 72 75 63 74 75 72 65 73 2e 0a   of structures..
c780: 2a 2a 20 20 20 6e 65 78 74 3a 20 20 20 20 20 20  **   next:      
c790: 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  Pointer to point
c7a0: 65 72 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64  er to the second
c7b0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
c7c0: 6c 69 73 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20  list..**   cmp: 
c7d0: 20 20 20 20 20 20 41 20 63 6f 6d 70 61 72 69 73        A comparis
c7e0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  on function..**.
c7f0: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
c800: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
c810: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
c820: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
c830: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
c840: 65 6e 74 73 0a 2a 2a 20 20 20 6f 72 67 69 6e 61  ents.**   orgina
c850: 6c 6c 79 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  lly in list..**.
c860: 2a 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a  ** Side effects:
c870: 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22  .**   The "next"
c880: 20 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c   pointers for el
c890: 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73 74 20 61  ements in list a
c8a0: 72 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23  re changed..*/.#
c8b0: 64 65 66 69 6e 65 20 4c 49 53 54 53 49 5a 45 20  define LISTSIZE 
c8c0: 33 30 0a 63 68 61 72 20 2a 6d 73 6f 72 74 28 6c  30.char *msort(l
c8d0: 69 73 74 2c 6e 65 78 74 2c 63 6d 70 29 0a 63 68  ist,next,cmp).ch
c8e0: 61 72 20 2a 6c 69 73 74 3b 0a 63 68 61 72 20 2a  ar *list;.char *
c8f0: 2a 6e 65 78 74 3b 0a 69 6e 74 20 28 2a 63 6d 70  *next;.int (*cmp
c900: 29 28 29 3b 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  )();.{.  unsigne
c910: 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20  d long offset;. 
c920: 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61   char *ep;.  cha
c930: 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d  r *set[LISTSIZE]
c940: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66  ;.  int i;.  off
c950: 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  set = (unsigned 
c960: 6c 6f 6e 67 29 6e 65 78 74 20 2d 20 28 75 6e 73  long)next - (uns
c970: 69 67 6e 65 64 20 6c 6f 6e 67 29 6c 69 73 74 3b  igned long)list;
c980: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49  .  for(i=0; i<LI
c990: 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74  STSIZE; i++) set
c9a0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  [i] = 0;.  while
c9b0: 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70  ( list ){.    ep
c9c0: 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73   = list;.    lis
c9d0: 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a  t = NEXT(list);.
c9e0: 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30      NEXT(ep) = 0
c9f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
ca00: 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73  <LISTSIZE-1 && s
ca10: 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a  et[i]!=0; i++){.
ca20: 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65        ep = merge
ca30: 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f  (ep,set[i],cmp,o
ca40: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65  ffset);.      se
ca50: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
ca60: 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b      set[i] = ep;
ca70: 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20  .  }.  ep = 0;. 
ca80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
ca90: 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73  SIZE; i++) if( s
caa0: 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72  et[i] ) ep = mer
cab0: 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70  ge(ep,set[i],cmp
cac0: 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75  ,offset);.  retu
cad0: 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn ep;.}./******
cae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
caf0: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
cb00: 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a   "option.c" ****
cb10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cb20: 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63  ******/.static c
cb30: 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74  har **argv;.stat
cb40: 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69  ic struct s_opti
cb50: 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20  ons *op;.static 
cb60: 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b  FILE *errstream;
cb70: 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28  ..#define ISOPT(
cb80: 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c  X) ((X)[0]=='-'|
cb90: 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74  |(X)[0]=='+'||st
cba0: 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30  rchr((X),'=')!=0
cbb0: 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  )../*.** Print t
cbc0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
cbd0: 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f  with a carrot po
cbe0: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d  inting to the k-
cbf0: 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  th character.** 
cc00: 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c  of the n-th fiel
cc10: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
cc20: 64 20 65 72 72 6c 69 6e 65 28 6e 2c 6b 2c 65 72  d errline(n,k,er
cc30: 72 29 0a 69 6e 74 20 6e 3b 0a 69 6e 74 20 6b 3b  r).int n;.int k;
cc40: 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20  .FILE *err;.{.  
cc50: 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a 20 20  int spcnt, i;.  
cc60: 69 66 28 20 61 72 67 76 5b 30 5d 20 29 20 66 70  if( argv[0] ) fp
cc70: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 22 2c 61  rintf(err,"%s",a
cc80: 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63 6e 74  rgv[0]);.  spcnt
cc90: 20 3d 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 30   = strlen(argv[0
cca0: 5d 29 20 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d  ]) + 1;.  for(i=
ccb0: 31 3b 20 69 3c 6e 20 26 26 20 61 72 67 76 5b 69  1; i<n && argv[i
ccc0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72  ]; i++){.    fpr
ccd0: 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61  intf(err," %s",a
cce0: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63  rgv[i]);.    spc
ccf0: 6e 74 20 2b 3d 20 73 74 72 6c 65 6e 28 61 72 67  nt += strlen(arg
cd00: 76 5b 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73  v[i])+1;.  }.  s
cd10: 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72  pcnt += k;.  for
cd20: 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  (; argv[i]; i++)
cd30: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25   fprintf(err," %
cd40: 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69  s",argv[i]);.  i
cd50: 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20  f( spcnt<20 ){. 
cd60: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
cd70: 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22  \n%*s^-- here\n"
cd80: 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65  ,spcnt,"");.  }e
cd90: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
cda0: 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20  (err,"\n%*shere 
cdb0: 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22  --^\n",spcnt-7,"
cdc0: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
cdd0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
cde0: 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f  x of the N-th no
cdf0: 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e  n-switch argumen
ce00: 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  t.  Return -1.**
ce10: 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20   if N is out of 
ce20: 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  range..*/.static
ce30: 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28 6e 29   int argindex(n)
ce40: 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20  .int n;.{.  int 
ce50: 69 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73  i;.  int dashdas
ce60: 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67  h = 0;.  if( arg
ce70: 76 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30  v!=0 && *argv!=0
ce80: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
ce90: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   argv[i]; i++){.
cea0: 20 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61        if( dashda
ceb0: 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67  sh || !ISOPT(arg
cec0: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  v[i]) ){.       
ced0: 20 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75   if( n==0 ) retu
cee0: 72 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d  rn i;.        n-
cef0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
cf00: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
cf10: 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64  [i],"--")==0 ) d
cf20: 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20  ashdash = 1;.   
cf30: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
cf40: 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  -1;.}..static ch
cf50: 61 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d  ar emsg[] = "Com
cf60: 6d 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78  mand line syntax
cf70: 20 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a   error: ";../*.*
cf80: 2a 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67  * Process a flag
cf90: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72   command line ar
cfa0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
cfb0: 63 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67  c int handleflag
cfc0: 73 28 69 2c 65 72 72 29 0a 69 6e 74 20 69 3b 0a  s(i,err).int i;.
cfd0: 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69  FILE *err;.{.  i
cfe0: 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65 72 72 63  nt v;.  int errc
cff0: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  nt = 0;.  int j;
d000: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a  .  for(j=0; op[j
d010: 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20  ].label; j++){. 
d020: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26     if( strncmp(&
d030: 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a 5d  argv[i][1],op[j]
d040: 2e 6c 61 62 65 6c 2c 73 74 72 6c 65 6e 28 6f 70  .label,strlen(op
d050: 5b 6a 5d 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29  [j].label))==0 )
d060: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20   break;.  }.  v 
d070: 3d 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d  = argv[i][0]=='-
d080: 27 20 3f 20 31 20 3a 20 30 3b 0a 20 20 69 66 28  ' ? 1 : 0;.  if(
d090: 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20   op[j].label==0 
d0a0: 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29  ){.    if( err )
d0b0: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
d0c0: 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65 64  err,"%sundefined
d0d0: 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67   option.\n",emsg
d0e0: 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65  );.      errline
d0f0: 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d  (i,1,err);.    }
d100: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
d110: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
d120: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47 20  .type==OPT_FLAG 
d130: 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29 6f  ){.    *((int*)o
d140: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a 20  p[j].arg) = v;. 
d150: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
d160: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41 47  .type==OPT_FFLAG
d170: 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28   ){.    (*(void(
d180: 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  *)())(op[j].arg)
d190: 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )(v);.  }else if
d1a0: 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50  ( op[j].type==OP
d1b0: 54 5f 46 53 54 52 20 29 7b 0a 20 20 20 20 28 2a  T_FSTR ){.    (*
d1c0: 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a  (void(*)())(op[j
d1d0: 5d 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d  ].arg))(&argv[i]
d1e0: 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [2]);.  }else{. 
d1f0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
d200: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
d210: 22 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d  "%smissing argum
d220: 65 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e  ent on switch.\n
d230: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65  ",emsg);.      e
d240: 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b  rrline(i,1,err);
d250: 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e  .    }.    errcn
d260: 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t++;.  }.  retur
d270: 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  n errcnt;.}../*.
d280: 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d  ** Process a com
d290: 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68  mand line switch
d2a0: 20 77 68 69 63 68 20 68 61 73 20 61 6e 20 61 72   which has an ar
d2b0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
d2c0: 63 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74  c int handleswit
d2d0: 63 68 28 69 2c 65 72 72 29 0a 69 6e 74 20 69 3b  ch(i,err).int i;
d2e0: 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20  .FILE *err;.{.  
d2f0: 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20 20 64 6f  int lv = 0;.  do
d300: 75 62 6c 65 20 64 76 20 3d 20 30 2e 30 3b 0a 20  uble dv = 0.0;. 
d310: 20 63 68 61 72 20 2a 73 76 20 3d 20 30 2c 20 2a   char *sv = 0, *
d320: 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  end;.  char *cp;
d330: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20  .  int j;.  int 
d340: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 63 70  errcnt = 0;.  cp
d350: 20 3d 20 73 74 72 63 68 72 28 61 72 67 76 5b 69   = strchr(argv[i
d360: 5d 2c 27 3d 27 29 3b 0a 20 20 61 73 73 65 72 74  ],'=');.  assert
d370: 28 20 63 70 21 3d 30 20 29 3b 0a 20 20 2a 63 70  ( cp!=0 );.  *cp
d380: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   = 0;.  for(j=0;
d390: 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b   op[j].label; j+
d3a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
d3b0: 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d  mp(argv[i],op[j]
d3c0: 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65  .label)==0 ) bre
d3d0: 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20  ak;.  }.  *cp = 
d3e0: 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d  '=';.  if( op[j]
d3f0: 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  .label==0 ){.   
d400: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
d410: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
d420: 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f  sundefined optio
d430: 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  n.\n",emsg);.   
d440: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65     errline(i,0,e
d450: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  rr);.    }.    e
d460: 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rrcnt++;.  }else
d470: 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20  {.    cp++;.    
d480: 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79  switch( op[j].ty
d490: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
d4a0: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
d4b0: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
d4c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72  .        if( err
d4d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
d4e0: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6f 70 74  rintf(err,"%sopt
d4f0: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
d500: 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73  argument.\n",ems
d510: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 72  g);.          er
d520: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a  rline(i,0,err);.
d530: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d540: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
d550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d560: 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
d570: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
d580: 42 4c 3a 0a 20 20 20 20 20 20 20 20 64 76 20 3d  BL:.        dv =
d590: 20 73 74 72 74 6f 64 28 63 70 2c 26 65 6e 64 29   strtod(cp,&end)
d5a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65  ;.        if( *e
d5b0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
d5c0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
d5d0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
d5e0: 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68  rr,"%sillegal ch
d5f0: 61 72 61 63 74 65 72 20 69 6e 20 66 6c 6f 61 74  aracter in float
d600: 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65  ing-point argume
d610: 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  nt.\n",emsg);.  
d620: 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e            errlin
d630: 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c  e(i,((unsigned l
d640: 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e  ong)end)-(unsign
d650: 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c  ed long)argv[i],
d660: 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
d670: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63  }.          errc
d680: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
d690: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d6a0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
d6b0: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  T:.      case OP
d6c0: 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
d6d0: 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26  lv = strtol(cp,&
d6e0: 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  end,0);.        
d6f0: 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20  if( *end ){.    
d700: 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b        if( err ){
d710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
d720: 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65  intf(err,"%sille
d730: 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e  gal character in
d740: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
d750: 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  t.\n",emsg);.   
d760: 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65           errline
d770: 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  (i,((unsigned lo
d780: 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65  ng)end)-(unsigne
d790: 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65  d long)argv[i],e
d7a0: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rr);.          }
d7b0: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e  .          errcn
d7c0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
d7d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d7e0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
d7f0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d800: 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73  _FSTR:.        s
d810: 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20  v = cp;.        
d820: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d830: 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74   switch( op[j].t
d840: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
d850: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
d860: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
d870: 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  :.        break;
d880: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d890: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64  DBL:.        *(d
d8a0: 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72  ouble*)(op[j].ar
d8b0: 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20  g) = dv;.       
d8c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
d8d0: 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
d8e0: 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
d8f0: 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64  ))(op[j].arg))(d
d900: 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
d910: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d920: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a  T_INT:.        *
d930: 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  (int*)(op[j].arg
d940: 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20  ) = lv;.        
d950: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
d960: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
d970: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29      (*(void(*)()
d980: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28 69  )(op[j].arg))((i
d990: 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20 20 20 20  nt)lv);.        
d9a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
d9b0: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
d9c0: 20 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70 5b     *(char**)(op[
d9d0: 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20 20  j].arg) = sv;.  
d9e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d9f0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
da00: 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69  :.        (*(voi
da10: 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72  d(*)())(op[j].ar
da20: 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20  g))(sv);.       
da30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
da40: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
da50: 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69  t;.}..int OptIni
da60: 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68 61 72 20  t(a,o,err).char 
da70: 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70  **a;.struct s_op
da80: 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c 45 20 2a  tions *o;.FILE *
da90: 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 65 72 72  err;.{.  int err
daa0: 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20  cnt = 0;.  argv 
dab0: 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20  = a;.  op = o;. 
dac0: 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72   errstream = err
dad0: 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26 26 20  ;.  if( argv && 
dae0: 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20  *argv && op ){. 
daf0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
db00: 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20  r(i=1; argv[i]; 
db10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
db20: 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20  argv[i][0]=='+' 
db30: 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  || argv[i][0]=='
db40: 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  -' ){.        er
db50: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c  rcnt += handlefl
db60: 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  ags(i,err);.    
db70: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
db80: 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20  hr(argv[i],'=') 
db90: 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e  ){.        errcn
dba0: 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63  t += handleswitc
dbb0: 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  h(i,err);.      
dbc0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
dbd0: 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20  ( errcnt>0 ){.  
dbe0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56    fprintf(err,"V
dbf0: 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  alid command lin
dc00: 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22  e options for \"
dc10: 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29  %s\" are:\n",*a)
dc20: 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29  ;.    OptPrint()
dc30: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
dc40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
dc50: 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 29  ..int OptNArgs()
dc60: 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  {.  int cnt = 0;
dc70: 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20  .  int dashdash 
dc80: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
dc90: 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 61  if( argv!=0 && a
dca0: 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20  rgv[0]!=0 ){.   
dcb0: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
dcc0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
dcd0: 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21  f( dashdash || !
dce0: 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29  ISOPT(argv[i]) )
dcf0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
dd00: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
dd10: 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68  ,"--")==0 ) dash
dd20: 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  dash = 1;.    }.
dd30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74    }.  return cnt
dd40: 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72  ;.}..char *OptAr
dd50: 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20  g(n).int n;.{.  
dd60: 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67  int i;.  i = arg
dd70: 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75  index(n);.  retu
dd80: 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69  rn i>=0 ? argv[i
dd90: 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f  ] : 0;.}..void O
dda0: 70 74 45 72 72 28 6e 29 0a 69 6e 74 20 6e 3b 0a  ptErr(n).int n;.
ddb0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
ddc0: 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20   argindex(n);.  
ddd0: 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69  if( i>=0 ) errli
dde0: 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d  ne(i,0,errstream
ddf0: 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72  );.}..void OptPr
de00: 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  int(){.  int i;.
de10: 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a    int max, len;.
de20: 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72    max = 0;.  for
de30: 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65  (i=0; op[i].labe
de40: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e  l; i++){.    len
de50: 20 3d 20 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e   = strlen(op[i].
de60: 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20  label) + 1;.    
de70: 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79  switch( op[i].ty
de80: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
de90: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
dea0: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
deb0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dec0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49        case OPT_I
ded0: 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  NT:.      case O
dee0: 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20  PT_FINT:.       
def0: 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20   len += 9;      
df00: 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c   /* length of "<
df10: 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20  integer>" */.   
df20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
df30: 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a    case OPT_DBL:.
df40: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
df50: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e  DBL:.        len
df60: 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20   += 6;       /* 
df70: 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c  length of "<real
df80: 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  >" */.        br
df90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
dfa0: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63  OPT_STR:.      c
dfb0: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
dfc0: 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20        len += 8; 
dfd0: 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
dfe0: 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f  of "<string>" */
dff0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e000: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65      }.    if( le
e010: 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65  n>max ) max = le
e020: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
e030: 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69  ; op[i].label; i
e040: 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ++){.    switch(
e050: 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20   op[i].type ){. 
e060: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c       case OPT_FL
e070: 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  AG:.      case O
e080: 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20  PT_FFLAG:.      
e090: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
e0a0: 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73  eam,"  -%-*s  %s
e0b0: 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61  \n",max,op[i].la
e0c0: 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  bel,op[i].messag
e0d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
e0e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
e0f0: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
e100: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
e110: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
e120: 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e 74  tream,"  %s=<int
e130: 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  eger>%*s  %s\n",
e140: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
e150: 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78         (int)(max
e160: 2d 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61  -strlen(op[i].la
e170: 62 65 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d  bel)-9),"",op[i]
e180: 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
e190: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e1a0: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
e1b0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
e1c0: 4c 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  L:.        fprin
e1d0: 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20  tf(errstream,"  
e1e0: 25 73 3d 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73  %s=<real>%*s  %s
e1f0: 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  \n",op[i].label,
e200: 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29  .          (int)
e210: 28 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69  (max-strlen(op[i
e220: 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f  ].label)-6),"",o
e230: 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
e240: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e250: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
e260: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
e270: 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66  _FSTR:.        f
e280: 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
e290: 2c 22 20 20 25 73 3d 3c 73 74 72 69 6e 67 3e 25  ,"  %s=<string>%
e2a0: 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
e2b0: 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
e2c0: 20 28 69 6e 74 29 28 6d 61 78 2d 73 74 72 6c 65   (int)(max-strle
e2d0: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38  n(op[i].label)-8
e2e0: 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  ),"",op[i].messa
e2f0: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
e300: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
e310: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
e320: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
e330: 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22  e file "parse.c"
e340: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
e350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
e360: 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20  *.** Input file 
e370: 70 61 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c  parser for the L
e380: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
e390: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68  rator..*/../* Th
e3a0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
e3b0: 61 72 73 65 72 20 2a 2f 0a 73 74 72 75 63 74 20  arser */.struct 
e3c0: 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72 20  pstate {.  char 
e3d0: 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  *filename;      
e3e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
e3f0: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
e400: 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  int tokenlineno;
e410: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d        /* Linenum
e420: 62 65 72 20 61 74 20 77 68 69 63 68 20 63 75 72  ber at which cur
e430: 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72 74  rent token start
e440: 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72  s */.  int error
e450: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  cnt;         /* 
e460: 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
e470: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61   so far */.  cha
e480: 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20 20  r *tokenstart;  
e490: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63 75     /* Text of cu
e4a0: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20  rrent token */. 
e4b0: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67   struct lemon *g
e4c0: 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  p;     /* Global
e4d0: 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a 2f   state vector */
e4e0: 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65 20  .  enum e_state 
e4f0: 7b 0a 20 20 20 20 49 4e 49 54 49 41 4c 49 5a 45  {.    INITIALIZE
e500: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e510: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a  R_DECL_OR_RULE,.
e520: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
e530: 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20  DECL_KEYWORD,.  
e540: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
e550: 43 4c 5f 41 52 47 2c 0a 20 20 20 20 57 41 49 54  CL_ARG,.    WAIT
e560: 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
e570: 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57  CE_SYMBOL,.    W
e580: 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57  AITING_FOR_ARROW
e590: 2c 0a 20 20 20 20 49 4e 5f 52 48 53 2c 0a 20 20  ,.    IN_RHS,.  
e5a0: 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20    LHS_ALIAS_1,. 
e5b0: 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a     LHS_ALIAS_2,.
e5c0: 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c      LHS_ALIAS_3,
e5d0: 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 31  .    RHS_ALIAS_1
e5e0: 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f  ,.    RHS_ALIAS_
e5f0: 32 2c 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43  2,.    PRECEDENC
e600: 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 20 20 50 52  E_MARK_1,.    PR
e610: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c  ECEDENCE_MARK_2,
e620: 0a 20 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45  .    RESYNC_AFTE
e630: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20  R_RULE_ERROR,.  
e640: 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44    RESYNC_AFTER_D
e650: 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 20 20 57  ECL_ERROR,.    W
e660: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
e670: 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20  UCTOR_SYMBOL,.  
e680: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41    WAITING_FOR_DA
e690: 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20  TATYPE_SYMBOL,. 
e6a0: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46     WAITING_FOR_F
e6b0: 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 20 20  ALLBACK_ID,.    
e6c0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44  WAITING_FOR_WILD
e6d0: 43 41 52 44 5f 49 44 0a 20 20 7d 20 73 74 61 74  CARD_ID.  } stat
e6e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e6f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74       /* The stat
e700: 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  e of the parser 
e710: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
e720: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20 20  ol *fallback;   
e730: 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b 20  /* The fallback 
e740: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63  token */.  struc
e750: 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20  t symbol *lhs;  
e760: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61        /* Left-ha
e770: 6e 64 20 73 69 64 65 20 6f 66 20 63 75 72 72 65  nd side of curre
e780: 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 68 61  nt rule */.  cha
e790: 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20  r *lhsalias;    
e7a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73          /* Alias
e7b0: 20 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f 0a   for the LHS */.
e7c0: 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20 20    int nrhs;     
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e7e0: 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74 2d  Number of right-
e7f0: 68 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f 6c  hand side symbol
e800: 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72 75  s seen */.  stru
e810: 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b 4d  ct symbol *rhs[M
e820: 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53 20  AXRHS];  /* RHS 
e830: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61  symbols */.  cha
e840: 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d  r *alias[MAXRHS]
e850: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  ;       /* Alias
e860: 65 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20  es for each RHS 
e870: 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c 29  symbol (or NULL)
e880: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
e890: 65 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20 20  e *prevrule;    
e8a0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75 6c   /* Previous rul
e8b0: 65 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63 68  e parsed */.  ch
e8c0: 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b  ar *declkeyword;
e8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77           /* Keyw
e8e0: 6f 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72 61  ord of a declara
e8f0: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
e900: 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20 20  *declargslot;   
e910: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68       /* Where th
e920: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 72  e declaration ar
e930: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
e940: 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64   put */.  int *d
e950: 65 63 6c 6c 6e 73 6c 6f 74 3b 20 20 20 20 20 20  ecllnslot;      
e960: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68       /* Where th
e970: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69  e declaration li
e980: 6e 65 6e 75 6d 62 65 72 20 69 73 20 70 75 74 20  nenumber is put 
e990: 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f  */.  enum e_asso
e9a0: 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20  c declassoc;    
e9b0: 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 61  /* Assign this a
e9c0: 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65  ssociation to de
e9d0: 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  cl arguments */.
e9e0: 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65    int preccounte
e9f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
ea00: 41 73 73 69 67 6e 20 74 68 69 73 20 70 72 65 63  Assign this prec
ea10: 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61  edence to decl a
ea20: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74  rguments */.  st
ea30: 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74  ruct rule *first
ea40: 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e  rule;    /* Poin
ea50: 74 65 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c  ter to first rul
ea60: 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72  e in the grammar
ea70: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
ea80: 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20  e *lastrule;    
ea90: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
eaa0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
eab0: 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a   parsed rule */.
eac0: 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73  };../* Parse a s
ead0: 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73  ingle token */.s
eae0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65  tatic void parse
eaf0: 6f 6e 65 74 6f 6b 65 6e 28 70 73 70 29 0a 73 74  onetoken(psp).st
eb00: 72 75 63 74 20 70 73 74 61 74 65 20 2a 70 73 70  ruct pstate *psp
eb10: 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 78 3b 0a 20  ;.{.  char *x;. 
eb20: 20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73 70   x = Strsafe(psp
eb30: 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20  ->tokenstart);  
eb40: 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74     /* Save the t
eb50: 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79  oken permanently
eb60: 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e   */.#if 0.  prin
eb70: 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e  tf("%s:%d: Token
eb80: 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e  =[%s] state=%d\n
eb90: 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  ",psp->filename,
eba0: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
ebb0: 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61  ,.    x,psp->sta
ebc0: 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77  te);.#endif.  sw
ebd0: 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65  itch( psp->state
ebe0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49   ){.    case INI
ebf0: 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70  TIALIZE:.      p
ec00: 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30  sp->prevrule = 0
ec10: 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65  ;.      psp->pre
ec20: 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20  ccounter = 0;.  
ec30: 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75      psp->firstru
ec40: 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75  le = psp->lastru
ec50: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73  le = 0;.      ps
ec60: 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30  p->gp->nrule = 0
ec70: 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  ;.      /* Fall 
ec80: 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73  thru to next cas
ec90: 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41  e */.    case WA
eca0: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
ecb0: 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66  R_RULE:.      if
ecc0: 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20  ( x[0]=='%' ){. 
ecd0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
ece0: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
ecf0: 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20  DECL_KEYWORD;.  
ed00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
ed10: 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  lower(x[0]) ){. 
ed20: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20         psp->lhs 
ed30: 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
ed40: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72  .        psp->nr
ed50: 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  hs = 0;.        
ed60: 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20  psp->lhsalias = 
ed70: 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
ed80: 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
ed90: 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20  FOR_ARROW;.     
eda0: 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d   }else if( x[0]=
edb0: 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='{' ){.        
edc0: 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
edd0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
ede0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
edf0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
ee00: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72  kenlineno,."Ther
ee10: 65 20 69 73 20 6e 6f 74 20 70 72 69 6f 72 20 72  e is not prior r
ee20: 75 6c 65 20 6f 70 6f 6e 20 77 68 69 63 68 20 74  ule opon which t
ee30: 6f 20 61 74 74 61 63 68 20 74 68 65 20 63 6f 64  o attach the cod
ee40: 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69  e \.fragment whi
ee50: 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69  ch begins on thi
ee60: 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20  s line.");.     
ee70: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
ee80: 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66 28  nt++;..}else if(
ee90: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
eea0: 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  code!=0 ){.     
eeb0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
eec0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
eed0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43  >tokenlineno,."C
eee0: 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62 65 67  ode fragment beg
eef0: 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  inning on this l
ef00: 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66  ine is not the f
ef10: 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77  irst \.to follow
ef20: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 75   the previous ru
ef30: 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  le.");.         
ef40: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
ef50: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
ef60: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
ef70: 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d  prevrule->line =
ef80: 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
ef90: 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  o;.          psp
efa0: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65  ->prevrule->code
efb0: 20 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20   = &x[1];..}.   
efc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
efd0: 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  ]=='[' ){.      
efe0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
eff0: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
f000: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f010: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f020: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f030: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f040: 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65 6e            "Token
f050: 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
f060: 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22 20  e either \"%%\" 
f070: 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  or a nonterminal
f080: 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20   name.",.       
f090: 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70     x);.        p
f0a0: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f0b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f0c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52  eak;.    case PR
f0d0: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a  ECEDENCE_MARK_1:
f0e0: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 75 70  .      if( !isup
f0f0: 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  per(x[0]) ){.   
f100: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f110: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f120: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f130: 20 20 20 20 20 20 20 20 22 54 68 65 20 70 72 65          "The pre
f140: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d  cedence symbol m
f150: 75 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e 61  ust be a termina
f160: 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  l.");.        ps
f170: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f180: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
f190: 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
f1a0: 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
f1b0: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f1c0: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f1d0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54  no,.          "T
f1e0: 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72  here is no prior
f1f0: 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e 20   rule to assign 
f200: 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25 73  precedence \"[%s
f210: 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  ]\".",x);.      
f220: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f230: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
f240: 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
f250: 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a  ->precsym!=0 ){.
f260: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f270: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f280: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f290: 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61 72  ."Precedence mar
f2a0: 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  k on this line i
f2b0: 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20  s not the first 
f2c0: 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20  \.to follow the 
f2d0: 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29  previous rule.")
f2e0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f2f0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f310: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70  psp->prevrule->p
f320: 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f  recsym = Symbol_
f330: 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a  new(x);.      }.
f340: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f350: 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41   = PRECEDENCE_MA
f360: 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65 61  RK_2;.      brea
f370: 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43  k;.    case PREC
f380: 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20  EDENCE_MARK_2:. 
f390: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d 27       if( x[0]!='
f3a0: 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]' ){.        Er
f3b0: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
f3c0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f3d0: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
f3e0: 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20   "Missing \"]\" 
f3f0: 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d 61  on precedence ma
f400: 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  rk.");.        p
f410: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f420: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73        }.      ps
f430: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
f440: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
f450: 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ULE;.      break
f460: 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
f470: 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20  NG_FOR_ARROW:.  
f480: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a      if( x[0]==':
f490: 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26  ' && x[1]==':' &
f4a0: 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20  & x[2]=='=' ){. 
f4b0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f4c0: 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
f4d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
f4e0: 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20  =='(' ){.       
f4f0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
f500: 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20  S_ALIAS_1;.     
f510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f520: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f530: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f540: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
f550: 20 20 20 22 45 78 70 65 63 74 65 64 20 74 6f 20     "Expected to 
f560: 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c  see a \":\" foll
f570: 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73 79  owing the LHS sy
f580: 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20  mbol \"%s\".",. 
f590: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
f5a0: 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
f5b0: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f5c0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
f5d0: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
f5e0: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
f5f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f600: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c  reak;.    case L
f610: 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20  HS_ALIAS_1:.    
f620: 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b    if( isalpha(x[
f630: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
f640: 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78  sp->lhsalias = x
f650: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f660: 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
f670: 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _2;.      }else{
f680: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f690: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f6a0: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f6b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25  ,.          "\"%
f6c0: 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  s\" is not a val
f6d0: 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  id alias for the
f6e0: 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a   LHS \"%s\"\n",.
f6f0: 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
f700: 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
f710: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f720: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
f730: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
f740: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
f750: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
f760: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f770: 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20  e LHS_ALIAS_2:. 
f780: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
f790: 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  )' ){.        ps
f7a0: 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
f7b0: 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65  LIAS_3;.      }e
f7c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
f7d0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f7e0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f7f0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
f800: 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66  "Missing \")\" f
f810: 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69  ollowing LHS ali
f820: 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22  as name \"%s\"."
f830: 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  ,psp->lhsalias);
f840: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
f850: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f860: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
f870: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
f880: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
f890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f8a0: 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f   case LHS_ALIAS_
f8b0: 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  3:.      if( x[0
f8c0: 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d  ]==':' && x[1]==
f8d0: 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27  ':' && x[2]=='='
f8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
f8f0: 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
f900: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f910: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f920: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f930: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f940: 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
f950: 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69  g \"->\" followi
f960: 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e 22  ng: \"%s(%s)\"."
f970: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 73 70  ,.           psp
f980: 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d  ->lhs->name,psp-
f990: 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
f9a0: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f9b0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
f9c0: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
f9d0: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
f9e0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
f9f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
fa00: 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20 69   IN_RHS:.      i
fa10: 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
fa20: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 72          struct r
fa30: 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20 20  ule *rp;.       
fa40: 20 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75   rp = (struct ru
fa50: 6c 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  le *)malloc( siz
fa60: 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65 29  eof(struct rule)
fa70: 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
fa80: 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
fa90: 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68  ymbol*)*psp->nrh
faa0: 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  s + sizeof(char*
fab0: 29 2a 70 73 70 2d 3e 6e 72 68 73 20 29 3b 0a 20  )*psp->nrhs );. 
fac0: 20 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30         if( rp==0
fad0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
fae0: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
faf0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
fb00: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
fb10: 20 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61     "Can't alloca
fb20: 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79  te enough memory
fb30: 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22   for this rule."
fb40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
fb50: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
fb60: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
fb70: 76 72 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c 73  vrule = 0;..}els
fb80: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
fb90: 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70   i;.          rp
fba0: 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73 70  ->ruleline = psp
fbb0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20  ->tokenlineno;. 
fbc0: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
fbd0: 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
fbe0: 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20 20  l**)&rp[1];.    
fbf0: 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69        rp->rhsali
fc00: 61 73 20 3d 20 28 63 68 61 72 2a 2a 29 26 28 72  as = (char**)&(r
fc10: 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
fc20: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  ]);.          fo
fc30: 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72  r(i=0; i<psp->nr
fc40: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
fc50: 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
fc60: 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a   = psp->rhs[i];.
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e              rp->
fc80: 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73  rhsalias[i] = ps
fc90: 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20 20  p->alias[i];..  
fca0: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  }.          rp->
fcb0: 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a  lhs = psp->lhs;.
fcc0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
fcd0: 73 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68  salias = psp->lh
fce0: 73 61 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20  salias;.        
fcf0: 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70    rp->nrhs = psp
fd00: 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20  ->nrhs;.        
fd10: 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a    rp->code = 0;.
fd20: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72            rp->pr
fd30: 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20  ecsym = 0;.     
fd40: 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d       rp->index =
fd50: 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b   psp->gp->nrule+
fd60: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  +;.          rp-
fd70: 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c  >nextlhs = rp->l
fd80: 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20  hs->rule;.      
fd90: 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c      rp->lhs->rul
fda0: 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20  e = rp;.        
fdb0: 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a    rp->next = 0;.
fdc0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 73            if( ps
fdd0: 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20  p->firstrule==0 
fde0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
fdf0: 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20  sp->firstrule = 
fe00: 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
fe10: 72 70 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20  rp;..  }else{.  
fe20: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
fe30: 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20  astrule->next = 
fe40: 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rp;.            
fe50: 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
fe60: 72 70 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20  rp;..  }.       
fe70: 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
fe80: 20 3d 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20 20   = rp;..}.      
fe90: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
fea0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
feb0: 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d  OR_RULE;.      }
fec0: 65 6c 73 65 20 69 66 28 20 69 73 61 6c 70 68 61  else if( isalpha
fed0: 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
fee0: 20 20 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e    if( psp->nrhs>
fef0: 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20  =MAXRHS ){.     
ff00: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
ff10: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
ff20: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
ff30: 20 20 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d            "Too m
ff40: 61 6e 79 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 52  any symbols on R
ff50: 48 53 20 6f 72 20 72 75 6c 65 20 62 65 67 69 6e  HS or rule begin
ff60: 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22  ning at \"%s\"."
ff70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 29  ,.            x)
ff80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
ff90: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
ffa0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
ffb0: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
ffc0: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65  _RULE_ERROR;..}e
ffd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
ffe0: 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  sp->rhs[psp->nrh
fff0: 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  s] = Symbol_new(
10000 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
10010 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72  p->alias[psp->nr
10020 68 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  hs] = 0;.       
10030 20 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a     psp->nrhs++;.
10040 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .}.      }else i
10050 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c  f( (x[0]=='|' ||
10060 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 70   x[0]=='/') && p
10070 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20  sp->nrhs>0 ){.  
10080 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
10090 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e  bol *msp = psp->
100a0 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  rhs[psp->nrhs-1]
100b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 73  ;.        if( ms
100c0 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45  p->type!=MULTITE
100d0 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
100e0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
100f0 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70 3b  l *origsp = msp;
10100 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 20 3d  .          msp =
10110 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
10120 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20  msp));.         
10130 20 6d 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c 20   memset(msp, 0, 
10140 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20  sizeof(*msp));. 
10150 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 74 79           msp->ty
10160 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e  pe = MULTITERMIN
10170 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  AL;.          ms
10180 70 2d 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b 0a  p->nsubsym = 1;.
10190 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73            msp->s
101a0 75 62 73 79 6d 20 3d 20 6d 61 6c 6c 6f 63 28 73  ubsym = malloc(s
101b0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
101c0 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20  bol*));.        
101d0 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d    msp->subsym[0]
101e0 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20   = origsp;.     
101f0 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d       msp->name =
10200 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20   origsp->name;. 
10210 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
10220 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d  s[psp->nrhs-1] =
10230 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a   msp;.        }.
10240 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75          msp->nsu
10250 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  bsym++;.        
10260 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 72 65  msp->subsym = re
10270 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79  alloc(msp->subsy
10280 6d 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  m, sizeof(struct
10290 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e   symbol*)*msp->n
102a0 73 75 62 73 79 6d 29 3b 0a 20 20 20 20 20 20 20  subsym);.       
102b0 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70   msp->subsym[msp
102c0 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53  ->nsubsym-1] = S
102d0 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b 31 5d 29  ymbol_new(&x[1])
102e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  ;.        if( is
102f0 6c 6f 77 65 72 28 78 5b 31 5d 29 20 7c 7c 20 69  lower(x[1]) || i
10300 73 6c 6f 77 65 72 28 6d 73 70 2d 3e 73 75 62 73  slower(msp->subs
10310 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 20  ym[0]->name[0]) 
10320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
10330 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10340 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10350 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10360 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72 6d 20 61    "Cannot form a
10370 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74 61 69   compound contai
10380 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65 72 6d 69  ning a non-termi
10390 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 20  nal");.         
103a0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
103b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
103c0 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
103d0 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e 6e 72  =='(' && psp->nr
103e0 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  hs>0 ){.        
103f0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53  psp->state = RHS
10400 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20  _ALIAS_1;.      
10410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
10420 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10430 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
10440 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
10450 20 20 22 49 6c 6c 65 67 61 6c 20 63 68 61 72 61    "Illegal chara
10460 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66 20 72  cter on RHS of r
10470 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29  ule: \"%s\".",x)
10480 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
10490 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
104a0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
104b0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
104c0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
104d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
104e0 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53    case RHS_ALIAS
104f0 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73  _1:.      if( is
10500 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
10510 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61         psp->alia
10520 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d  s[psp->nrhs-1] =
10530 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   x;.        psp-
10540 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49  >state = RHS_ALI
10550 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_2;.      }els
10560 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
10570 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
10580 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
10590 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c  no,.          "\
105a0 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76  "%s\" is not a v
105b0 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74  alid alias for t
105c0 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20 5c 22  he RHS symbol \"
105d0 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
105e0 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b 70 73     x,psp->rhs[ps
105f0 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65  p->nrhs-1]->name
10600 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
10610 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10620 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10630 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
10640 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
10650 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
10660 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41     case RHS_ALIA
10670 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78  S_2:.      if( x
10680 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20  [0]==')' ){.    
10690 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
106a0 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
106b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
106c0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
106d0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
106e0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
106f0 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20   "Missing \")\" 
10700 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c  following LHS al
10710 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e  ias name \"%s\".
10720 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29  ",psp->lhsalias)
10730 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
10740 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
10750 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10760 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
10770 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
10780 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10790 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
107a0 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3a  OR_DECL_KEYWORD:
107b0 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c 70  .      if( isalp
107c0 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ha(x[0]) ){.    
107d0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b 65 79      psp->declkey
107e0 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20 20 20  word = x;.      
107f0 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
10800 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ot = 0;.        
10810 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
10820 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
10830 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
10840 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a  G_FOR_DECL_ARG;.
10850 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
10860 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20  mp(x,"name")==0 
10870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10880 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10890 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29  &(psp->gp->name)
108a0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
108b0 63 6d 70 28 78 2c 22 69 6e 63 6c 75 64 65 22 29  cmp(x,"include")
108c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
108d0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
108e0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 69  t = &(psp->gp->i
108f0 6e 63 6c 75 64 65 29 3b 0a 20 20 20 20 20 20 20  nclude);.       
10900 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
10910 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 69  ot = &psp->gp->i
10920 6e 63 6c 75 64 65 6c 6e 3b 0a 09 7d 65 6c 73 65  ncludeln;..}else
10930 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63   if( strcmp(x,"c
10940 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ode")==0 ){.    
10950 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
10960 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
10970 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a  gp->extracode);.
10980 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10990 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70  ecllnslot = &psp
109a0 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 6c  ->gp->extracodel
109b0 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  n;..}else if( st
109c0 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 64 65  rcmp(x,"token_de
109d0 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b  structor")==0 ){
109e0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
109f0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
10a00 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65 73  sp->gp->tokendes
10a10 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  t;.          psp
10a20 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26  ->decllnslot = &
10a30 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65  psp->gp->tokende
10a40 73 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28  stln;..}else if(
10a50 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75   strcmp(x,"defau
10a60 6c 74 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d  lt_destructor")=
10a70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10a80 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10a90 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61 72   = &psp->gp->var
10aa0 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dest;.          
10ab0 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
10ac0 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61 72 64  = &psp->gp->vard
10ad0 65 73 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66  estln;..}else if
10ae0 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
10af0 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b  n_prefix")==0 ){
10b00 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10b10 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
10b20 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65  sp->gp->tokenpre
10b30 66 69 78 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  fix;..}else if( 
10b40 73 74 72 63 6d 70 28 78 2c 22 73 79 6e 74 61 78  strcmp(x,"syntax
10b50 5f 65 72 72 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  _error")==0 ){. 
10b60 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10b70 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
10b80 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 29 3b 0a 20  p->gp->error);. 
10b90 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10ba0 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d  cllnslot = &psp-
10bb0 3e 67 70 2d 3e 65 72 72 6f 72 6c 6e 3b 0a 09 7d  >gp->errorln;..}
10bc0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10bd0 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74 22  x,"parse_accept"
10be0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10bf0 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
10c00 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
10c10 61 63 63 65 70 74 29 3b 0a 20 20 20 20 20 20 20  accept);.       
10c20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
10c30 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 61  ot = &psp->gp->a
10c40 63 63 65 70 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20  cceptln;..}else 
10c50 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61  if( strcmp(x,"pa
10c60 72 73 65 5f 66 61 69 6c 75 72 65 22 29 3d 3d 30  rse_failure")==0
10c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10c80 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10c90 20 26 28 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c   &(psp->gp->fail
10ca0 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ure);.          
10cb0 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
10cc0 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c  = &psp->gp->fail
10cd0 75 72 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66  ureln;..}else if
10ce0 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63  ( strcmp(x,"stac
10cf0 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20  k_overflow")==0 
10d00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10d10 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10d20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66  &(psp->gp->overf
10d30 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  low);.          
10d40 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
10d50 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72  = &psp->gp->over
10d60 66 6c 6f 77 6c 6e 3b 0a 20 20 20 20 20 20 20 20  flowln;.        
10d70 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10d80 28 78 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65  (x,"extra_argume
10d90 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nt")==0 ){.     
10da0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10db0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10dc0 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20  p->arg);.       
10dd0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
10de0 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22  p(x,"token_type"
10df0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10e00 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
10e10 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
10e20 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20  tokentype);.    
10e30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
10e40 72 63 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f  rcmp(x,"default_
10e50 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  type")==0 ){.   
10e60 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10e70 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
10e80 3e 67 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20  >gp->vartype);. 
10e90 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10ea0 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b   strcmp(x,"stack
10eb0 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _size")==0 ){.  
10ec0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10ed0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
10ee0 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29  ->gp->stacksize)
10ef0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10f00 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74  if( strcmp(x,"st
10f10 61 72 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20  art_symbol")==0 
10f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10f30 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10f40 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74  &(psp->gp->start
10f50 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
10f60 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6c   if( strcmp(x,"l
10f70 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eft")==0 ){.    
10f80 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
10f90 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
10fa0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
10fb0 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20  oc = LEFT;.     
10fc0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10fd0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
10fe0 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
10ff0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11000 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72 69 67  f( strcmp(x,"rig
11010 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ht")==0 ){.     
11020 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
11030 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  unter++;.       
11040 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f     psp->declasso
11050 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20 20 20  c = RIGHT;.     
11060 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11070 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
11080 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
11090 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
110a0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e  f( strcmp(x,"non
110b0 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20  assoc")==0 ){.  
110c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
110d0 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
110e0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
110f0 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20  ssoc = NONE;.   
11100 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11110 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11120 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
11130 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  L;..}else if( st
11140 72 63 6d 70 28 78 2c 22 64 65 73 74 72 75 63 74  rcmp(x,"destruct
11150 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
11160 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11170 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11180 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3b  STRUCTOR_SYMBOL;
11190 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
111a0 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20  mp(x,"type")==0 
111b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
111c0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
111d0 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
111e0 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
111f0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11200 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30  x,"fallback")==0
11210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11220 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
11230 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11240 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11250 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b  FOR_FALLBACK_ID;
11260 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11270 66 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69 6c  f( strcmp(x,"wil
11280 64 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20  dcard")==0 ){.  
11290 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
112a0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
112b0 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20  _WILDCARD_ID;.  
112c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
112d0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
112e0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
112f0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11300 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b              "Unk
11310 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  nown declaration
11320 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73   keyword: \"%%%s
11330 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
11340 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11350 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
11360 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11370 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
11380 4f 52 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c  OR;..}.      }el
11390 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
113a0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
113b0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
113c0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
113d0 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72 61 74  Illegal declarat
113e0 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25  ion keyword: \"%
113f0 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
11400 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11410 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
11420 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
11430 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
11440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11450 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
11460 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
11470 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20  UCTOR_SYMBOL:.  
11480 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68 61      if( !isalpha
11490 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
114a0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
114b0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
114c0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
114d0 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d       "Symbol nam
114e0 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20  e missing after 
114f0 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77  %destructor keyw
11500 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ord");.        p
11510 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11520 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11530 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11540 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
11550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11560 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
11570 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65   *sp = Symbol_ne
11580 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  w(x);.        ps
11590 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
115a0 20 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72   &sp->destructor
115b0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
115c0 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 73 70 2d  ecllnslot = &sp-
115d0 3e 64 65 73 74 72 75 63 74 6f 72 6c 6e 3b 0a 20  >destructorln;. 
115e0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
115f0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11600 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20  DECL_ARG;.      
11610 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11620 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
11630 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d  FOR_DATATYPE_SYM
11640 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21  BOL:.      if( !
11650 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
11660 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
11670 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
11680 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
11690 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d  ,.          "Sym
116a0 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67  bol name missing
116b0 20 61 66 74 65 72 20 25 64 65 73 74 72 75 63 74   after %destruct
116c0 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20  or keyword");.  
116d0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
116e0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
116f0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11700 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
11710 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
11720 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
11730 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79   symbol *sp = Sy
11740 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
11750 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
11760 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74  gslot = &sp->dat
11770 61 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70  atype;.        p
11780 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d  sp->decllnslot =
11790 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
117a0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
117b0 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20  _FOR_DECL_ARG;. 
117c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
117d0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
117e0 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
117f0 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20  NCE_SYMBOL:.    
11800 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
11810 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
11820 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11830 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
11840 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11850 28 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20  ( isupper(x[0]) 
11860 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
11870 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
11880 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f        sp = Symbo
11890 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
118a0 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d    if( sp->prec>=
118b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
118c0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
118d0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
118e0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
118f0 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73      "Symbol \"%s
11900 5c 22 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  \" has already b
11910 65 20 67 69 76 65 6e 20 61 20 70 72 65 63 65 64  e given a preced
11920 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20  ence.",x);.     
11930 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11940 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20  nt++;..}else{.  
11950 20 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63          sp->prec
11960 20 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e   = psp->preccoun
11970 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ter;.          s
11980 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e  p->assoc = psp->
11990 64 65 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20  declassoc;..}.  
119a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
119b0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
119c0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
119d0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
119e0 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 73 73        "Can't ass
119f0 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ign a precedence
11a00 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b   to \"%s\".",x);
11a10 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11a20 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11a30 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11a40 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
11a50 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20  FOR_DECL_ARG:.  
11a60 20 20 20 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27      if( (x[0]=='
11a70 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27  {' || x[0]=='\"'
11a80 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d   || isalnum(x[0]
11a90 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  )) ){.        if
11aa0 28 20 2a 28 70 73 70 2d 3e 64 65 63 6c 61 72 67  ( *(psp->declarg
11ab0 73 6c 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  slot)!=0 ){.    
11ac0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11ad0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11ae0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11af0 20 20 20 20 20 20 20 20 20 20 20 22 54 68 65 20             "The 
11b00 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20  argument \"%s\" 
11b10 74 6f 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 5c  to declaration \
11b20 22 25 25 25 73 5c 22 20 69 73 20 6e 6f 74 20 74  "%%%s\" is not t
11b30 68 65 20 66 69 72 73 74 2e 22 2c 0a 20 20 20 20  he first.",.    
11b40 20 20 20 20 20 20 20 20 78 5b 30 5d 3d 3d 27 5c          x[0]=='\
11b50 22 27 20 3f 20 26 78 5b 31 5d 20 3a 20 78 2c 70  "' ? &x[1] : x,p
11b60 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 29  sp->declkeyword)
11b70 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11b80 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11b90 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11ba0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
11bb0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 65  _DECL_ERROR;..}e
11bc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a  lse{.          *
11bd0 28 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  (psp->declargslo
11be0 74 29 20 3d 20 28 78 5b 30 5d 3d 3d 27 5c 22 27  t) = (x[0]=='\"'
11bf0 20 7c 7c 20 78 5b 30 5d 3d 3d 27 7b 27 29 20 3f   || x[0]=='{') ?
11c00 20 26 78 5b 31 5d 20 3a 20 78 3b 0a 20 20 20 20   &x[1] : x;.    
11c10 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64        if( psp->d
11c20 65 63 6c 6c 6e 73 6c 6f 74 20 29 20 2a 70 73 70  ecllnslot ) *psp
11c30 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 70  ->decllnslot = p
11c40 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  sp->tokenlineno;
11c50 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11c60 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11c70 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
11c80 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ;..}.      }else
11c90 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11ca0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11cb0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11cc0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
11cd0 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 74  legal argument t
11ce0 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73 70 2d  o %%%s: %s",psp-
11cf0 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b  >declkeyword,x);
11d00 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11d10 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11d20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11d30 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
11d40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
11d50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11d60 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
11d70 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20  R_FALLBACK_ID:. 
11d80 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
11d90 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
11da0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11db0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
11dc0 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
11dd0 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78 5b   if( !isupper(x[
11de0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
11df0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
11e00 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
11e10 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
11e20 20 20 20 22 25 25 66 61 6c 6c 62 61 63 6b 20 61     "%%fallback a
11e30 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73  rgument \"%s\" s
11e40 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e  hould be a token
11e50 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
11e60 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11e70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11e80 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
11e90 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ol *sp = Symbol_
11ea0 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
11eb0 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  if( psp->fallbac
11ec0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
11ed0 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20    psp->fallback 
11ee0 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65  = sp;.        }e
11ef0 6c 73 65 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c  lse if( sp->fall
11f00 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
11f10 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11f20 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
11f30 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
11f40 20 20 20 20 20 20 20 20 22 4d 6f 72 65 20 74 68          "More th
11f50 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20  an one fallback 
11f60 61 73 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65  assigned to toke
11f70 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20  n %s", x);.     
11f80 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11f90 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
11fa0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
11fb0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73  p->fallback = ps
11fc0 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20  p->fallback;.   
11fd0 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e         psp->gp->
11fe0 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31  has_fallback = 1
11ff0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12000 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12010 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
12020 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49  G_FOR_WILDCARD_I
12030 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  D:.      if( x[0
12040 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
12050 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
12060 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
12070 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d  OR_RULE;.      }
12080 65 6c 73 65 20 69 66 28 20 21 69 73 75 70 70 65  else if( !isuppe
12090 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  r(x[0]) ){.     
120a0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
120b0 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e  >filename, psp->
120c0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
120d0 20 20 20 20 20 20 20 22 25 25 77 69 6c 64 63 61         "%%wildca
120e0 72 64 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73  rd argument \"%s
120f0 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74  \" should be a t
12100 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20  oken", x);.     
12110 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12120 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
12130 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12140 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
12150 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
12160 20 20 20 20 69 66 28 20 70 73 70 2d 3e 67 70 2d      if( psp->gp-
12170 3e 77 69 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a  >wildcard==0 ){.
12180 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67            psp->g
12190 70 2d 3e 77 69 6c 64 63 61 72 64 20 3d 20 73 70  p->wildcard = sp
121a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
121b0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
121c0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
121d0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
121e0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
121f0 20 22 45 78 74 72 61 20 77 69 6c 64 63 61 72 64   "Extra wildcard
12200 20 74 6f 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20   to token: %s", 
12210 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
12220 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
12230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12240 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12250 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
12260 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a  TER_RULE_ERROR:.
12270 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  /*      if( x[0]
12280 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61  =='.' ) psp->sta
12290 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
122a0 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a  _DECL_OR_RULE;.*
122b0 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f  *      break; */
122c0 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43  .    case RESYNC
122d0 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
122e0 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  R:.      if( x[0
122f0 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74  ]=='.' ) psp->st
12300 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12310 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
12320 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12330 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '%' ) psp->state
12340 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
12350 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20  ECL_KEYWORD;.   
12360 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a     break;.  }.}.
12370 0a 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 6f 70  ./* Run the prop
12380 72 6f 63 65 73 73 6f 72 20 6f 76 65 72 20 74 68  rocessor over th
12390 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74 65 78  e input file tex
123a0 74 2e 20 20 54 68 65 20 67 6c 6f 62 61 6c 20 76  t.  The global v
123b0 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 7a 44 65  ariables.** azDe
123c0 66 69 6e 65 5b 30 5d 20 74 68 72 6f 75 67 68 20  fine[0] through 
123d0 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65  azDefine[nDefine
123e0 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  -1] contains the
123f0 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 64 65   names of all de
12400 66 69 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f 73 2e  fined.** macros.
12410 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c    This routine l
12420 6f 6f 6b 73 20 66 6f 72 20 22 25 69 66 64 65 66  ooks for "%ifdef
12430 22 20 61 6e 64 20 22 25 69 66 6e 64 65 66 22 20  " and "%ifndef" 
12440 61 6e 64 20 22 25 65 6e 64 69 66 22 20 61 6e 64  and "%endif" and
12450 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 74 68 65  .** comments the
12460 6d 20 6f 75 74 2e 20 20 54 65 78 74 20 69 6e 20  m out.  Text in 
12470 62 65 74 77 65 65 6e 20 69 73 20 61 6c 73 6f 20  between is also 
12480 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20 61 73  commented out as
12490 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
124a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 65  .static void pre
124b0 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 63 68  process_input(ch
124c0 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c  ar *z){.  int i,
124d0 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20   j, k, n;.  int 
124e0 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 69  exclude = 0;.  i
124f0 6e 74 20 73 74 61 72 74 3b 0a 20 20 69 6e 74 20  nt start;.  int 
12500 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e  lineno = 1;.  in
12510 74 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 3b 0a  t start_lineno;.
12520 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
12530 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
12540 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  [i]=='\n' ) line
12550 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b  no++;.    if( z[
12560 69 5d 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30 20  i]!='%' || (i>0 
12570 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29  && z[i-1]!='\n')
12580 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
12590 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 5b   if( strncmp(&z[
125a0 69 5d 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d 3d  i],"%endif",6)==
125b0 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
125c0 2b 36 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66  +6]) ){.      if
125d0 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
125e0 20 20 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b 0a       exclude--;.
125f0 20 20 20 20 20 20 20 20 69 66 28 20 65 78 63 6c          if( excl
12600 75 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ude==0 ){.      
12610 20 20 20 20 66 6f 72 28 6a 3d 73 74 61 72 74 3b      for(j=start;
12620 20 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20 7a   j<i; j++) if( z
12630 5b 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d  [j]!='\n' ) z[j]
12640 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
12650 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
12660 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26  for(j=i; z[j] &&
12670 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b   z[j]!='\n'; j++
12680 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20  ) z[j] = ' ';.  
12690 20 20 7d 65 6c 73 65 20 69 66 28 20 28 73 74 72    }else if( (str
126a0 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 64  ncmp(&z[i],"%ifd
126b0 65 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73 73  ef",6)==0 && iss
126c0 70 61 63 65 28 7a 5b 69 2b 36 5d 29 29 0a 20 20  pace(z[i+6])).  
126d0 20 20 20 20 20 20 20 20 7c 7c 20 28 73 74 72 6e          || (strn
126e0 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e 64  cmp(&z[i],"%ifnd
126f0 65 66 22 2c 37 29 3d 3d 30 20 26 26 20 69 73 73  ef",7)==0 && iss
12700 70 61 63 65 28 7a 5b 69 2b 37 5d 29 29 20 29 7b  pace(z[i+7])) ){
12710 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75  .      if( exclu
12720 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78  de ){.        ex
12730 63 6c 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20 7d  clude++;.      }
12740 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
12750 72 28 6a 3d 69 2b 37 3b 20 69 73 73 70 61 63 65  r(j=i+7; isspace
12760 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20  (z[j]); j++){}. 
12770 20 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20         for(n=0; 
12780 7a 5b 6a 2b 6e 5d 20 26 26 20 21 69 73 73 70 61  z[j+n] && !isspa
12790 63 65 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29  ce(z[j+n]); n++)
127a0 7b 7d 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75  {}.        exclu
127b0 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
127c0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69  for(k=0; k<nDefi
127d0 6e 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  ne; k++){.      
127e0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
127f0 61 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a  azDefine[k],&z[j
12800 5d 2c 6e 29 3d 3d 30 20 26 26 20 73 74 72 6c 65  ],n)==0 && strle
12810 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d 3d  n(azDefine[k])==
12820 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
12830 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20   exclude = 0;.  
12840 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12850 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12870 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20 29  f( z[i+3]=='n' )
12880 20 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63 6c   exclude = !excl
12890 75 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ude;.        if(
128a0 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20   exclude ){.    
128b0 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 69 3b        start = i;
128c0 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74  .          start
128d0 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f  _lineno = lineno
128e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
128f0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
12900 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21  i; z[j] && z[j]!
12910 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d  ='\n'; j++) z[j]
12920 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20   = ' ';.    }.  
12930 7d 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65 20  }.  if( exclude 
12940 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
12950 74 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e 61  tderr,"untermina
12960 74 65 64 20 25 25 69 66 64 65 66 20 73 74 61 72  ted %%ifdef star
12970 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64 5c  ting on line %d\
12980 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f  n", start_lineno
12990 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
129a0 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69    }.}../* In spi
129b0 74 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c 20  te of its name, 
129c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
129d0 20 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e 65   really a scanne
129e0 72 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20 69  r.  It read.** i
129f0 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70  n the entire inp
12a00 75 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74 20  ut file (all at 
12a10 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65 6e  once) then token
12a20 69 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a 2a  izes it.  Each.*
12a30 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73 65  * token is passe
12a40 64 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  d to the functio
12a50 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e  n "parseonetoken
12a60 22 20 77 68 69 63 68 20 62 75 69 6c 64 73 20 61  " which builds a
12a70 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  ll.** the approp
12a80 72 69 61 74 65 20 64 61 74 61 20 73 74 72 75 63  riate data struc
12a90 74 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c 6f  tures in the glo
12aa0 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72  bal state vector
12ab0 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50   "gp"..*/.void P
12ac0 61 72 73 65 28 67 70 29 0a 73 74 72 75 63 74 20  arse(gp).struct 
12ad0 6c 65 6d 6f 6e 20 2a 67 70 3b 0a 7b 0a 20 20 73  lemon *gp;.{.  s
12ae0 74 72 75 63 74 20 70 73 74 61 74 65 20 70 73 3b  truct pstate ps;
12af0 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63  .  FILE *fp;.  c
12b00 68 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20  har *filebuf;.  
12b10 69 6e 74 20 66 69 6c 65 73 69 7a 65 3b 0a 20 20  int filesize;.  
12b20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e  int lineno;.  in
12b30 74 20 63 3b 0a 20 20 63 68 61 72 20 2a 63 70 2c  t c;.  char *cp,
12b40 20 2a 6e 65 78 74 63 70 3b 0a 20 20 69 6e 74 20   *nextcp;.  int 
12b50 73 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a  startline = 0;..
12b60 20 20 70 73 2e 67 70 20 3d 20 67 70 3b 0a 20 20    ps.gp = gp;.  
12b70 70 73 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 67 70  ps.filename = gp
12b80 2d 3e 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 73  ->filename;.  ps
12b90 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 20  .errorcnt = 0;. 
12ba0 20 70 73 2e 73 74 61 74 65 20 3d 20 49 4e 49 54   ps.state = INIT
12bb0 49 41 4c 49 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65  IALIZE;..  /* Be
12bc0 67 69 6e 20 62 79 20 72 65 61 64 69 6e 67 20 74  gin by reading t
12bd0 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
12be0 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 70 73  .  fp = fopen(ps
12bf0 2e 66 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29 3b  .filename,"rb");
12c00 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 7b 0a  .  if( fp==0 ){.
12c10 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
12c20 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27  filename,0,"Can'
12c30 74 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65  t open this file
12c40 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 22 29 3b   for reading.");
12c50 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e  .    gp->errorcn
12c60 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t++;.    return;
12c70 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 70 2c  .  }.  fseek(fp,
12c80 30 2c 32 29 3b 0a 20 20 66 69 6c 65 73 69 7a 65  0,2);.  filesize
12c90 20 3d 20 66 74 65 6c 6c 28 66 70 29 3b 0a 20 20   = ftell(fp);.  
12ca0 72 65 77 69 6e 64 28 66 70 29 3b 0a 20 20 66 69  rewind(fp);.  fi
12cb0 6c 65 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29  lebuf = (char *)
12cc0 6d 61 6c 6c 6f 63 28 20 66 69 6c 65 73 69 7a 65  malloc( filesize
12cd0 2b 31 20 29 3b 0a 20 20 69 66 28 20 66 69 6c 65  +1 );.  if( file
12ce0 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72  buf==0 ){.    Er
12cf0 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
12d00 6d 65 2c 30 2c 22 43 61 6e 27 74 20 61 6c 6c 6f  me,0,"Can't allo
12d10 63 61 74 65 20 25 64 20 6f 66 20 6d 65 6d 6f 72  cate %d of memor
12d20 79 20 74 6f 20 68 6f 6c 64 20 74 68 69 73 20 66  y to hold this f
12d30 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c  ile.",.      fil
12d40 65 73 69 7a 65 2b 31 29 3b 0a 20 20 20 20 67 70  esize+1);.    gp
12d50 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
12d60 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
12d70 69 66 28 20 66 72 65 61 64 28 66 69 6c 65 62 75  if( fread(filebu
12d80 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66 70 29  f,1,filesize,fp)
12d90 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a 20 20  !=filesize ){.  
12da0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
12db0 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20  lename,0,"Can't 
12dc0 72 65 61 64 20 69 6e 20 61 6c 6c 20 25 64 20 62  read in all %d b
12dd0 79 74 65 73 20 6f 66 20 74 68 69 73 20 66 69 6c  ytes of this fil
12de0 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c 65 73  e.",.      files
12df0 69 7a 65 29 3b 0a 20 20 20 20 66 72 65 65 28 66  ize);.    free(f
12e00 69 6c 65 62 75 66 29 3b 0a 20 20 20 20 67 70 2d  ilebuf);.    gp-
12e10 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12e20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
12e30 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66 69 6c  close(fp);.  fil
12e40 65 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d 20 3d  ebuf[filesize] =
12e50 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61   0;..  /* Make a
12e60 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73 20 74  n initial pass t
12e70 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 20  hrough the file 
12e80 74 6f 20 68 61 6e 64 6c 65 20 25 69 66 64 65 66  to handle %ifdef
12e90 20 61 6e 64 20 25 69 66 6e 64 65 66 20 2a 2f 0a   and %ifndef */.
12ea0 20 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e 70    preprocess_inp
12eb0 75 74 28 66 69 6c 65 62 75 66 29 3b 0a 0a 20 20  ut(filebuf);..  
12ec0 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68 65 20  /* Now scan the 
12ed0 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e 70 75  text of the inpu
12ee0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65  t file */.  line
12ef0 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 63 70  no = 1;.  for(cp
12f00 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20 2a 63  =filebuf; (c= *c
12f10 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20 69 66  p)!=0; ){.    if
12f20 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
12f30 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  no++;           
12f40 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61 63 6b     /* Keep track
12f50 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d   of the line num
12f60 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ber */.    if( i
12f70 73 73 70 61 63 65 28 63 29 20 29 7b 20 63 70 2b  sspace(c) ){ cp+
12f80 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 20 20  +; continue; }  
12f90 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68 69 74  /* Skip all whit
12fa0 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  e space */.    i
12fb0 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b  f( c=='/' && cp[
12fc0 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20 20 20  1]=='/' ){      
12fd0 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20      /* Skip C++ 
12fe0 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a  style comments *
12ff0 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20  /.      cp+=2;. 
13000 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
13010 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  *cp)!=0 && c!='\
13020 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20  n' ) cp++;.     
13030 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
13040 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20  .    if( c=='/' 
13050 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b  && cp[1]=='*' ){
13060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69            /* Ski
13070 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  p C style commen
13080 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d  ts */.      cp+=
13090 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
130a0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
130b0 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d  c!='/' || cp[-1]
130c0 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20  !='*') ){.      
130d0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
130e0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
130f0 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a    cp++;.      }.
13100 20 20 20 20 20 20 69 66 28 20 63 20 29 20 63 70        if( c ) cp
13110 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ++;.      contin
13120 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 73  ue;.    }.    ps
13130 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20 63 70  .tokenstart = cp
13140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13150 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62 65 67   /* Mark the beg
13160 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 6f  inning of the to
13170 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e 74 6f  ken */.    ps.to
13180 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65  kenlineno = line
13190 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
131a0 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e 20 77   Linenumber on w
131b0 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67 69 6e  hich token begin
131c0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d  s */.    if( c==
131d0 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20 20 20  '\"' ){         
131e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
131f0 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 20 2a  tring literals *
13200 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20  /.      cp++;.  
13210 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
13220 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 22  cp)!=0 && c!='\"
13230 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
13240 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
13250 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b  o++;.        cp+
13260 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
13270 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
13280 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
13290 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72 74 6c  .filename,startl
132a0 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73 74 61  ine,."String sta
132b0 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69  rting on this li
132c0 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e  ne is not termin
132d0 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  ated before the 
132e0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
132f0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65  ");.        ps.e
13300 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
13310 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
13320 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13330 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
13340 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
13350 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27  }else if( c=='{'
13360 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
13370 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f 66 20    /* A block of 
13380 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  C code */.      
13390 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20 20 20  int level;.     
133a0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72   cp++;.      for
133b0 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20 2a 63  (level=1; (c= *c
133c0 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65 6c 3e  p)!=0 && (level>
133d0 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20 63 70  1 || c!='}'); cp
133e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
133f0 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
13400 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73  o++;.        els
13410 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 20 6c  e if( c=='{' ) l
13420 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  evel++;.        
13430 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d 27 20  else if( c=='}' 
13440 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20  ) level--;.     
13450 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
13460 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27  /' && cp[1]=='*'
13470 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63 6f 6d   ){  /* Skip com
13480 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
13490 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a 20 20     int prevc;.  
134a0 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63 70          cp = &cp
134b0 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  [2];.          p
134c0 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
134d0 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
134e0 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f  cp)!=0 && (c!='/
134f0 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a 27 29  ' || prevc!='*')
13500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13510 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
13520 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
13530 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 20      prevc = c;. 
13540 20 20 20 20 20 20 20 20 20 20 20 63 70 2b 2b 3b             cp++;
13550 0a 09 20 20 7d 0a 09 7d 65 6c 73 65 20 69 66 28  ..  }..}else if(
13560 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
13570 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='/' ){  /* Ski
13580 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d  p C++ style comm
13590 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20  ents too */.    
135a0 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32        cp = &cp[2
135b0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ];.          whi
135c0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
135d0 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b  && c!='\n' ) cp+
135e0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  +;.          if(
135f0 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09   c ) lineno++;..
13600 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27  }else if( c=='\'
13610 27 20 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b 20  ' || c=='\"' ){ 
13620 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 61 20 63     /* String a c
13630 68 61 72 61 63 74 65 72 20 6c 69 74 65 72 61 6c  haracter literal
13640 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
13650 6e 74 20 73 74 61 72 74 63 68 61 72 2c 20 70 72  nt startchar, pr
13660 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  evc;.          s
13670 74 61 72 74 63 68 61 72 20 3d 20 63 3b 0a 20 20  tartchar = c;.  
13680 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
13690 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
136a0 28 63 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29 21  (cp++; (c= *cp)!
136b0 3d 30 20 26 26 20 28 63 21 3d 73 74 61 72 74 63  =0 && (c!=startc
136c0 68 61 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27 5c  har || prevc=='\
136d0 5c 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  \'); cp++){.    
136e0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
136f0 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
13700 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
13710 70 72 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70 72  prevc=='\\' ) pr
13720 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  evc = 0;.       
13730 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20       else       
13740 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63         prevc = c
13750 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20  ;..  }..}.      
13760 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
13770 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
13780 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65  rMsg(ps.filename
13790 2c 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  ,ps.tokenlineno,
137a0 0a 22 43 20 63 6f 64 65 20 73 74 61 72 74 69 6e  ."C code startin
137b0 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  g on this line i
137c0 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64  s not terminated
137d0 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20   before the end 
137e0 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a  of the file.");.
137f0 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72          ps.error
13800 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  cnt++;.        n
13810 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
13820 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13830 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a   nextcp = cp+1;.
13840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13850 65 20 69 66 28 20 69 73 61 6c 6e 75 6d 28 63 29  e if( isalnum(c)
13860 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
13870 49 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20  Identifiers */. 
13880 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
13890 2a 63 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c  *cp)!=0 && (isal
138a0 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27  num(c) || c=='_'
138b0 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20  ) ) cp++;.      
138c0 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
138d0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3a   }else if( c==':
138e0 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 3a 27 20  ' && cp[1]==':' 
138f0 26 26 20 63 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b  && cp[2]=='=' ){
13900 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72   /* The operator
13910 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20 20 20 20   "::=" */.      
13920 63 70 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 6e  cp += 3;.      n
13930 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
13940 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 2f  }else if( (c=='/
13950 27 20 7c 7c 20 63 3d 3d 27 7c 27 29 20 26 26 20  ' || c=='|') && 
13960 69 73 61 6c 70 68 61 28 63 70 5b 31 5d 29 20 29  isalpha(cp[1]) )
13970 7b 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 32 3b  {.      cp += 2;
13980 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
13990 20 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 69   = *cp)!=0 && (i
139a0 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d  salnum(c) || c==
139b0 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '_') ) cp++;.   
139c0 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
139d0 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20      }else{      
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72      /* All other
13a00 20 28 6f 6e 65 20 63 68 61 72 61 63 74 65 72 29   (one character)
13a10 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
13a20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
13a30 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
13a40 20 7d 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a   }.    c = *cp;.
13a50 20 20 20 20 2a 63 70 20 3d 20 30 3b 20 20 20 20      *cp = 0;    
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 20 20 2f 2a 20 4e 75 6c 6c 20 74 65 72 6d      /* Null term
13a80 69 6e 61 74 65 20 74 68 65 20 74 6f 6b 65 6e 20  inate the token 
13a90 2a 2f 0a 20 20 20 20 70 61 72 73 65 6f 6e 65 74  */.    parseonet
13aa0 6f 6b 65 6e 28 26 70 73 29 3b 20 20 20 20 20 20  oken(&ps);      
13ab0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
13ac0 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20  the token */.   
13ad0 20 2a 63 70 20 3d 20 63 3b 20 20 20 20 20 20 20   *cp = c;       
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13af0 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   /* Restore the 
13b00 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 63 70  buffer */.    cp
13b10 20 3d 20 6e 65 78 74 63 70 3b 0a 20 20 7d 0a 20   = nextcp;.  }. 
13b20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 20   free(filebuf); 
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
13b50 65 20 62 75 66 66 65 72 20 61 66 74 65 72 20 70  e buffer after p
13b60 61 72 73 69 6e 67 20 2a 2f 0a 20 20 67 70 2d 3e  arsing */.  gp->
13b70 72 75 6c 65 20 3d 20 70 73 2e 66 69 72 73 74 72  rule = ps.firstr
13b80 75 6c 65 3b 0a 20 20 67 70 2d 3e 65 72 72 6f 72  ule;.  gp->error
13b90 63 6e 74 20 3d 20 70 73 2e 65 72 72 6f 72 63 6e  cnt = ps.errorcn
13ba0 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t;.}./**********
13bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13bc0 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
13bd0 22 70 6c 69 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a  "plink.c" ******
13be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
13bf0 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
13c00 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 66 69  processing confi
13c10 67 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 2d  guration follow-
13c20 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  set propagation 
13c30 6c 69 6e 6b 73 0a 2a 2a 20 69 6e 20 74 68 65 20  links.** in the 
13c40 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
13c50 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  erator..*/.stati
13c60 63 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  c struct plink *
13c70 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
13c80 20 30 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65   0;../* Allocate
13c90 20 61 20 6e 65 77 20 70 6c 69 6e 6b 20 2a 2f 0a   a new plink */.
13ca0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c  struct plink *Pl
13cb0 69 6e 6b 5f 6e 65 77 28 29 7b 0a 20 20 73 74 72  ink_new(){.  str
13cc0 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a  uct plink *new;.
13cd0 0a 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65  .  if( plink_fre
13ce0 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
13cf0 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
13d00 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c  mt = 100;.    pl
13d10 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28  ink_freelist = (
13d20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 6d  struct plink *)m
13d30 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
13d40 72 75 63 74 20 70 6c 69 6e 6b 29 2a 61 6d 74 20  ruct plink)*amt 
13d50 29 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b  );.    if( plink
13d60 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a  _freelist==0 ){.
13d70 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
13d80 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61  derr,.      "Una
13d90 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
13da0 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77  memory for a new
13db0 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70   follow-set prop
13dc0 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22  agation link.\n"
13dd0 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29  );.      exit(1)
13de0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
13df0 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b  i=0; i<amt-1; i+
13e00 2b 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  +) plink_freelis
13e10 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69  t[i].next = &pli
13e20 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d  nk_freelist[i+1]
13e30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65  ;.    plink_free
13e40 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74  list[amt-1].next
13e50 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20   = 0;.  }.  new 
13e60 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  = plink_freelist
13e70 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  ;.  plink_freeli
13e80 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  st = plink_freel
13e90 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74  ist->next;.  ret
13ea0 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 41  urn new;.}../* A
13eb0 64 64 20 61 20 70 6c 69 6e 6b 20 74 6f 20 61 20  dd a plink to a 
13ec0 70 6c 69 6e 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f  plink list */.vo
13ed0 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 70 6c 70  id Plink_add(plp
13ee0 70 2c 63 66 70 29 0a 73 74 72 75 63 74 20 70 6c  p,cfp).struct pl
13ef0 69 6e 6b 20 2a 2a 70 6c 70 70 3b 0a 73 74 72 75  ink **plpp;.stru
13f00 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
13f10 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
13f20 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d 20 50   *new;.  new = P
13f30 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e 65  link_new();.  ne
13f40 77 2d 3e 6e 65 78 74 20 3d 20 2a 70 6c 70 70 3b  w->next = *plpp;
13f50 0a 20 20 2a 70 6c 70 70 20 3d 20 6e 65 77 3b 0a  .  *plpp = new;.
13f60 20 20 6e 65 77 2d 3e 63 66 70 20 3d 20 63 66 70    new->cfp = cfp
13f70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72  ;.}../* Transfer
13f80 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20   every plink on 
13f90 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22 20  the list "from" 
13fa0 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f 22  to the list "to"
13fb0 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63   */.void Plink_c
13fc0 6f 70 79 28 74 6f 2c 66 72 6f 6d 29 0a 73 74 72  opy(to,from).str
13fd0 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 74 6f 3b 0a  uct plink **to;.
13fe0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 72  struct plink *fr
13ff0 6f 6d 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70  om;.{.  struct p
14000 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20 20  link *nextpl;.  
14010 77 68 69 6c 65 28 20 66 72 6f 6d 20 29 7b 0a 20  while( from ){. 
14020 20 20 20 6e 65 78 74 70 6c 20 3d 20 66 72 6f 6d     nextpl = from
14030 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 66 72 6f 6d  ->next;.    from
14040 2d 3e 6e 65 78 74 20 3d 20 2a 74 6f 3b 0a 20 20  ->next = *to;.  
14050 20 20 2a 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20    *to = from;.  
14060 20 20 66 72 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b    from = nextpl;
14070 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74  .  }.}../* Delet
14080 65 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e  e every plink on
14090 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 76 6f 69   the list */.voi
140a0 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 70  d Plink_delete(p
140b0 6c 70 29 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b  lp).struct plink
140c0 20 2a 70 6c 70 3b 0a 7b 0a 20 20 73 74 72 75 63   *plp;.{.  struc
140d0 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b  t plink *nextpl;
140e0 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29  ..  while( plp )
140f0 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 70  {.    nextpl = p
14100 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 70 6c  lp->next;.    pl
14110 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e 6b 5f  p->next = plink_
14120 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 6c  freelist;.    pl
14130 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70  ink_freelist = p
14140 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20 6e 65  lp;.    plp = ne
14150 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a  xtpl;.  }.}./***
14160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14170 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
14180 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20 2a 2a  le "report.c" **
14190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141a0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
141b0 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72 20 67  Procedures for g
141c0 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f 72 74  enerating report
141d0 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69 6e 20  s and tables in 
141e0 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
141f0 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
14200 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 66 69  /* Generate a fi
14210 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20  lename with the 
14220 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20 20 53  given suffix.  S
14230 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
14240 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73 20 66  .** name comes f
14250 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  rom malloc() and
14260 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
14270 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  y the calling.**
14280 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52   function..*/.PR
14290 49 56 41 54 45 20 63 68 61 72 20 2a 66 69 6c 65  IVATE char *file
142a0 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 73  _makename(lemp,s
142b0 75 66 66 69 78 29 0a 73 74 72 75 63 74 20 6c 65  uffix).struct le
142c0 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20  mon *lemp;.char 
142d0 2a 73 75 66 66 69 78 3b 0a 7b 0a 20 20 63 68 61  *suffix;.{.  cha
142e0 72 20 2a 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20  r *name;.  char 
142f0 2a 63 70 3b 0a 0a 20 20 6e 61 6d 65 20 3d 20 6d  *cp;..  name = m
14300 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 6c 65  alloc( strlen(le
14310 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20  mp->filename) + 
14320 73 74 72 6c 65 6e 28 73 75 66 66 69 78 29 20 2b  strlen(suffix) +
14330 20 35 20 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65   5 );.  if( name
14340 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
14350 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
14360 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
14370 66 6f 72 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c  for a filename.\
14380 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
14390 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 6e  ;.  }.  strcpy(n
143a0 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  ame,lemp->filena
143b0 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72  me);.  cp = strr
143c0 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20  chr(name,'.');. 
143d0 20 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20   if( cp ) *cp = 
143e0 30 3b 0a 20 20 73 74 72 63 61 74 28 6e 61 6d 65  0;.  strcat(name
143f0 2c 73 75 66 66 69 78 29 3b 0a 20 20 72 65 74 75  ,suffix);.  retu
14400 72 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f  rn name;.}../* O
14410 70 65 6e 20 61 20 66 69 6c 65 20 77 69 74 68 20  pen a file with 
14420 61 20 6e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20  a name based on 
14430 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
14440 69 6e 70 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62  input file,.** b
14450 75 74 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ut with a differ
14460 65 6e 74 20 28 73 70 65 63 69 66 69 65 64 29 20  ent (specified) 
14470 73 75 66 66 69 78 2c 20 61 6e 64 20 72 65 74 75  suffix, and retu
14480 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
14490 74 6f 20 74 68 65 20 73 74 72 65 61 6d 20 2a 2f  to the stream */
144a0 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 66  .PRIVATE FILE *f
144b0 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 73 75  ile_open(lemp,su
144c0 66 66 69 78 2c 6d 6f 64 65 29 0a 73 74 72 75 63  ffix,mode).struc
144d0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63  t lemon *lemp;.c
144e0 68 61 72 20 2a 73 75 66 66 69 78 3b 0a 63 68 61  har *suffix;.cha
144f0 72 20 2a 6d 6f 64 65 3b 0a 7b 0a 20 20 46 49 4c  r *mode;.{.  FIL
14500 45 20 2a 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65  E *fp;..  if( le
14510 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72  mp->outname ) fr
14520 65 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  ee(lemp->outname
14530 29 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61  );.  lemp->outna
14540 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61  me = file_makena
14550 6d 65 28 6c 65 6d 70 2c 20 73 75 66 66 69 78 29  me(lemp, suffix)
14560 3b 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c  ;.  fp = fopen(l
14570 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64  emp->outname,mod
14580 65 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20  e);.  if( fp==0 
14590 26 26 20 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b  && *mode=='w' ){
145a0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
145b0 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  err,"Can't open 
145c0 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
145d0 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a  lemp->outname);.
145e0 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
145f0 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
14600 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
14610 20 66 70 3b 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69   fp;.}../* Dupli
14620 63 61 74 65 20 74 68 65 20 69 6e 70 75 74 20 66  cate the input f
14630 69 6c 65 20 77 69 74 68 6f 75 74 20 63 6f 6d 6d  ile without comm
14640 65 6e 74 73 20 61 6e 64 20 77 69 74 68 6f 75 74  ents and without
14650 20 61 63 74 69 6f 6e 73 20 0a 2a 2a 20 6f 6e 20   actions .** on 
14660 72 75 6c 65 73 20 2a 2f 0a 76 6f 69 64 20 52 65  rules */.void Re
14670 70 72 69 6e 74 28 6c 65 6d 70 29 0a 73 74 72 75  print(lemp).stru
14680 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
14690 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
146a0 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79  *rp;.  struct sy
146b0 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20  mbol *sp;.  int 
146c0 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65  i, j, maxlen, le
146d0 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69  n, ncolumns, ski
146e0 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f 20  p;.  printf("// 
146f0 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75 74  Reprint of input
14700 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f   file \"%s\".\n/
14710 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65  / Symbols:\n",le
14720 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
14730 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20   maxlen = 10;.  
14740 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
14750 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
14760 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73      sp = lemp->s
14770 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c  ymbols[i];.    l
14780 65 6e 20 3d 20 73 74 72 6c 65 6e 28 73 70 2d 3e  en = strlen(sp->
14790 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6c  name);.    if( l
147a0 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c  en>maxlen ) maxl
147b0 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20  en = len;.  }.  
147c0 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37 36 2f 28 6d  ncolumns = 76/(m
147d0 61 78 6c 65 6e 2b 35 29 3b 0a 20 20 69 66 28 20  axlen+5);.  if( 
147e0 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29 20 6e 63 6f  ncolumns<1 ) nco
147f0 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 73 6b 69  lumns = 1;.  ski
14800 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62  p = (lemp->nsymb
14810 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e 73 20 2d 20  ol + ncolumns - 
14820 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b 0a 20 20 66  1)/ncolumns;.  f
14830 6f 72 28 69 3d 30 3b 20 69 3c 73 6b 69 70 3b 20  or(i=0; i<skip; 
14840 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  i++){.    printf
14850 28 22 2f 2f 22 29 3b 0a 20 20 20 20 66 6f 72 28  ("//");.    for(
14860 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79  j=i; j<lemp->nsy
14870 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69 70 29 7b 0a  mbol; j+=skip){.
14880 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d        sp = lemp-
14890 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20  >symbols[j];.   
148a0 20 20 20 61 73 73 65 72 74 28 20 73 70 2d 3e 69     assert( sp->i
148b0 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20 20 20 20 20  ndex==j );.     
148c0 20 70 72 69 6e 74 66 28 22 20 25 33 64 20 25 2d   printf(" %3d %-
148d0 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d  *.*s",j,maxlen,m
148e0 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61 6d 65 29 3b  axlen,sp->name);
148f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
14900 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66  f("\n");.  }.  f
14910 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
14920 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
14930 74 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  t){.    printf("
14940 25 73 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  %s",rp->lhs->nam
14950 65 29 3b 0a 20 20 20 20 2f 2a 20 20 20 20 69 66  e);.    /*    if
14960 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 29  ( rp->lhsalias )
14970 20 70 72 69 6e 74 66 28 22 28 25 73 29 22 2c 72   printf("(%s)",r
14980 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 20 2a 2f  p->lhsalias); */
14990 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 3a 3a  .    printf(" ::
149a0 3d 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  =");.    for(i=0
149b0 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
149c0 2b 29 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 72  +){.      sp = r
149d0 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
149e0 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c 20 73   printf(" %s", s
149f0 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
14a00 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
14a10 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
14a20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20         for(j=1; 
14a30 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a  j<sp->nsubsym; j
14a40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ++){.          p
14a50 72 69 6e 74 66 28 22 7c 25 73 22 2c 20 73 70 2d  rintf("|%s", sp-
14a60 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65  >subsym[j]->name
14a70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14a80 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 69 66     }.      /* if
14a90 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ( rp->rhsalias[i
14aa0 5d 20 29 20 70 72 69 6e 74 66 28 22 28 25 73 29  ] ) printf("(%s)
14ab0 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ",rp->rhsalias[i
14ac0 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ]); */.    }.   
14ad0 20 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a 20 20   printf(".");.  
14ae0 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79    if( rp->precsy
14af0 6d 20 29 20 70 72 69 6e 74 66 28 22 20 5b 25 73  m ) printf(" [%s
14b00 5d 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e  ]",rp->precsym->
14b10 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 69 66  name);.    /* if
14b20 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 70 72 69  ( rp->code ) pri
14b30 6e 74 66 28 22 5c 6e 20 20 20 20 25 73 22 2c 72  ntf("\n    %s",r
14b40 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20 20 20  p->code); */.   
14b50 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
14b60 20 7d 0a 7d 0a 0a 76 6f 69 64 20 43 6f 6e 66 69   }.}..void Confi
14b70 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29 0a 46  gPrint(fp,cfp).F
14b80 49 4c 45 20 2a 66 70 3b 0a 73 74 72 75 63 74 20  ILE *fp;.struct 
14b90 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20  config *cfp;.{. 
14ba0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
14bb0 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
14bc0 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20  l *sp;.  int i, 
14bd0 6a 3b 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e 72  j;.  rp = cfp->r
14be0 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c  p;.  fprintf(fp,
14bf0 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73  "%s ::=",rp->lhs
14c00 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  ->name);.  for(i
14c10 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b  =0; i<=rp->nrhs;
14c20 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
14c30 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 20 66 70 72  ==cfp->dot ) fpr
14c40 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20  intf(fp," *");. 
14c50 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
14c60 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  hs ) break;.    
14c70 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
14c80 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
14c90 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29  " %s", sp->name)
14ca0 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
14cb0 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
14cc0 4c 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  L ){.      for(j
14cd0 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; j<sp->nsubsy
14ce0 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
14cf0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 7c 25 73   fprintf(fp,"|%s
14d00 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  ",sp->subsym[j]-
14d10 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
14d20 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
14d30 23 64 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a  #define TEST */.
14d40 23 69 66 20 30 0a 2f 2a 20 50 72 69 6e 74 20 61  #if 0./* Print a
14d50 20 73 65 74 20 2a 2f 0a 50 52 49 56 41 54 45 20   set */.PRIVATE 
14d60 76 6f 69 64 20 53 65 74 50 72 69 6e 74 28 6f 75  void SetPrint(ou
14d70 74 2c 73 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45  t,set,lemp).FILE
14d80 20 2a 6f 75 74 3b 0a 63 68 61 72 20 2a 73 65 74   *out;.char *set
14d90 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ;.struct lemon *
14da0 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp;.{.  int i;
14db0 0a 20 20 63 68 61 72 20 2a 73 70 61 63 65 72 3b  .  char *spacer;
14dc0 0a 20 20 73 70 61 63 65 72 20 3d 20 22 22 3b 0a  .  spacer = "";.
14dd0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
14de0 31 32 73 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72  12s[","");.  for
14df0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=0; i<lemp->nt
14e00 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20  erminal; i++){. 
14e10 20 20 20 69 66 28 20 53 65 74 46 69 6e 64 28 73     if( SetFind(s
14e20 65 74 2c 69 29 20 29 7b 0a 20 20 20 20 20 20 66  et,i) ){.      f
14e30 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 25 73  printf(out,"%s%s
14e40 22 2c 73 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73  ",spacer,lemp->s
14e50 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29  ymbols[i]->name)
14e60 3b 0a 20 20 20 20 20 20 73 70 61 63 65 72 20 3d  ;.      spacer =
14e70 20 22 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   " ";.    }.  }.
14e80 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d    fprintf(out,"]
14e90 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  \n");.}../* Prin
14ea0 74 20 61 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20  t a plink chain 
14eb0 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
14ec0 50 6c 69 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70  PlinkPrint(out,p
14ed0 6c 70 2c 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75  lp,tag).FILE *ou
14ee0 74 3b 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  t;.struct plink 
14ef0 2a 70 6c 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b  *plp;.char *tag;
14f00 0a 7b 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20  .{.  while( plp 
14f10 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
14f20 75 74 2c 22 25 31 32 73 25 73 20 28 73 74 61 74  ut,"%12s%s (stat
14f30 65 20 25 32 64 29 20 22 2c 22 22 2c 74 61 67 2c  e %2d) ","",tag,
14f40 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 73  plp->cfp->stp->s
14f50 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 43 6f  tatenum);.    Co
14f60 6e 66 69 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c  nfigPrint(out,pl
14f70 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66 70 72  p->cfp);.    fpr
14f80 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a  intf(out,"\n");.
14f90 20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e      plp = plp->n
14fa0 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ext;.  }.}.#endi
14fb0 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61  f../* Print an a
14fc0 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67 69 76  ction to the giv
14fd0 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
14fe0 6f 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  or.  Return FALS
14ff0 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20  E if.** nothing 
15000 77 61 73 20 61 63 74 75 61 6c 6c 79 20 70 72 69  was actually pri
15010 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69  nted..*/.int Pri
15020 6e 74 41 63 74 69 6f 6e 28 73 74 72 75 63 74 20  ntAction(struct 
15030 61 63 74 69 6f 6e 20 2a 61 70 2c 20 46 49 4c 45  action *ap, FILE
15040 20 2a 66 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74   *fp, int indent
15050 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20  ){.  int result 
15060 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28 20 61  = 1;.  switch( a
15070 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63  p->type ){.    c
15080 61 73 65 20 53 48 49 46 54 3a 0a 20 20 20 20 20  ase SHIFT:.     
15090 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
150a0 20 73 68 69 66 74 20 20 25 64 22 2c 69 6e 64 65   shift  %d",inde
150b0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
150c0 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
150d0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  num);.      brea
150e0 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55  k;.    case REDU
150f0 43 45 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  CE:.      fprint
15100 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65  f(fp,"%*s reduce
15110 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e   %d",indent,ap->
15120 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72  sp->name,ap->x.r
15130 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
15140 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15150 20 41 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66   ACCEPT:.      f
15160 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61  printf(fp,"%*s a
15170 63 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70  ccept",indent,ap
15180 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ->sp->name);.   
15190 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
151a0 73 65 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20  se ERROR:.      
151b0 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
151c0 65 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70  error",indent,ap
151d0 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ->sp->name);.   
151e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
151f0 73 65 20 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20  se CONFLICT:.   
15200 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
15210 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64 20 2a  *s reduce %-3d *
15220 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69  * Parsing confli
15230 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20  ct **",.        
15240 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
15250 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e  ame,ap->x.rp->in
15260 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dex);.      brea
15270 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52  k;.    case SH_R
15280 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73  ESOLVED:.    cas
15290 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20  e RD_RESOLVED:. 
152a0 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44     case NOT_USED
152b0 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d  :.      result =
152c0 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
152d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
152e0 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  sult;.}../* Gene
152f0 72 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70  rate the "y.outp
15300 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a  ut" log file */.
15310 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75  void ReportOutpu
15320 74 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  t(lemp).struct l
15330 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
15340 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
15350 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
15360 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
15370 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
15380 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66  n *ap;.  FILE *f
15390 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f  p;..  fp = file_
153a0 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22  open(lemp,".out"
153b0 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"wb");.  if( fp
153c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
153d0 66 70 72 69 6e 74 66 28 66 70 2c 22 20 5c 62 22  fprintf(fp," \b"
153e0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
153f0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
15400 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
15410 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
15420 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 53     fprintf(fp,"S
15430 74 61 74 65 20 25 64 3a 5c 6e 22 2c 73 74 70 2d  tate %d:\n",stp-
15440 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20  >statenum);.    
15450 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66  if( lemp->basisf
15460 6c 61 67 20 29 20 63 66 70 3d 73 74 70 2d 3e 62  lag ) cfp=stp->b
15470 70 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  p;.    else     
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70               cfp
15490 3d 73 74 70 2d 3e 63 66 70 3b 0a 20 20 20 20 77  =stp->cfp;.    w
154a0 68 69 6c 65 28 20 63 66 70 20 29 7b 0a 20 20 20  hile( cfp ){.   
154b0 20 20 20 63 68 61 72 20 62 75 66 5b 32 30 5d 3b     char buf[20];
154c0 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e  .      if( cfp->
154d0 64 6f 74 3d 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72  dot==cfp->rp->nr
154e0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70  hs ){.        sp
154f0 72 69 6e 74 66 28 62 75 66 2c 22 28 25 64 29 22  rintf(buf,"(%d)"
15500 2c 63 66 70 2d 3e 72 70 2d 3e 69 6e 64 65 78 29  ,cfp->rp->index)
15510 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
15520 66 28 66 70 2c 22 20 20 20 20 25 35 73 20 22 2c  f(fp,"    %5s ",
15530 62 75 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  buf);.      }els
15540 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  e{.        fprin
15550 74 66 28 66 70 2c 22 20 20 20 20 20 20 20 20 20  tf(fp,"         
15560 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ");.      }.   
15570 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66     ConfigPrint(f
15580 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 66 70  p,cfp);.      fp
15590 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
155a0 23 69 66 20 30 0a 20 20 20 20 20 20 53 65 74 50  #if 0.      SetP
155b0 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 77 73  rint(fp,cfp->fws
155c0 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20 50 6c  ,lemp);.      Pl
155d0 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  inkPrint(fp,cfp-
155e0 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b 0a 20  >fplp,"To  ");. 
155f0 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28       PlinkPrint(
15600 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22 46 72  fp,cfp->bplp,"Fr
15610 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  om");.#endif.   
15620 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73     if( lemp->bas
15630 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63 66 70  isflag ) cfp=cfp
15640 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c 73 65  ->bp;.      else
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 3b    cfp=cfp->next;
15670 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
15680 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20  tf(fp,"\n");.   
15690 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
156a0 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
156b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 72 69  ){.      if( Pri
156c0 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70 2c 33  ntAction(ap,fp,3
156d0 30 29 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c  0) ) fprintf(fp,
156e0 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  "\n");.    }.   
156f0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
15700 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
15710 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fp);.  return;.}
15720 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20  ../* Search for 
15730 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20  the file "name" 
15740 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20  which is in the 
15750 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
15760 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61  s.** the exacuta
15770 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63  ble */.PRIVATE c
15780 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28  har *pathsearch(
15790 61 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d  argv0,name,modem
157a0 61 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76 30  ask).char *argv0
157b0 3b 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e  ;.char *name;.in
157c0 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20  t modemask;.{.  
157d0 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a  char *pathlist;.
157e0 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70    char *path,*cp
157f0 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 65 78  ;.  char c;.  ex
15800 74 65 72 6e 20 69 6e 74 20 61 63 63 65 73 73 28  tern int access(
15810 29 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e  );..#ifdef __WIN
15820 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72  32__.  cp = strr
15830 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b  chr(argv0,'\\');
15840 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74  .#else.  cp = st
15850 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29  rrchr(argv0,'/')
15860 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63  ;.#endif.  if( c
15870 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70  p ){.    c = *cp
15880 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20  ;.    *cp = 0;. 
15890 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20     path = (char 
158a0 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e  *)malloc( strlen
158b0 28 61 72 67 76 30 29 20 2b 20 73 74 72 6c 65 6e  (argv0) + strlen
158c0 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20 20  (name) + 2 );.  
158d0 20 20 69 66 28 20 70 61 74 68 20 29 20 73 70 72    if( path ) spr
158e0 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73  intf(path,"%s/%s
158f0 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20  ",argv0,name);. 
15900 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65     *cp = c;.  }e
15910 6c 73 65 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  lse{.    extern 
15920 63 68 61 72 20 2a 67 65 74 65 6e 76 28 29 3b 0a  char *getenv();.
15930 20 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20 67      pathlist = g
15940 65 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a 20  etenv("PATH");. 
15950 20 20 20 69 66 28 20 70 61 74 68 6c 69 73 74 3d     if( pathlist=
15960 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20  =0 ) pathlist = 
15970 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e  ".:/bin:/usr/bin
15980 22 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63  ";.    path = (c
15990 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 74  har *)malloc( st
159a0 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b 73  rlen(pathlist)+s
159b0 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b  trlen(name)+2 );
159c0 0a 20 20 20 20 69 66 28 20 70 61 74 68 21 3d 30  .    if( path!=0
159d0 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
159e0 20 2a 70 61 74 68 6c 69 73 74 20 29 7b 0a 20 20   *pathlist ){.  
159f0 20 20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68        cp = strch
15a00 72 28 70 61 74 68 6c 69 73 74 2c 27 3a 27 29 3b  r(pathlist,':');
15a10 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 70 3d  .        if( cp=
15a20 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74 68 6c  =0 ) cp = &pathl
15a30 69 73 74 5b 73 74 72 6c 65 6e 28 70 61 74 68 6c  ist[strlen(pathl
15a40 69 73 74 29 5d 3b 0a 20 20 20 20 20 20 20 20 63  ist)];.        c
15a50 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20   = *cp;.        
15a60 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *cp = 0;.       
15a70 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25   sprintf(path,"%
15a80 73 2f 25 73 22 2c 70 61 74 68 6c 69 73 74 2c 6e  s/%s",pathlist,n
15a90 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63  ame);.        *c
15aa0 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69  p = c;.        i
15ab0 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68 6c 69  f( c==0 ) pathli
15ac0 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  st = "";.       
15ad0 20 65 6c 73 65 20 70 61 74 68 6c 69 73 74 20 3d   else pathlist =
15ae0 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20   &cp[1];.       
15af0 20 69 66 28 20 61 63 63 65 73 73 28 70 61 74 68   if( access(path
15b00 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20  ,modemask)==0 ) 
15b10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
15b20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
15b30 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69  n path;.}../* Gi
15b40 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63  ven an action, c
15b50 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65 67  ompute the integ
15b60 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61  er value for tha
15b70 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63  t action.** whic
15b80 68 20 69 73 20 74 6f 20 62 65 20 70 75 74 20 69  h is to be put i
15b90 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  n the action tab
15ba0 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  le of the genera
15bb0 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ted machine..** 
15bc0 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20  Return negative 
15bd0 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f  if no action sho
15be0 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64  uld be generated
15bf0 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  ..*/.PRIVATE int
15c00 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
15c10 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75 63 74 20  lemp,ap).struct 
15c20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72  lemon *lemp;.str
15c30 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
15c40 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20 73  {.  int act;.  s
15c50 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20  witch( ap->type 
15c60 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46  ){.    case SHIF
15c70 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e  T:  act = ap->x.
15c80 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20  stp->statenum;  
15c90 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15ca0 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45  .    case REDUCE
15cb0 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70  : act = ap->x.rp
15cc0 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d 3e  ->index + lemp->
15cd0 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a 20  nstate; break;. 
15ce0 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20 20     case ERROR:  
15cf0 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
15d00 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
15d10 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
15d20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20 61 63   case ACCEPT: ac
15d30 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  t = lemp->nstate
15d40 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b   + lemp->nrule +
15d50 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64   1; break;.    d
15d60 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20  efault:     act 
15d70 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d  = -1; break;.  }
15d80 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d  .  return act;.}
15d90 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49  ..#define LINESI
15da0 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e  ZE 1000./* The n
15db0 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72  ext cluster of r
15dc0 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20  outines are for 
15dd0 72 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70  reading the temp
15de0 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  late file.** and
15df0 20 77 72 69 74 69 6e 67 20 74 68 65 20 72 65 73   writing the res
15e00 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65  ults to the gene
15e10 72 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a  rated parser */.
15e20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 75 6e  /* The first fun
15e30 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20  ction transfers 
15e40 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74  data from "in" t
15e50 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a  o "out" until.**
15e60 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20   a line is seen 
15e70 77 68 69 63 68 20 62 65 67 69 6e 73 20 77 69 74  which begins wit
15e80 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e  h "%%".  The lin
15e90 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74  e number is.** t
15ea0 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  racked..**.** if
15eb0 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61   name!=0, then a
15ec0 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62 65 67  ny word that beg
15ed0 69 6e 20 77 69 74 68 20 22 50 61 72 73 65 22 20  in with "Parse" 
15ee0 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a  is changed to.**
15ef0 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d   begin with *nam
15f00 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52  e instead..*/.PR
15f10 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f  IVATE void tplt_
15f20 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f 75 74  xfer(name,in,out
15f30 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20 2a 6e  ,lineno).char *n
15f40 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b 0a 46  ame;.FILE *in;.F
15f50 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 2a 6c  ILE *out;.int *l
15f60 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74 20 69  ineno;.{.  int i
15f70 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61 72  , iStart;.  char
15f80 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b   line[LINESIZE];
15f90 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28  .  while( fgets(
15fa0 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e  line,LINESIZE,in
15fb0 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d 27  ) && (line[0]!='
15fc0 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27  %' || line[1]!='
15fd0 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69 6e  %') ){.    (*lin
15fe0 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74 61  eno)++;.    iSta
15ff0 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  rt = 0;.    if( 
16000 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66 6f  name ){.      fo
16010 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20  r(i=0; line[i]; 
16020 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
16030 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20 26  ( line[i]=='P' &
16040 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65 5b  & strncmp(&line[
16050 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d 30  i],"Parse",5)==0
16060 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69  .          && (i
16070 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61 28  ==0 || !isalpha(
16080 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20 20  line[i-1])).    
16090 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
160a0 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29 20   if( i>iStart ) 
160b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a  fprintf(out,"%.*
160c0 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69 6e  s",i-iStart,&lin
160d0 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20 20  e[iStart]);.    
160e0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
160f0 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20 20  t,"%s",name);.  
16100 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
16110 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74            iStart
16120 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20   = i+1;.        
16130 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
16140 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
16150 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61 72  "%s",&line[iStar
16160 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54  t]);.  }.}../* T
16170 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f 6e  he next function
16180 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70 6c   finds the templ
16190 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  ate file and ope
161a0 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e 67  ns it, returning
161b0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
161c0 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
161d0 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c  . */.PRIVATE FIL
161e0 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d  E *tplt_open(lem
161f0 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
16200 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61 74 69  *lemp;.{.  stati
16210 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65 6e  c char templaten
16220 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e  ame[] = "lempar.
16230 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31  c";.  char buf[1
16240 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e  000];.  FILE *in
16250 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e 61  ;.  char *tpltna
16260 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  me;.  char *cp;.
16270 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
16280 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27  lemp->filename,'
16290 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 7b  .');.  if( cp ){
162a0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66  .    sprintf(buf
162b0 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74 29  ,"%.*s.lt",(int)
162c0 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  (cp-lemp->filena
162d0 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  me),lemp->filena
162e0 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me);.  }else{.  
162f0 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25    sprintf(buf,"%
16300 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65  s.lt",lemp->file
16310 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  name);.  }.  if(
16320 20 61 63 63 65 73 73 28 62 75 66 2c 30 30 34 29   access(buf,004)
16330 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e  ==0 ){.    tpltn
16340 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65 6c  ame = buf;.  }el
16350 73 65 20 69 66 28 20 61 63 63 65 73 73 28 74 65  se if( access(te
16360 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d  mplatename,004)=
16370 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61  =0 ){.    tpltna
16380 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61 6d  me = templatenam
16390 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
163a0 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68 73  tpltname = paths
163b0 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67 76  earch(lemp->argv
163c0 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30  0,templatename,0
163d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 70 6c  );.  }.  if( tpl
163e0 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tname==0 ){.    
163f0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
16400 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70  Can't find the p
16410 61 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d  arser driver tem
16420 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c  plate file \"%s\
16430 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70 6c  ".\n",.    templ
16440 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65  atename);.    le
16450 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
16460 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16470 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 74  }.  in = fopen(t
16480 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20  pltname,"rb");. 
16490 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
164a0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
164b0 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65  ,"Can't open the
164c0 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c   template file \
164d0 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61  "%s\".\n",templa
164e0 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  tename);.    lem
164f0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
16500 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16510 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a  .  return in;.}.
16520 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c 69 6e  ./* Print a #lin
16530 65 20 64 69 72 65 63 74 69 76 65 20 6c 69 6e 65  e directive line
16540 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 66   to the output f
16550 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20  ile. */.PRIVATE 
16560 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65 64 69  void tplt_linedi
16570 72 28 6f 75 74 2c 6c 69 6e 65 6e 6f 2c 66 69 6c  r(out,lineno,fil
16580 65 6e 61 6d 65 29 0a 46 49 4c 45 20 2a 6f 75 74  ename).FILE *out
16590 3b 0a 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 63 68  ;.int lineno;.ch
165a0 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 0a 7b 0a  ar *filename;.{.
165b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
165c0 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69 6e 65  line %d \"",line
165d0 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a 66  no);.  while( *f
165e0 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69  ilename ){.    i
165f0 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d 20  f( *filename == 
16600 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c 5c 27  '\\' ) putc('\\'
16610 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74 63 28  ,out);.    putc(
16620 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a  *filename,out);.
16630 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a      filename++;.
16640 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
16650 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a  t,"\"\n");.}../*
16660 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e 67 20   Print a string 
16670 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  to the file and 
16680 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d  keep the linenum
16690 62 65 72 20 75 70 20 74 6f 20 64 61 74 65 20 2a  ber up to date *
166a0 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
166b0 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
166c0 6d 70 2c 73 74 72 2c 73 74 72 6c 6e 2c 6c 69 6e  mp,str,strln,lin
166d0 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a  eno).FILE *out;.
166e0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
166f0 6d 70 3b 0a 63 68 61 72 20 2a 73 74 72 3b 0a 69  mp;.char *str;.i
16700 6e 74 20 73 74 72 6c 6e 3b 0a 69 6e 74 20 2a 6c  nt strln;.int *l
16710 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 66 28 20 73  ineno;.{.  if( s
16720 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  tr==0 ) return;.
16730 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f    tplt_linedir(o
16740 75 74 2c 73 74 72 6c 6e 2c 6c 65 6d 70 2d 3e 66  ut,strln,lemp->f
16750 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 28 2a 6c 69  ilename);.  (*li
16760 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 77 68 69 6c 65  neno)++;.  while
16770 28 20 2a 73 74 72 20 29 7b 0a 20 20 20 20 69 66  ( *str ){.    if
16780 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29 20 28  ( *str=='\n' ) (
16790 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
167a0 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b 0a  putc(*str,out);.
167b0 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20      str++;.  }. 
167c0 20 69 66 28 20 73 74 72 5b 2d 31 5d 21 3d 27 5c   if( str[-1]!='\
167d0 6e 27 20 29 7b 0a 20 20 20 20 70 75 74 63 28 27  n' ){.    putc('
167e0 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20 20 20 28 2a  \n',out);.    (*
167f0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a 20  lineno)++;.  }. 
16800 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
16810 74 2c 2a 6c 69 6e 65 6e 6f 2b 32 2c 6c 65 6d 70  t,*lineno+2,lemp
16820 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 20 28  ->outname); .  (
16830 2a 6c 69 6e 65 6e 6f 29 2b 3d 32 3b 0a 20 20 72  *lineno)+=2;.  r
16840 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
16850 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
16860 75 74 69 6e 65 20 65 6d 69 74 73 20 63 6f 64 65  utine emits code
16870 20 66 6f 72 20 74 68 65 20 64 65 73 74 72 75 63   for the destruc
16880 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  tor for the.** s
16890 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64  ymbol sp.*/.void
168a0 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
168b0 5f 63 6f 64 65 28 6f 75 74 2c 73 70 2c 6c 65 6d  _code(out,sp,lem
168c0 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a  p,lineno).FILE *
168d0 6f 75 74 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  out;.struct symb
168e0 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c  ol *sp;.struct l
168f0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20  emon *lemp;.int 
16900 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72  *lineno;.{. char
16910 20 2a 63 70 20 3d 20 30 3b 0a 0a 20 69 6e 74 20   *cp = 0;.. int 
16920 6c 69 6e 65 63 6e 74 20 3d 20 30 3b 0a 20 69 66  linecnt = 0;. if
16930 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( sp->type==TERM
16940 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20  INAL ){.   cp = 
16950 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b  lemp->tokendest;
16960 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20  .   if( cp==0 ) 
16970 72 65 74 75 72 6e 3b 0a 20 20 20 74 70 6c 74 5f  return;.   tplt_
16980 6c 69 6e 65 64 69 72 28 6f 75 74 2c 6c 65 6d 70  linedir(out,lemp
16990 2d 3e 74 6f 6b 65 6e 64 65 73 74 6c 6e 2c 6c 65  ->tokendestln,le
169a0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
169b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b    fprintf(out,"{
169c0 22 29 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 73  ");. }else if( s
169d0 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 29 7b  p->destructor ){
169e0 0a 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 65 73  .   cp = sp->des
169f0 74 72 75 63 74 6f 72 3b 0a 20 20 20 74 70 6c 74  tructor;.   tplt
16a00 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 73 70 2d  _linedir(out,sp-
16a10 3e 64 65 73 74 72 75 63 74 6f 72 6c 6e 2c 6c 65  >destructorln,le
16a20 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
16a30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b    fprintf(out,"{
16a40 22 29 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 6c  ");. }else if( l
16a50 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a  emp->vardest ){.
16a60 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61     cp = lemp->va
16a70 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70  rdest;.   if( cp
16a80 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16a90 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
16aa0 74 2c 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 6c  t,lemp->vardestl
16ab0 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  n,lemp->filename
16ac0 29 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  );.   fprintf(ou
16ad0 74 2c 22 7b 22 29 3b 0a 20 7d 65 6c 73 65 7b 0a  t,"{");. }else{.
16ae0 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20     assert( 0 ); 
16af0 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65   /* Cannot happe
16b00 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a  n */. }. for(; *
16b10 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66  cp; cp++){.   if
16b20 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70  ( *cp=='$' && cp
16b30 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20  [1]=='$' ){.    
16b40 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79   fprintf(out,"(y
16b50 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c  ypminor->yy%d)",
16b60 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20  sp->dtnum);.    
16b70 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74   cp++;.     cont
16b80 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66  inue;.   }.   if
16b90 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69  ( *cp=='\n' ) li
16ba0 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 66 70 75 74  necnt++;.   fput
16bb0 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20  c(*cp,out);. }. 
16bc0 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b  (*lineno) += 3 +
16bd0 20 6c 69 6e 65 63 6e 74 3b 0a 20 66 70 72 69 6e   linecnt;. fprin
16be0 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 0a 20  tf(out,"}\n");. 
16bf0 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
16c00 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f  ,*lineno,lemp->o
16c10 75 74 6e 61 6d 65 29 3b 0a 20 72 65 74 75 72 6e  utname);. return
16c20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
16c30 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
16c40 29 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  ) if the given s
16c50 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65 73 74  ymbol has a dest
16c60 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68  ructor..*/.int h
16c70 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 73 70  as_destructor(sp
16c80 2c 20 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 73  , lemp).struct s
16c90 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63  ymbol *sp;.struc
16ca0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
16cb0 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66  .  int ret;.  if
16cc0 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( sp->type==TERM
16cd0 49 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20  INAL ){.    ret 
16ce0 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  = lemp->tokendes
16cf0 74 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t!=0;.  }else{. 
16d00 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76     ret = lemp->v
16d10 61 72 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d  ardest!=0 || sp-
16d20 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a  >destructor!=0;.
16d30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
16d40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
16d50 64 20 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61  d text to a dyna
16d60 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
16d70 64 20 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54  d string.  If zT
16d80 65 78 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a  ext is 0 then.**
16d90 20 72 65 73 65 74 20 74 68 65 20 73 74 72 69 6e   reset the strin
16da0 67 20 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67  g to be empty ag
16db0 61 69 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ain.  Always ret
16dc0 75 72 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  urn the complete
16dd0 20 74 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20   text.** of the 
16de0 73 74 72 69 6e 67 20 28 77 68 69 63 68 20 69 73  string (which is
16df0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
16e00 68 20 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a  h each call)..**
16e10 0a 2a 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a  .** n bytes of z
16e20 54 65 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e  Text are stored.
16e30 20 20 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61    If n==0 then a
16e40 6c 6c 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74  ll of zText up t
16e50 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c  o the first.** \
16e60 30 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69  000 terminator i
16e70 73 20 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74  s stored.  zText
16e80 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20   can contain up 
16e90 74 6f 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73  to two instances
16ea0 20 6f 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20   of.** %d.  The 
16eb0 76 61 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64  values of p1 and
16ec0 20 70 32 20 61 72 65 20 77 72 69 74 74 65 6e 20   p2 are written 
16ed0 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 20 61  into the first a
16ee0 6e 64 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e  nd second.** %d.
16ef0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c  .**.** If n==-1,
16f00 20 74 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f   then the previo
16f10 75 73 20 63 68 61 72 61 63 74 65 72 20 69 73 20  us character is 
16f20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a  overwritten..*/.
16f30 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 61 70  PRIVATE char *ap
16f40 70 65 6e 64 5f 73 74 72 28 63 68 61 72 20 2a 7a  pend_str(char *z
16f50 54 65 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74  Text, int n, int
16f60 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20   p1, int p2){.  
16f70 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 20 3d  static char *z =
16f80 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
16f90 20 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20   alloced = 0;.  
16fa0 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 20  static int used 
16fb0 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  = 0;.  int c;.  
16fc0 63 68 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a 0a  char zInt[40];..
16fd0 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29    if( zText==0 )
16fe0 7b 0a 20 20 20 20 75 73 65 64 20 3d 20 30 3b 0a  {.    used = 0;.
16ff0 20 20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20      return z;.  
17000 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a  }.  if( n<=0 ){.
17010 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20      if( n<0 ){. 
17020 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b 0a       used += n;.
17030 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75 73        assert( us
17040 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ed>=0 );.    }. 
17050 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 54     n = strlen(zT
17060 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ext);.  }.  if( 
17070 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32  n+sizeof(zInt)*2
17080 2b 75 73 65 64 20 3e 3d 20 61 6c 6c 6f 63 65 64  +used >= alloced
17090 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20   ){.    alloced 
170a0 3d 20 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e  = n + sizeof(zIn
170b0 74 29 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30  t)*2 + used + 20
170c0 30 3b 0a 20 20 20 20 7a 20 3d 20 72 65 61 6c 6c  0;.    z = reall
170d0 6f 63 28 7a 2c 20 20 61 6c 6c 6f 63 65 64 29 3b  oc(z,  alloced);
170e0 0a 20 20 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20  .  }.  if( z==0 
170f0 29 20 72 65 74 75 72 6e 20 22 22 3b 0a 20 20 77  ) return "";.  w
17100 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
17110 0a 20 20 20 20 63 20 3d 20 2a 28 7a 54 65 78 74  .    c = *(zText
17120 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++);.    if( c==
17130 27 25 27 20 26 26 20 7a 54 65 78 74 5b 30 5d 3d  '%' && zText[0]=
17140 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 73 70  ='d' ){.      sp
17150 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64 22  rintf(zInt, "%d"
17160 2c 20 70 31 29 3b 0a 20 20 20 20 20 20 70 31 20  , p1);.      p1 
17170 3d 20 70 32 3b 0a 20 20 20 20 20 20 73 74 72 63  = p2;.      strc
17180 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e  py(&z[used], zIn
17190 74 29 3b 0a 20 20 20 20 20 20 75 73 65 64 20 2b  t);.      used +
171a0 3d 20 73 74 72 6c 65 6e 28 26 7a 5b 75 73 65 64  = strlen(&z[used
171b0 5d 29 3b 0a 20 20 20 20 20 20 7a 54 65 78 74 2b  ]);.      zText+
171c0 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  +;.      n--;.  
171d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
171e0 5b 75 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20  [used++] = c;.  
171f0 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64    }.  }.  z[used
17200 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
17210 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 43 6f 64  z;.}../*.** zCod
17220 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68  e is a string th
17230 61 74 20 69 73 20 74 68 65 20 61 63 74 69 6f 6e  at is the action
17240 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
17250 20 61 20 72 75 6c 65 2e 20 20 45 78 70 61 6e 64   a rule.  Expand
17260 0a 2a 2a 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  .** the symbols 
17270 69 6e 20 74 68 69 73 20 73 74 72 69 6e 67 20 73  in this string s
17280 6f 20 74 68 61 74 20 74 68 65 20 72 65 66 65 72  o that the refer
17290 20 74 6f 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20   to elements of 
172a0 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 73 74  the parser.** st
172b0 61 63 6b 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ack..*/.PRIVATE 
172c0 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 5f 63  void translate_c
172d0 6f 64 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ode(struct lemon
172e0 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 72   *lemp, struct r
172f0 75 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68 61 72  ule *rp){.  char
17300 20 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74   *cp, *xp;.  int
17310 20 69 3b 0a 20 20 63 68 61 72 20 6c 68 73 75 73   i;.  char lhsus
17320 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72  ed = 0;    /* Tr
17330 75 65 20 69 66 20 74 68 65 20 4c 48 53 20 65 6c  ue if the LHS el
17340 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 20 75  ement has been u
17350 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 75 73  sed */.  char us
17360 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20 2f 2a  ed[MAXRHS];   /*
17370 20 54 72 75 65 20 66 6f 72 20 65 61 63 68 20 52   True for each R
17380 48 53 20 65 6c 65 6d 65 6e 74 20 77 68 69 63 68  HS element which
17390 20 69 73 20 75 73 65 64 20 2a 2f 0a 0a 20 20 66   is used */..  f
173a0 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
173b0 68 73 3b 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d  hs; i++) used[i]
173c0 20 3d 20 30 3b 0a 20 20 6c 68 73 75 73 65 64 20   = 0;.  lhsused 
173d0 3d 20 30 3b 0a 0a 20 20 61 70 70 65 6e 64 5f 73  = 0;..  append_s
173e0 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 66  tr(0,0,0,0);.  f
173f0 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20  or(cp=rp->code; 
17400 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  *cp; cp++){.    
17410 69 66 28 20 69 73 61 6c 70 68 61 28 2a 63 70 29  if( isalpha(*cp)
17420 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64   && (cp==rp->cod
17430 65 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d 28 63  e || (!isalnum(c
17440 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d  p[-1]) && cp[-1]
17450 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20 20  !='_')) ){.     
17460 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20 20   char saved;.   
17470 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70 5b 31     for(xp= &cp[1
17480 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70 29 20  ]; isalnum(*xp) 
17490 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b  || *xp=='_'; xp+
174a0 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65 64 20  +);.      saved 
174b0 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78 70  = *xp;.      *xp
174c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
174d0 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20  rp->lhsalias && 
174e0 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68  strcmp(cp,rp->lh
174f0 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20  salias)==0 ){.  
17500 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
17510 28 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e 79 79  ("yygotominor.yy
17520 25 64 22 2c 30 2c 72 70 2d 3e 6c 68 73 2d 3e 64  %d",0,rp->lhs->d
17530 74 6e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 20  tnum,0);.       
17540 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20   cp = xp;.      
17550 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20    lhsused = 1;. 
17560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17570 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
17580 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
17590 20 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d           if( rp-
175a0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20  >rhsalias[i] && 
175b0 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 72 68  strcmp(cp,rp->rh
175c0 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b  salias[i])==0 ){
175d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
175e0 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26 26   cp!=rp->code &&
175f0 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b 0a   cp[-1]=='@' ){.
17600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17610 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   If the argument
17620 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
17630 40 58 20 74 68 65 6e 20 73 75 62 73 74 69 74 75  @X then substitu
17640 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ted.            
17650 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20 6e    ** the token n
17660 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74 20  umber of X, not 
17670 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58 20 2a  the value of X *
17680 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
17690 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73  append_str("yyms
176a0 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31 2c  p[%d].major",-1,
176b0 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29 3b  i-rp->nrhs+1,0);
176c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
176d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
176e0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
176f0 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  *sp = rp->rhs[i]
17700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17710 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20 20  int dtnum;.     
17720 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d           if( sp-
17730 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
17740 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
17750 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20          dtnum = 
17760 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 64  sp->subsym[0]->d
17770 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
17780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17790 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d             dtnum
177a0 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20 20   = sp->dtnum;.  
177b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
177c0 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65              appe
177d0 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64  nd_str("yymsp[%d
177e0 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c  ].minor.yy%d",0,
177f0 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64 74  i-rp->nrhs+1, dt
17800 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  num);.          
17810 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
17820 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20  cp = xp;.       
17830 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31       used[i] = 1
17840 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
17850 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
17860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17870 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 73   }.      *xp = s
17880 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  aved;.    }.    
17890 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c 20 31  append_str(cp, 1
178a0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a 20  , 0, 0);.  } /* 
178b0 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 2f  End loop */..  /
178c0 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
178d0 73 75 72 65 20 74 68 65 20 4c 48 53 20 68 61 73  sure the LHS has
178e0 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20   been used */.  
178f0 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
17900 20 26 26 20 21 6c 68 73 75 73 65 64 20 29 7b 0a   && !lhsused ){.
17910 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
17920 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
17930 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20  ruleline,.      
17940 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20 66 6f  "Label \"%s\" fo
17950 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20  r \"%s(%s)\" is 
17960 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20  never used.",.  
17970 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69        rp->lhsali
17980 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  as,rp->lhs->name
17990 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  ,rp->lhsalias);.
179a0 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
179b0 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nt++;.  }..  /* 
179c0 47 65 6e 65 72 61 74 65 20 64 65 73 74 72 75 63  Generate destruc
179d0 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52 48 53  tor code for RHS
179e0 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 61   symbols which a
179f0 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 74  re not used in t
17a00 68 65 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 63  he.  ** reduce c
17a10 6f 64 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ode */.  for(i=0
17a20 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
17a30 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  +){.    if( rp->
17a40 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 21  rhsalias[i] && !
17a50 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20  used[i] ){.     
17a60 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
17a70 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
17a80 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 22  eline,.        "
17a90 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25  Label %s for \"%
17aa0 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
17ab0 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
17ac0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
17ad0 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d  ,rp->rhs[i]->nam
17ae0 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  e,rp->rhsalias[i
17af0 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ]);.      lemp->
17b00 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
17b10 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e 72 68  }else if( rp->rh
17b20 73 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29 7b 0a  salias[i]==0 ){.
17b30 20 20 20 20 20 20 69 66 28 20 68 61 73 5f 64 65        if( has_de
17b40 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73  structor(rp->rhs
17b50 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20  [i],lemp) ){.   
17b60 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28       append_str(
17b70 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f 72  "  yy_destructor
17b80 28 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d  (%d,&yymsp[%d].m
17b90 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20  inor);\n", 0,.  
17ba0 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
17bb0 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d  [i]->index,i-rp-
17bc0 3e 6e 72 68 73 2b 31 29 3b 0a 20 20 20 20 20 20  >nrhs+1);.      
17bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
17be0 2a 20 4e 6f 20 64 65 73 74 72 75 63 74 6f 72 20  * No destructor 
17bf0 64 65 66 69 6e 65 64 20 66 6f 72 20 74 68 69 73  defined for this
17c00 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 7d   term */.      }
17c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 70 20  .    }.  }.  cp 
17c20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30  = append_str(0,0
17c30 2c 30 2c 30 29 3b 0a 20 20 72 70 2d 3e 63 6f 64  ,0,0);.  rp->cod
17c40 65 20 3d 20 53 74 72 73 61 66 65 28 63 70 29 3b  e = Strsafe(cp);
17c50 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72  .}../* .** Gener
17c60 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
17c70 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65  xecutes when the
17c80 20 72 75 6c 65 20 22 72 70 22 20 69 73 20 72 65   rule "rp" is re
17c90 64 75 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a  duced.  Write.**
17ca0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75   the code to "ou
17cb0 74 22 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c  t".  Make sure l
17cc0 69 6e 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74  ineno stays up-t
17cd0 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41  o-date..*/.PRIVA
17ce0 54 45 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64  TE void emit_cod
17cf0 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 6c 69  e(out,rp,lemp,li
17d00 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  neno).FILE *out;
17d10 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  .struct rule *rp
17d20 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ;.struct lemon *
17d30 6c 65 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e  lemp;.int *linen
17d40 6f 3b 0a 7b 0a 20 63 68 61 72 20 2a 63 70 3b 0a  o;.{. char *cp;.
17d50 20 69 6e 74 20 6c 69 6e 65 63 6e 74 20 3d 20 30   int linecnt = 0
17d60 3b 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ;.. /* Generate 
17d70 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 72  code to do the r
17d80 65 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a  educe action */.
17d90 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b   if( rp->code ){
17da0 0a 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  .   tplt_linedir
17db0 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65  (out,rp->line,le
17dc0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
17dd0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b    fprintf(out,"{
17de0 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a 20  %s",rp->code);. 
17df0 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64    for(cp=rp->cod
17e00 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20  e; *cp; cp++){. 
17e10 20 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e      if( *cp=='\n
17e20 27 20 29 20 6c 69 6e 65 63 6e 74 2b 2b 3b 0a 20  ' ) linecnt++;. 
17e30 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
17e40 2a 2f 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 20  */.   (*lineno) 
17e50 2b 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a  += 3 + linecnt;.
17e60 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17e70 7d 5c 6e 22 29 3b 0a 20 20 20 74 70 6c 74 5f 6c  }\n");.   tplt_l
17e80 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65  inedir(out,*line
17e90 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  no,lemp->outname
17ea0 29 3b 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28  );. } /* End if(
17eb0 20 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a   rp->code ) */..
17ec0 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
17ed0 2a 20 50 72 69 6e 74 20 74 68 65 20 64 65 66 69  * Print the defi
17ee0 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e  nition of the un
17ef0 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65  ion used for the
17f00 20 70 61 72 73 65 72 27 73 20 64 61 74 61 20 73   parser's data s
17f10 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e  tack..** This un
17f20 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65  ion contains fie
17f30 6c 64 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f  lds for every po
17f40 73 73 69 62 6c 65 20 64 61 74 61 20 74 79 70 65  ssible data type
17f50 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61   for tokens.** a
17f60 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e  nd nonterminals.
17f70 20 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73    In the process
17f80 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e   of computing an
17f90 64 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a  d printing this.
17fa0 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73  ** union, also s
17fb0 65 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20  et the ".dtnum" 
17fc0 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74  field of every t
17fd0 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74  erminal and nont
17fe0 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f  erminal.** symbo
17ff0 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74  l..*/.void print
18000 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74  _stack_union(out
18010 2c 6c 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c 6d 68  ,lemp,plineno,mh
18020 66 6c 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  flag).FILE *out;
18030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18040 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
18050 73 74 72 65 61 6d 20 2a 2f 0a 73 74 72 75 63 74  stream */.struct
18060 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20 20 20   lemon *lemp;   
18070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
18080 6e 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  n info structure
18090 20 66 6f 72 20 74 68 69 73 20 70 61 72 73 65 72   for this parser
180a0 20 2a 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f   */.int *plineno
180b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
180c0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
180d0 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f  e line number */
180e0 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20  .int mhflag;    
180f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18100 54 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69  True if generati
18110 6e 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f  ng makeheaders o
18120 75 74 70 75 74 20 2a 2f 0a 7b 0a 20 20 69 6e 74  utput */.{.  int
18130 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65   lineno = *pline
18140 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69  no;    /* The li
18150 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ne number of the
18160 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61   output */.  cha
18170 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20  r **types;      
18180 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68         /* A hash
18190 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79   table of dataty
181a0 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72  pes */.  int arr
181b0 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  aysize;         
181c0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
181d0 65 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20  e "types" array 
181e0 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65  */.  int maxdtle
181f0 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f  ngth;          /
18200 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68  * Maximum length
18210 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79   of any ".dataty
18220 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  pe" field. */.  
18230 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20  char *stddt;    
18240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
18250 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66  ndardized name f
18260 6f 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f  or a datatype */
18270 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20  .  int i,j;     
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18290 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
182a0 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20 20 20  .  int hash;    
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
182c0 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20  For hashing the 
182d0 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a  name of a type *
182e0 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20  /.  char *name; 
182f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18300 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   Name of the par
18310 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ser */..  /* All
18320 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
18330 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64  lize types[] and
18340 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b   allocate stddt[
18350 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65  ] */.  arraysize
18360 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   = lemp->nsymbol
18370 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20   * 2;.  types = 
18380 28 63 68 61 72 2a 2a 29 6d 61 6c 6c 6f 63 28 20  (char**)malloc( 
18390 61 72 72 61 79 73 69 7a 65 20 2a 20 73 69 7a 65  arraysize * size
183a0 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 66  of(char*) );.  f
183b0 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73  or(i=0; i<arrays
183c0 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b  ize; i++) types[
183d0 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c  i] = 0;.  maxdtl
183e0 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69 66 28  ength = 0;.  if(
183f0 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 20 29   lemp->vartype )
18400 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e 67 74  {.    maxdtlengt
18410 68 20 3d 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d  h = strlen(lemp-
18420 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20  >vartype);.  }. 
18430 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
18440 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
18450 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
18460 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
18470 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
18480 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ols[i];.    if( 
18490 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20  sp->datatype==0 
184a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
184b0 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 73 70 2d  len = strlen(sp-
184c0 3e 64 61 74 61 74 79 70 65 29 3b 0a 20 20 20 20  >datatype);.    
184d0 69 66 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e  if( len>maxdtlen
184e0 67 74 68 20 29 20 6d 61 78 64 74 6c 65 6e 67 74  gth ) maxdtlengt
184f0 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73  h = len;.  }.  s
18500 74 64 64 74 20 3d 20 28 63 68 61 72 2a 29 6d 61  tddt = (char*)ma
18510 6c 6c 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67 74  lloc( maxdtlengt
18520 68 2a 32 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  h*2 + 1 );.  if(
18530 20 74 79 70 65 73 3d 3d 30 20 7c 7c 20 73 74 64   types==0 || std
18540 64 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  dt==0 ){.    fpr
18550 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
18560 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b   of memory.\n");
18570 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
18580 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61 20  }..  /* Build a 
18590 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61  hash table of da
185a0 74 61 74 79 70 65 73 2e 20 54 68 65 20 22 2e 64  tatypes. The ".d
185b0 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65  tnum" field of e
185c0 61 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20  ach symbol.  ** 
185d0 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74  is filled in wit
185e0 68 20 74 68 65 20 68 61 73 68 20 69 6e 64 65 78  h the hash index
185f0 20 70 6c 75 73 20 31 2e 20 20 41 20 22 2e 64 74   plus 1.  A ".dt
18600 6e 75 6d 22 20 76 61 6c 75 65 20 6f 66 20 30 20  num" value of 0 
18610 69 73 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  is.  ** used for
18620 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c   terminal symbol
18630 73 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  s.  If there is 
18640 6e 6f 20 25 64 65 66 61 75 6c 74 5f 74 79 70 65  no %default_type
18650 20 64 65 66 69 6e 65 64 20 74 68 65 6e 0a 20 20   defined then.  
18660 2a 2a 20 30 20 69 73 20 61 6c 73 6f 20 75 73 65  ** 0 is also use
18670 64 20 61 73 20 74 68 65 20 2e 64 74 6e 75 6d 20  d as the .dtnum 
18680 76 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72  value for nonter
18690 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 64 6f 20  minals which do 
186a0 6e 6f 74 20 73 70 65 63 69 66 79 0a 20 20 2a 2a  not specify.  **
186b0 20 61 20 64 61 74 61 74 79 70 65 20 75 73 69 6e   a datatype usin
186c0 67 20 74 68 65 20 25 74 79 70 65 20 64 69 72 65  g the %type dire
186d0 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ctive..  */.  fo
186e0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
186f0 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
18700 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
18710 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
18720 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72  ols[i];.    char
18730 20 2a 63 70 3b 0a 20 20 20 20 69 66 28 20 73 70   *cp;.    if( sp
18740 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29  ==lemp->errsym )
18750 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
18760 6d 20 3d 20 61 72 72 61 79 73 69 7a 65 2b 31 3b  m = arraysize+1;
18770 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
18780 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
18790 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d  p->type!=NONTERM
187a0 49 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74  INAL || (sp->dat
187b0 61 74 79 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70  atype==0 && lemp
187c0 2d 3e 76 61 72 74 79 70 65 3d 3d 30 29 20 29 7b  ->vartype==0) ){
187d0 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
187e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
187f0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
18800 63 70 20 3d 20 73 70 2d 3e 64 61 74 61 74 79 70  cp = sp->datatyp
18810 65 3b 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 30  e;.    if( cp==0
18820 20 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61   ) cp = lemp->va
18830 72 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30  rtype;.    j = 0
18840 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73  ;.    while( iss
18850 70 61 63 65 28 2a 63 70 29 20 29 20 63 70 2b 2b  pace(*cp) ) cp++
18860 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 63 70  ;.    while( *cp
18870 20 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20   ) stddt[j++] = 
18880 2a 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65  *cp++;.    while
18890 28 20 6a 3e 30 20 26 26 20 69 73 73 70 61 63 65  ( j>0 && isspace
188a0 28 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a  (stddt[j-1]) ) j
188b0 2d 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d  --;.    stddt[j]
188c0 20 3d 20 30 3b 0a 20 20 20 20 68 61 73 68 20 3d   = 0;.    hash =
188d0 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   0;.    for(j=0;
188e0 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b   stddt[j]; j++){
188f0 0a 20 20 20 20 20 20 68 61 73 68 20 3d 20 68 61  .      hash = ha
18900 73 68 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d  sh*53 + stddt[j]
18910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68  ;.    }.    hash
18920 20 3d 20 28 68 61 73 68 20 26 20 30 78 37 66 66   = (hash & 0x7ff
18930 66 66 66 66 66 29 25 61 72 72 61 79 73 69 7a 65  fffff)%arraysize
18940 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74 79 70  ;.    while( typ
18950 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20 20  es[hash] ){.    
18960 20 20 69 66 28 20 73 74 72 63 6d 70 28 74 79 70    if( strcmp(typ
18970 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3d  es[hash],stddt)=
18980 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70  =0 ){.        sp
18990 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b  ->dtnum = hash +
189a0 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
189b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
189c0 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69   hash++;.      i
189d0 66 28 20 68 61 73 68 3e 3d 61 72 72 61 79 73 69  f( hash>=arraysi
189e0 7a 65 20 29 20 68 61 73 68 20 3d 20 30 3b 0a 20  ze ) hash = 0;. 
189f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 79 70     }.    if( typ
18a00 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20  es[hash]==0 ){. 
18a10 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
18a20 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20   hash + 1;.     
18a30 20 74 79 70 65 73 5b 68 61 73 68 5d 20 3d 20 28   types[hash] = (
18a40 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 74  char*)malloc( st
18a50 72 6c 65 6e 28 73 74 64 64 74 29 2b 31 20 29 3b  rlen(stddt)+1 );
18a60 0a 20 20 20 20 20 20 69 66 28 20 74 79 70 65 73  .      if( types
18a70 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20  [hash]==0 ){.   
18a80 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
18a90 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
18aa0 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ry.\n");.       
18ab0 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
18ac0 7d 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 74  }.      strcpy(t
18ad0 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74  ypes[hash],stddt
18ae0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18af0 2f 2a 20 50 72 69 6e 74 20 6f 75 74 20 74 68 65  /* Print out the
18b00 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59   definition of Y
18b10 59 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64 20 59  YTOKENTYPE and Y
18b20 59 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20  YMINORTYPE */.  
18b30 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d  name = lemp->nam
18b40 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a  e ? lemp->name :
18b50 20 22 50 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65   "Parse";.  line
18b60 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20  no = *plineno;. 
18b70 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66   if( mhflag ){ f
18b80 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
18b90 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
18ba0 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72  ineno++; }.  fpr
18bb0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
18bc0 65 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 25 73  e %sTOKENTYPE %s
18bd0 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65  \n",name,.    le
18be0 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65  mp->tokentype?le
18bf0 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76  mp->tokentype:"v
18c00 6f 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b  oid*");  lineno+
18c10 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  +;.  if( mhflag 
18c20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
18c30 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
18c40 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74  no++; }.  fprint
18c50 66 28 6f 75 74 2c 22 74 79 70 65 64 65 66 20 75  f(out,"typedef u
18c60 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65  nion {\n"); line
18c70 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
18c80 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59  out,"  %sTOKENTY
18c90 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29  PE yy0;\n",name)
18ca0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
18cb0 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69  r(i=0; i<arraysi
18cc0 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ze; i++){.    if
18cd0 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20  ( types[i]==0 ) 
18ce0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70  continue;.    fp
18cf0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 20  rintf(out,"  %s 
18d00 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69  yy%d;\n",types[i
18d10 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ],i+1); lineno++
18d20 3b 0a 20 20 20 20 66 72 65 65 28 74 79 70 65 73  ;.    free(types
18d30 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69  [i]);.  }.  fpri
18d40 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79  ntf(out,"  int y
18d50 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72  y%d;\n",lemp->er
18d60 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69  rsym->dtnum); li
18d70 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 72 65 65 28 73  neno++;.  free(s
18d80 74 64 64 74 29 3b 0a 20 20 66 72 65 65 28 74 79  tddt);.  free(ty
18d90 70 65 73 29 3b 0a 20 20 66 70 72 69 6e 74 66 28  pes);.  fprintf(
18da0 6f 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59  out,"} YYMINORTY
18db0 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  PE;\n"); lineno+
18dc0 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20  +;.  *plineno = 
18dd0 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lineno;.}../*.**
18de0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
18df0 20 6f 66 20 61 20 43 20 64 61 74 61 74 79 70 65   of a C datatype
18e00 20 61 62 6c 65 20 74 6f 20 72 65 70 72 65 73 65   able to represe
18e10 6e 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  nt values betwee
18e20 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75 70 72  n.** lwr and upr
18e30 2c 20 69 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a  , inclusive..*/.
18e40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
18e50 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f  r *minimum_size_
18e60 74 79 70 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e  type(int lwr, in
18e70 74 20 75 70 72 29 7b 0a 20 20 69 66 28 20 6c 77  t upr){.  if( lw
18e80 72 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  r>=0 ){.    if( 
18e90 75 70 72 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20  upr<=255 ){.    
18ea0 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e    return "unsign
18eb0 65 64 20 63 68 61 72 22 3b 0a 20 20 20 20 7d 65  ed char";.    }e
18ec0 6c 73 65 20 69 66 28 20 75 70 72 3c 36 35 35 33  lse if( upr<6553
18ed0 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  5 ){.      retur
18ee0 6e 20 22 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  n "unsigned shor
18ef0 74 20 69 6e 74 22 3b 0a 20 20 20 20 7d 65 6c 73  t int";.    }els
18f00 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
18f10 22 75 6e 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a  "unsigned int";.
18f20 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
18f30 28 20 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20 75  ( lwr>=-127 && u
18f40 70 72 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 72  pr<=127 ){.    r
18f50 65 74 75 72 6e 20 22 73 69 67 6e 65 64 20 63 68  eturn "signed ch
18f60 61 72 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ar";.  }else if(
18f70 20 6c 77 72 3e 3d 2d 33 32 37 36 37 20 26 26 20   lwr>=-32767 && 
18f80 75 70 72 3c 33 32 37 36 37 20 29 7b 0a 20 20 20  upr<32767 ){.   
18f90 20 72 65 74 75 72 6e 20 22 73 68 6f 72 74 22 3b   return "short";
18fa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
18fb0 74 75 72 6e 20 22 69 6e 74 22 3b 0a 20 20 7d 0a  turn "int";.  }.
18fc0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74  }../*.** Each st
18fd0 61 74 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73  ate contains a s
18fe0 65 74 20 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e  et of token tran
18ff0 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65  saction and a se
19000 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69  t of.** nontermi
19010 6e 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  nal transactions
19020 2e 20 20 45 61 63 68 20 6f 66 20 74 68 65 73 65  .  Each of these
19030 20 73 65 74 73 20 6d 61 6b 65 73 20 61 6e 20 69   sets makes an i
19040 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68  nstance.** of th
19050 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
19060 63 74 75 72 65 2e 20 20 41 6e 20 61 72 72 61 79  cture.  An array
19070 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74   of these struct
19080 75 72 65 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  ures is used.** 
19090 74 6f 20 6f 72 64 65 72 20 74 68 65 20 63 72 65  to order the cre
190a0 61 74 69 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73  ation of entries
190b0 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
190c0 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  n[] table..*/.st
190d0 72 75 63 74 20 61 78 73 65 74 20 7b 0a 20 20 73  ruct axset {.  s
190e0 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
190f0 3b 20 20 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  ;   /* A pointer
19100 20 74 6f 20 61 20 73 74 61 74 65 20 2a 2f 0a 20   to a state */. 
19110 20 69 6e 74 20 69 73 54 6b 6e 3b 20 20 20 20 20   int isTkn;     
19120 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
19130 20 75 73 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61   use tokens.  Fa
19140 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d  lse for non-term
19150 69 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  inals */.  int n
19160 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Action;         
19170 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74  /* Number of act
19180 69 6f 6e 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ions */.};../*.*
19190 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20 61 78 73  * Compare to axs
191a0 65 74 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  et structures fo
191b0 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  r sorting purpos
191c0 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
191d0 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 28 63   axset_compare(c
191e0 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f  onst void *a, co
191f0 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20  nst void *b){.  
19200 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 31  struct axset *p1
19210 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74   = (struct axset
19220 2a 29 61 3b 0a 20 20 73 74 72 75 63 74 20 61 78  *)a;.  struct ax
19230 73 65 74 20 2a 70 32 20 3d 20 28 73 74 72 75 63  set *p2 = (struc
19240 74 20 61 78 73 65 74 2a 29 62 3b 0a 20 20 72 65  t axset*)b;.  re
19250 74 75 72 6e 20 70 32 2d 3e 6e 41 63 74 69 6f 6e  turn p2->nAction
19260 20 2d 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a   - p1->nAction;.
19270 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 43  }../* Generate C
19280 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72   source code for
19290 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76   the parser */.v
192a0 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28  oid ReportTable(
192b0 6c 65 6d 70 2c 20 6d 68 66 6c 61 67 29 0a 73 74  lemp, mhflag).st
192c0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
192d0 3b 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20  ;.int mhflag;   
192e0 20 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d    /* Output in m
192f0 61 6b 65 68 65 61 64 65 72 73 20 66 6f 72 6d 61  akeheaders forma
19300 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 7b 0a 20  t if true */.{. 
19310 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b   FILE *out, *in;
19320 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e  .  char line[LIN
19330 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c  ESIZE];.  int  l
19340 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20  ineno;.  struct 
19350 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
19360 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
19370 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
19380 72 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  rp;.  struct act
19390 74 61 62 20 2a 70 41 63 74 74 61 62 3b 0a 20 20  tab *pActtab;.  
193a0 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63  int i, j, n;.  c
193b0 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74  har *name;.  int
193c0 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b   mnTknOfst, mxTk
193d0 6e 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e  nOfst;.  int mnN
193e0 74 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b  tOfst, mxNtOfst;
193f0 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20  .  struct axset 
19400 2a 61 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c  *ax;..  in = tpl
19410 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20  t_open(lemp);.  
19420 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75  if( in==0 ) retu
19430 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65  rn;.  out = file
19440 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c  _open(lemp,".c",
19450 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74  "wb");.  if( out
19460 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73  ==0 ){.    fclos
19470 65 28 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  e(in);.    retur
19480 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20  n;.  }.  lineno 
19490 3d 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  = 1;.  tplt_xfer
194a0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
194b0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
194c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
194d0 69 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20 69 66  include code, if
194e0 20 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70   any */.  tplt_p
194f0 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
19500 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c 6c 65 6d 70  mp->include,lemp
19510 2d 3e 69 6e 63 6c 75 64 65 6c 6e 2c 26 6c 69 6e  ->includeln,&lin
19520 65 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c  eno);.  if( mhfl
19530 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ag ){.    char *
19540 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65  name = file_make
19550 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29  name(lemp, ".h")
19560 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
19570 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25 73  t,"#include \"%s
19580 5c 22 5c 6e 22 2c 20 6e 61 6d 65 29 3b 20 6c 69  \"\n", name); li
19590 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65  neno++;.    free
195a0 28 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70  (name);.  }.  tp
195b0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
195c0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
195d0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
195e0 74 65 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20  te #defines for 
195f0 61 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20  all tokens */.  
19600 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20  if( mhflag ){.  
19610 20 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a    char *prefix;.
19620 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19630 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e  "#if INTERFACE\n
19640 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
19650 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
19660 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78  nprefix ) prefix
19670 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72   = lemp->tokenpr
19680 65 66 69 78 3b 0a 20 20 20 20 65 6c 73 65 20 20  efix;.    else  
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20    prefix = "";. 
196b0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65     for(i=1; i<le
196c0 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69  mp->nterminal; i
196d0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ++){.      fprin
196e0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
196f0 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70  %s%-30s %2d\n",p
19700 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
19710 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
19720 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  .      lineno++;
19730 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
19740 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e  tf(out,"#endif\n
19750 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
19760 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
19770 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
19780 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
19790 47 65 6e 65 72 61 74 65 20 74 68 65 20 64 65 66  Generate the def
197a0 69 6e 65 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74  ines */.  fprint
197b0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
197c0 59 43 4f 44 45 54 59 50 45 20 25 73 5c 6e 22 2c  YCODETYPE %s\n",
197d0 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a  .    minimum_siz
197e0 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e  e_type(0, lemp->
197f0 6e 73 79 6d 62 6f 6c 2b 35 29 29 3b 20 6c 69 6e  nsymbol+5)); lin
19800 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
19810 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
19820 4e 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d  NOCODE %d\n",lem
19830 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20  p->nsymbol+1);  
19840 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
19850 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
19860 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 25 73   YYACTIONTYPE %s
19870 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d  \n",.    minimum
19880 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65  _size_type(0, le
19890 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d  mp->nstate+lemp-
198a0 3e 6e 72 75 6c 65 2b 35 29 29 3b 20 20 6c 69 6e  >nrule+5));  lin
198b0 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d  eno++;.  if( lem
198c0 70 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20  p->wildcard ){. 
198d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
198e0 23 64 65 66 69 6e 65 20 59 59 57 49 4c 44 43 41  #define YYWILDCA
198f0 52 44 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  RD %d\n",.      
19900 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d   lemp->wildcard-
19910 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
19920 2b 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73  +;.  }.  print_s
19930 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c  tack_union(out,l
19940 65 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c  emp,&lineno,mhfl
19950 61 67 29 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  ag);.  if( lemp-
19960 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20  >stacksize ){.  
19970 20 20 69 66 28 20 61 74 6f 69 28 6c 65 6d 70 2d    if( atoi(lemp-
19980 3e 73 74 61 63 6b 73 69 7a 65 29 3c 3d 30 20 29  >stacksize)<=0 )
19990 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67  {.      ErrorMsg
199a0 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
199b0 30 2c 0a 22 49 6c 6c 65 67 61 6c 20 73 74 61 63  0,."Illegal stac
199c0 6b 20 73 69 7a 65 3a 20 5b 25 73 5d 2e 20 20 54  k size: [%s].  T
199d0 68 65 20 73 74 61 63 6b 20 73 69 7a 65 20 73 68  he stack size sh
199e0 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
199f0 65 72 20 63 6f 6e 73 74 61 6e 74 2e 22 2c 0a 20  er constant.",. 
19a00 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 73 74 61         lemp->sta
19a10 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 6c  cksize);.      l
19a20 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
19a30 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 73 74 61  .      lemp->sta
19a40 63 6b 73 69 7a 65 20 3d 20 22 31 30 30 22 3b 0a  cksize = "100";.
19a50 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
19a60 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
19a70 59 53 54 41 43 4b 44 45 50 54 48 20 25 73 5c 6e  YSTACKDEPTH %s\n
19a80 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a  ",lemp->stacksiz
19a90 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
19aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
19ab0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
19ac0 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 31 30   YYSTACKDEPTH 10
19ad0 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  0\n");  lineno++
19ae0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c  ;.  }.  if( mhfl
19af0 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ag ){.    fprint
19b00 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52  f(out,"#if INTER
19b10 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  FACE\n"); lineno
19b20 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d  ++;.  }.  name =
19b30 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65   lemp->name ? le
19b40 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73  mp->name : "Pars
19b50 65 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  e";.  if( lemp->
19b60 61 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67  arg && lemp->arg
19b70 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  [0] ){.    int i
19b80 3b 0a 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e  ;.    i = strlen
19b90 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20  (lemp->arg);.   
19ba0 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20   while( i>=1 && 
19bb0 69 73 73 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72  isspace(lemp->ar
19bc0 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20  g[i-1]) ) i--;. 
19bd0 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26     while( i>=1 &
19be0 26 20 28 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d  & (isalnum(lemp-
19bf0 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65  >arg[i-1]) || le
19c00 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f  mp->arg[i-1]=='_
19c10 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70  ') ) i--;.    fp
19c20 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
19c30 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c 20 25  ne %sARG_SDECL %
19c40 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d  s;\n",name,lemp-
19c50 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  >arg);  lineno++
19c60 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
19c70 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
19c80 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61  _PDECL ,%s\n",na
19c90 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20  me,lemp->arg);  
19ca0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
19cb0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
19cc0 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48 20 25  ne %sARG_FETCH %
19cd0 73 20 3d 20 79 79 70 50 61 72 73 65 72 2d 3e 25  s = yypParser->%
19ce0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
19cf0 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70         name,lemp
19d00 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67  ->arg,&lemp->arg
19d10 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  [i]);  lineno++;
19d20 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
19d30 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
19d40 53 54 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d  STORE yypParser-
19d50 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20  >%s = %s\n",.   
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
19d70 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  me,&lemp->arg[i]
19d80 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b  ,&lemp->arg[i]);
19d90 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65    lineno++;.  }e
19da0 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
19db0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
19dc0 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d  ARG_SDECL\n",nam
19dd0 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
19de0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19df0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44  #define %sARG_PD
19e00 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c  ECL\n",name);  l
19e10 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
19e20 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
19e30 65 20 25 73 41 52 47 5f 46 45 54 43 48 5c 6e 22  e %sARG_FETCH\n"
19e40 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
19e50 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
19e60 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
19e70 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b  _STORE\n",name);
19e80 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
19e90 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
19ea0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19eb0 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
19ec0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69  no++;.  }.  fpri
19ed0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
19ee0 20 59 59 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c   YYNSTATE %d\n",
19ef0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20  lemp->nstate);  
19f00 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
19f10 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
19f20 20 59 59 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c   YYNRULE %d\n",l
19f30 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69  emp->nrule);  li
19f40 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
19f50 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
19f60 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c  YERRORSYMBOL %d\
19f70 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  n",lemp->errsym-
19f80 3e 69 6e 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f  >index);  lineno
19f90 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
19fa0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52  t,"#define YYERR
19fb0 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65  SYMDT yy%d\n",le
19fc0 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75  mp->errsym->dtnu
19fd0 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  m);  lineno++;. 
19fe0 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66   if( lemp->has_f
19ff0 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66  allback ){.    f
1a000 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1a010 69 6e 65 20 59 59 46 41 4c 4c 42 41 43 4b 20 31  ine YYFALLBACK 1
1a020 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  \n");  lineno++;
1a030 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1a040 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1a050 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1a060 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1a070 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 61 6e 64  action table and
1a080 20 69 74 73 20 61 73 73 6f 63 69 61 74 65 73 3a   its associates:
1a090 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 79 79 5f 61  .  **.  **  yy_a
1a0a0 63 74 69 6f 6e 5b 5d 20 20 20 20 20 20 20 20 41  ction[]        A
1a0b0 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 63 6f   single table co
1a0c0 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 61 63 74  ntaining all act
1a0d0 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c  ions..  **  yy_l
1a0e0 6f 6f 6b 61 68 65 61 64 5b 5d 20 20 20 20 20 41  ookahead[]     A
1a0f0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1a100 67 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  g the lookahead 
1a110 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79 20 69  for each entry i
1a120 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  n.  **          
1a130 20 20 20 20 20 20 20 20 20 20 20 79 79 5f 61 63             yy_ac
1a140 74 69 6f 6e 2e 20 20 55 73 65 64 20 74 6f 20 64  tion.  Used to d
1a150 65 74 65 63 74 20 68 61 73 68 20 63 6f 6c 6c 69  etect hash colli
1a160 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f  sions..  **  yy_
1a170 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 20 20 20  shift_ofst[]    
1a180 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20  For each state, 
1a190 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
1a1a0 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20  yy_action for.  
1a1b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1a1c0 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67 20         shifting 
1a1d0 74 65 72 6d 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20  terminals..  ** 
1a1e0 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
1a1f0 5d 20 20 20 46 6f 72 20 65 61 63 68 20 73 74 61  ]   For each sta
1a200 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69  te, the offset i
1a210 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f  nto yy_action fo
1a220 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  r.  **          
1a230 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66 74             shift
1a240 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ing non-terminal
1a250 73 20 61 66 74 65 72 20 61 20 72 65 64 75 63 65  s after a reduce
1a260 2e 0a 20 20 2a 2a 20 20 79 79 5f 64 65 66 61 75  ..  **  yy_defau
1a270 6c 74 5b 5d 20 20 20 20 20 20 20 44 65 66 61 75  lt[]       Defau
1a280 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 65 61  lt action for ea
1a290 63 68 20 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a  ch state..  */..
1a2a0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1a2b0 20 61 63 74 69 6f 6e 73 20 6f 6e 20 61 6c 6c 20   actions on all 
1a2c0 73 74 61 74 65 73 20 61 6e 64 20 63 6f 75 6e 74  states and count
1a2d0 20 74 68 65 6d 20 75 70 20 2a 2f 0a 20 20 61 78   them up */.  ax
1a2e0 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   = malloc( sizeo
1a2f0 66 28 61 78 5b 30 5d 29 2a 6c 65 6d 70 2d 3e 6e  f(ax[0])*lemp->n
1a300 73 74 61 74 65 2a 32 20 29 3b 0a 20 20 69 66 28  state*2 );.  if(
1a310 20 61 78 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70   ax==0 ){.    fp
1a320 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61  rintf(stderr,"ma
1a330 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b  lloc failed\n");
1a340 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
1a350 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  }.  for(i=0; i<l
1a360 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
1a370 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1a380 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1a390 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20 3d 20    ax[i*2].stp = 
1a3a0 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  stp;.    ax[i*2]
1a3b0 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20 20 20  .isTkn = 1;.    
1a3c0 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20  ax[i*2].nAction 
1a3d0 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a  = stp->nTknAct;.
1a3e0 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 73 74      ax[i*2+1].st
1a3f0 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b  p = stp;.    ax[
1a400 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20 30  i*2+1].isTkn = 0
1a410 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
1a420 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e  nAction = stp->n
1a430 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d 78 54  NtAct;.  }.  mxT
1a440 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66  knOfst = mnTknOf
1a450 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f 66  st = 0;.  mxNtOf
1a460 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st = mnNtOfst = 
1a470 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  0;..  /* Compute
1a480 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
1a490 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  e.  In order to 
1a4a0 74 72 79 20 74 6f 20 6b 65 65 70 20 74 68 65 20  try to keep the 
1a4b0 73 69 7a 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  size of the.  **
1a4c0 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 74 6f   action table to
1a4d0 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 74 68 65 20   a minimum, the 
1a4e0 68 65 75 72 69 73 74 69 63 20 6f 66 20 70 6c 61  heuristic of pla
1a4f0 63 69 6e 67 20 74 68 65 20 6c 61 72 67 65 73 74  cing the largest
1a500 20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 73 65 74   action.  ** set
1a510 73 20 66 69 72 73 74 20 69 73 20 75 73 65 64 2e  s first is used.
1a520 0a 20 20 2a 2f 0a 20 20 71 73 6f 72 74 28 61 78  .  */.  qsort(ax
1a530 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  , lemp->nstate*2
1a540 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c  , sizeof(ax[0]),
1a550 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b   axset_compare);
1a560 0a 20 20 70 41 63 74 74 61 62 20 3d 20 61 63 74  .  pActtab = act
1a570 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66  tab_alloc();.  f
1a580 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1a590 6e 73 74 61 74 65 2a 32 20 26 26 20 61 78 5b 69  nstate*2 && ax[i
1a5a0 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b  ].nAction>0; i++
1a5b0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 61 78 5b  ){.    stp = ax[
1a5c0 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69 66 28 20  i].stp;.    if( 
1a5d0 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20  ax[i].isTkn ){. 
1a5e0 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d       for(ap=stp-
1a5f0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1a600 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
1a610 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20  nt action;.     
1a620 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
1a630 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72  ndex>=lemp->nter
1a640 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
1a650 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e  ;.        action
1a660 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f   = compute_actio
1a670 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20  n(lemp, ap);.   
1a680 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c       if( action<
1a690 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1a6a0 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74        acttab_act
1a6b0 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d  ion(pActtab, ap-
1a6c0 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69  >sp->index, acti
1a6d0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on);.      }.   
1a6e0 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74     stp->iTknOfst
1a6f0 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
1a700 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
1a710 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66   if( stp->iTknOf
1a720 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d  st<mnTknOfst ) m
1a730 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e  nTknOfst = stp->
1a740 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20  iTknOfst;.      
1a750 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  if( stp->iTknOfs
1a760 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78  t>mxTknOfst ) mx
1a770 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69  TknOfst = stp->i
1a780 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c  TknOfst;.    }el
1a790 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70  se{.      for(ap
1a7a0 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
1a7b0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1a7c0 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a      int action;.
1a7d0 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
1a7e0 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
1a7f0 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74  nterminal ) cont
1a800 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1a810 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d  ( ap->sp->index=
1a820 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29  =lemp->nsymbol )
1a830 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1a840 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70     action = comp
1a850 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
1a860 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66   ap);.        if
1a870 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e  ( action<0 ) con
1a880 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1a890 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63  cttab_action(pAc
1a8a0 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e  ttab, ap->sp->in
1a8b0 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  dex, action);.  
1a8c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d      }.      stp-
1a8d0 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63 74 74 61  >iNtOfst = actta
1a8e0 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62  b_insert(pActtab
1a8f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
1a900 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66  ->iNtOfst<mnNtOf
1a910 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st ) mnNtOfst = 
1a920 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20  stp->iNtOfst;.  
1a930 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74      if( stp->iNt
1a940 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20  Ofst>mxNtOfst ) 
1a950 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e  mxNtOfst = stp->
1a960 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20  iNtOfst;.    }. 
1a970 20 7d 0a 20 20 66 72 65 65 28 61 78 29 3b 0a 0a   }.  free(ax);..
1a980 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1a990 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
1a9a0 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1a9b0 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59  ,"static const Y
1a9c0 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 61  YACTIONTYPE yy_a
1a9d0 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b  ction[] = {\n");
1a9e0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d   lineno++;.  n =
1a9f0 20 61 63 74 74 61 62 5f 73 69 7a 65 28 70 41 63   acttab_size(pAc
1aa00 74 74 61 62 29 3b 0a 20 20 66 6f 72 28 69 3d 6a  ttab);.  for(i=j
1aa10 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
1aa20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20     int action = 
1aa30 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28  acttab_yyaction(
1aa40 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20  pActtab, i);.   
1aa50 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20   if( action<0 ) 
1aa60 61 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  action = lemp->n
1aa70 73 79 6d 62 6f 6c 20 2b 20 6c 65 6d 70 2d 3e 6e  symbol + lemp->n
1aa80 72 75 6c 65 20 2b 20 32 3b 0a 20 20 20 20 69 66  rule + 2;.    if
1aa90 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
1aaa0 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
1aab0 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
1aac0 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
1aad0 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 69  , action);.    i
1aae0 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
1aaf0 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
1ab00 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
1ab10 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
1ab20 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1ab30 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
1ab40 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
1ab50 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
1ab60 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
1ab70 74 70 75 74 20 74 68 65 20 79 79 5f 6c 6f 6f 6b  tput the yy_look
1ab80 61 68 65 61 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ahead table */. 
1ab90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74   fprintf(out,"st
1aba0 61 74 69 63 20 63 6f 6e 73 74 20 59 59 43 4f 44  atic const YYCOD
1abb0 45 54 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65  ETYPE yy_lookahe
1abc0 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  ad[] = {\n"); li
1abd0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
1abe0 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
1abf0 20 20 20 20 69 6e 74 20 6c 61 20 3d 20 61 63 74      int la = act
1ac00 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28  tab_yylookahead(
1ac10 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20  pActtab, i);.   
1ac20 20 69 66 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d   if( la<0 ) la =
1ac30 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a   lemp->nsymbol;.
1ac40 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1ac50 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1ac60 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1ac70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1ac80 20 25 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20   %4d,", la);.   
1ac90 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
1aca0 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
1acb0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
1acc0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1acd0 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
1ace0 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
1acf0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
1ad00 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
1ad10 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
1ad20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 73 68  Output the yy_sh
1ad30 69 66 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65  ift_ofst[] table
1ad40 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1ad50 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
1ad60 48 49 46 54 5f 55 53 45 5f 44 46 4c 54 20 28 25  HIFT_USE_DFLT (%
1ad70 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74  d)\n", mnTknOfst
1ad80 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  -1); lineno++;. 
1ad90 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74   n = lemp->nstat
1ada0 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  e;.  while( n>0 
1adb0 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  && lemp->sorted[
1adc0 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d  n-1]->iTknOfst==
1add0 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b  NO_OFFSET ) n--;
1ade0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1adf0 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46  "#define YY_SHIF
1ae00 54 5f 4d 41 58 20 25 64 5c 6e 22 2c 20 6e 2d 31  T_MAX %d\n", n-1
1ae10 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1ae20 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1ae30 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f  tic const %s yy_
1ae40 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b  shift_ofst[] = {
1ae50 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1ae60 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1ae70 65 28 6d 6e 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d  e(mnTknOfst-1, m
1ae80 78 54 6b 6e 4f 66 73 74 29 29 3b 20 6c 69 6e 65  xTknOfst)); line
1ae90 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  no++;.  for(i=j=
1aea0 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
1aeb0 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20    int ofst;.    
1aec0 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
1aed0 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20  ed[i];.    ofst 
1aee0 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
1aef0 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e  .    if( ofst==N
1af00 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20  O_OFFSET ) ofst 
1af10 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 2d 20 31 3b  = mnTknOfst - 1;
1af20 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
1af30 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1af40 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
1af50 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1af60 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a  " %4d,", ofst);.
1af70 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1af80 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1af90 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1afa0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1afb0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1afc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1afd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1afe0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1aff0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1b000 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1b010 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74  _reduce_ofst[] t
1b020 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
1b030 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1b040 59 59 5f 52 45 44 55 43 45 5f 55 53 45 5f 44 46  YY_REDUCE_USE_DF
1b050 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74  LT (%d)\n", mnNt
1b060 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  Ofst-1); lineno+
1b070 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  +;.  n = lemp->n
1b080 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20  state;.  while( 
1b090 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72  n>0 && lemp->sor
1b0a0 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73  ted[n-1]->iNtOfs
1b0b0 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e  t==NO_OFFSET ) n
1b0c0 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  --;.  fprintf(ou
1b0d0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52  t, "#define YY_R
1b0e0 45 44 55 43 45 5f 4d 41 58 20 25 64 5c 6e 22 2c  EDUCE_MAX %d\n",
1b0f0 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b   n-1); lineno++;
1b100 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1b110 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73  "static const %s
1b120 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
1b130 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20  ] = {\n", .     
1b140 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a       minimum_siz
1b150 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d  e_type(mnNtOfst-
1b160 31 2c 20 6d 78 4e 74 4f 66 73 74 29 29 3b 20 6c  1, mxNtOfst)); l
1b170 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
1b180 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
1b190 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20  .    int ofst;. 
1b1a0 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1b1b0 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66  orted[i];.    of
1b1c0 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73  st = stp->iNtOfs
1b1d0 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d  t;.    if( ofst=
1b1e0 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73  =NO_OFFSET ) ofs
1b1f0 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31  t = mnNtOfst - 1
1b200 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29  ;.    if( j==0 )
1b210 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1b220 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a  * %5d */ ", i);.
1b230 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b240 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b   " %4d,", ofst);
1b250 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1b260 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1b270 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1b280 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1b290 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1b2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1b2b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1b2c0 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1b2d0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1b2e0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64   /* Output the d
1b2f0 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61  efault action ta
1b300 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
1b310 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
1b320 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45  nst YYACTIONTYPE
1b330 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20   yy_default[] = 
1b340 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
1b350 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  .  n = lemp->nst
1b360 61 74 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  ate;.  for(i=j=0
1b370 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1b380 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
1b390 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ted[i];.    if( 
1b3a0 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1b3b0 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1b3c0 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1b3d0 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1b3e0 73 74 70 2d 3e 69 44 66 6c 74 29 3b 0a 20 20 20  stp->iDflt);.   
1b3f0 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
1b400 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
1b410 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
1b420 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1b430 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
1b440 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
1b450 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
1b460 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
1b470 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74  lineno++;.  tplt
1b480 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1b490 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1b4a0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1b4b0 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66 61   the table of fa
1b4c0 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20  llback tokens.. 
1b4d0 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
1b4e0 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  has_fallback ){.
1b4f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
1b500 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
1b510 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
1b520 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c  ct symbol *p = l
1b530 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1b540 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61  .      if( p->fa
1b550 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
1b560 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1b570 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31  , "    0,  /* %1
1b580 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f  0s => nothing */
1b590 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20  \n", p->name);. 
1b5a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b5b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b5c0 20 22 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30   "  %3d,  /* %10
1b5d0 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70  s => %s */\n", p
1b5e0 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65  ->fallback->inde
1b5f0 78 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  x,.          p->
1b600 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63  name, p->fallbac
1b610 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  k->name);.      
1b620 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b  }.      lineno++
1b630 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70  ;.    }.  }.  tp
1b640 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1b650 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69  me, in, out, &li
1b660 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1b670 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f  erate a table co
1b680 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d  ntaining the sym
1b690 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76  bolic name of ev
1b6a0 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a  ery symbol.  */.
1b6b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1b6c0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1b6d0 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 6c 69  {.    sprintf(li
1b6e0 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d  ne,"\"%s\",",lem
1b6f0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
1b700 61 6d 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ame);.    fprint
1b710 66 28 6f 75 74 2c 22 20 20 25 2d 31 35 73 22 2c  f(out,"  %-15s",
1b720 6c 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28  line);.    if( (
1b730 69 26 33 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e  i&3)==3 ){ fprin
1b740 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69  tf(out,"\n"); li
1b750 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  neno++; }.  }.  
1b760 69 66 28 20 28 69 26 33 29 21 3d 30 20 29 7b 20  if( (i&3)!=0 ){ 
1b770 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22  fprintf(out,"\n"
1b780 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
1b790 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1b7a0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1b7b0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1b7c0 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f  erate a table co
1b7d0 6e 74 61 69 6e 69 6e 67 20 61 20 74 65 78 74 20  ntaining a text 
1b7e0 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
1b7f0 72 69 62 65 73 20 65 76 65 72 79 0a 20 20 2a 2a  ribes every.  **
1b800 20 72 75 6c 65 20 69 6e 20 74 68 65 20 72 75 6c   rule in the rul
1b810 65 20 73 65 74 20 6f 66 20 74 68 65 20 67 72 61  e set of the gra
1b820 6d 6d 65 72 2e 20 20 54 68 69 73 20 69 6e 66 6f  mmer.  This info
1b830 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 0a  rmation is used.
1b840 20 20 2a 2a 20 77 68 65 6e 20 74 72 61 63 69 6e    ** when tracin
1b850 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73  g REDUCE actions
1b860 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1b870 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  , rp=lemp->rule;
1b880 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
1b890 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , i++){.    asse
1b8a0 72 74 28 20 72 70 2d 3e 69 6e 64 65 78 3d 3d 69  rt( rp->index==i
1b8b0 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   );.    fprintf(
1b8c0 6f 75 74 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20  out," /* %3d */ 
1b8d0 5c 22 25 73 20 3a 3a 3d 22 2c 20 69 2c 20 72 70  \"%s ::=", i, rp
1b8e0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
1b8f0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d    for(j=0; j<rp-
1b900 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nrhs; j++){.   
1b910 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1b920 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a   *sp = rp->rhs[j
1b930 5d 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ];.      fprintf
1b940 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e  (out," %s", sp->
1b950 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  name);.      if(
1b960 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
1b970 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
1b980 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
1b990 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70     for(k=1; k<sp
1b9a0 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b  ->nsubsym; k++){
1b9b0 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
1b9c0 74 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d  tf(out,"|%s",sp-
1b9d0 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65  >subsym[k]->name
1b9e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b9f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
1ba00 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c  printf(out,"\",\
1ba10 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1ba20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1ba30 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1ba40 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1ba50 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1ba60 68 69 63 68 20 65 78 65 63 75 74 65 73 20 65 76  hich executes ev
1ba70 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f  ery time a symbo
1ba80 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d  l is popped from
1ba90 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20  .  ** the stack 
1baa0 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
1bab0 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65   errors or while
1bac0 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20   destroying the 
1bad0 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49  parser. .  ** (I
1bae0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67  n other words, g
1baf0 65 6e 65 72 61 74 65 20 74 68 65 20 25 64 65 73  enerate the %des
1bb00 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29  tructor actions)
1bb10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  .  */.  if( lemp
1bb20 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20  ->tokendest ){. 
1bb30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
1bb40 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
1bb50 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1bb60 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
1bb70 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1bb80 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c       if( sp==0 |
1bb90 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d  | sp->type!=TERM
1bba0 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  INAL ) continue;
1bbb0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1bbc0 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
1bbd0 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20  \n",sp->index); 
1bbe0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1bbf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
1bc00 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20  emp->nsymbol && 
1bc10 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1bc20 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
1bc30 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  ; i++);.    if( 
1bc40 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  i<lemp->nsymbol 
1bc50 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65  ){.      emit_de
1bc60 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
1bc70 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  t,lemp->symbols[
1bc80 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  i],lemp,&lineno)
1bc90 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
1bca0 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
1bcb0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1bcc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1bcd0 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
1bce0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
1bcf0 62 6f 6c 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30  bol *dflt_sp = 0
1bd00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1bd10 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
1bd20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
1bd30 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1bd40 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1bd50 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d  ;.      if( sp==
1bd60 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54  0 || sp->type==T
1bd70 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20  ERMINAL ||.     
1bd80 20 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d       sp->index<=
1bd90 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  0 || sp->destruc
1bda0 74 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  tor!=0 ) continu
1bdb0 65 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  e;.      fprintf
1bdc0 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25  (out,"    case %
1bdd0 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29  d:\n",sp->index)
1bde0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1bdf0 20 20 64 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a    dflt_sp = sp;.
1be00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 66      }.    if( df
1be10 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20 20 20  lt_sp!=0 ){.    
1be20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
1be30 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f  r_code(out,dflt_
1be40 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  sp,lemp,&lineno)
1be50 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
1be60 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
1be70 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1be80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
1be90 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1bea0 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
1beb0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1bec0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
1bed0 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
1bee0 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65  p==0 || sp->type
1bef0 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70  ==TERMINAL || sp
1bf00 2d 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20  ->destructor==0 
1bf10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1bf20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1bf30 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d   case %d:\n",sp-
1bf40 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
1bf50 2b 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69  +;..    /* Combi
1bf60 6e 65 20 64 75 70 6c 69 63 61 74 65 20 64 65 73  ne duplicate des
1bf70 74 72 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20  tructors into a 
1bf80 73 69 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20  single case */. 
1bf90 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c     for(j=i+1; j<
1bfa0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a  lemp->nsymbol; j
1bfb0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
1bfc0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20  t symbol *sp2 = 
1bfd0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
1bfe0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 32 20  ;.      if( sp2 
1bff0 26 26 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45  && sp2->type!=TE
1c000 52 4d 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64  RMINAL && sp2->d
1c010 65 73 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20  estructor.      
1c020 20 20 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75      && sp2->dtnu
1c030 6d 3d 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20  m==sp->dtnum.   
1c040 20 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70         && strcmp
1c050 28 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c  (sp->destructor,
1c060 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29  sp2->destructor)
1c070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1c080 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1c090 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70 32   case %d:\n",sp2
1c0a0 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f  ->index); lineno
1c0b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 73 70 32  ++;.         sp2
1c0c0 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30  ->destructor = 0
1c0d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c0e0 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75  .    emit_destru
1c0f0 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65  ctor_code(out,le
1c100 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c  mp->symbols[i],l
1c110 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
1c120 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1c130 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
1c140 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1c150 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1c160 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1c170 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1c180 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1c190 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65 76   executes whenev
1c1a0 65 72 20 74 68 65 20 70 61 72 73 65 72 20 73 74  er the parser st
1c1b0 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f  ack overflows */
1c1c0 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1c1d0 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65  t,lemp,lemp->ove
1c1e0 72 66 6c 6f 77 2c 6c 65 6d 70 2d 3e 6f 76 65 72  rflow,lemp->over
1c1f0 66 6c 6f 77 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b  flowln,&lineno);
1c200 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1c210 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1c220 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1c230 65 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c  enerate the tabl
1c240 65 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72 6d  e of rule inform
1c250 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ation .  **.  **
1c260 20 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f 64 65   Note: This code
1c270 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
1c280 66 61 63 74 20 74 68 61 74 20 72 75 6c 65 73 20  fact that rules 
1c290 61 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  are number.  ** 
1c2a0 73 65 71 75 65 6e 74 75 61 6c 6c 79 20 62 65 67  sequentually beg
1c2b0 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e 0a 20  inning with 0.. 
1c2c0 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
1c2d0 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
1c2e0 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66  rp->next){.    f
1c2f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b 20  printf(out,"  { 
1c300 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d  %d, %d },\n",rp-
1c310 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e  >lhs->index,rp->
1c320 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  nrhs); lineno++;
1c330 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1c340 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1c350 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1c360 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1c370 20 77 68 69 63 68 20 65 78 65 63 75 74 69 6f 6e   which execution
1c380 20 64 75 72 69 6e 67 20 65 61 63 68 20 52 45 44   during each RED
1c390 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  UCE action */.  
1c3a0 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
1c3b0 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
1c3c0 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d  xt){.    if( rp-
1c3d0 3e 63 6f 64 65 20 29 20 74 72 61 6e 73 6c 61 74  >code ) translat
1c3e0 65 5f 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29  e_code(lemp, rp)
1c3f0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c  ;.  }.  for(rp=l
1c400 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
1c410 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
1c420 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
1c430 32 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63  2;.    if( rp->c
1c440 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ode==0 ) continu
1c450 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e;.    fprintf(o
1c460 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20 25  ut,"      case %
1c470 64 3a 5c 6e 22 2c 72 70 2d 3e 69 6e 64 65 78 29  d:\n",rp->index)
1c480 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1c490 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74  for(rp2=rp->next
1c4a0 3b 20 72 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e  ; rp2; rp2=rp2->
1c4b0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1c4c0 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e   rp2->code==rp->
1c4d0 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  code ){.        
1c4e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1c4f0 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 72     case %d:\n",r
1c500 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65  p2->index); line
1c510 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 70  no++;.        rp
1c520 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20  2->code = 0;.   
1c530 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65     }.    }.    e
1c540 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c  mit_code(out,rp,
1c550 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
1c560 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1c570 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e          break;\n
1c580 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c590 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1c5a0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1c5b0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1c5c0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
1c5d0 69 63 68 20 65 78 65 63 75 74 65 73 20 69 66 20  ich executes if 
1c5e0 61 20 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f  a parse fails */
1c5f0 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1c600 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69  t,lemp,lemp->fai
1c610 6c 75 72 65 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75  lure,lemp->failu
1c620 72 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  reln,&lineno);. 
1c630 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1c640 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1c650 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1c660 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1c670 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 61   executes when a
1c680 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63   syntax error oc
1c690 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  curs */.  tplt_p
1c6a0 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
1c6b0 6d 70 2d 3e 65 72 72 6f 72 2c 6c 65 6d 70 2d 3e  mp->error,lemp->
1c6c0 65 72 72 6f 72 6c 6e 2c 26 6c 69 6e 65 6e 6f 29  errorln,&lineno)
1c6d0 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1c6e0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1c6f0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1c700 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
1c710 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
1c720 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 63 63  n the parser acc
1c730 65 70 74 73 20 69 74 73 20 69 6e 70 75 74 20 2a  epts its input *
1c740 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
1c750 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63  ut,lemp,lemp->ac
1c760 63 65 70 74 2c 6c 65 6d 70 2d 3e 61 63 63 65 70  cept,lemp->accep
1c770 74 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  tln,&lineno);.  
1c780 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1c790 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1c7a0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65  eno);..  /* Appe
1c7b0 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 20  nd any addition 
1c7c0 63 6f 64 65 20 74 68 65 20 75 73 65 72 20 64 65  code the user de
1c7d0 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  sires */.  tplt_
1c7e0 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
1c7f0 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c 6c  emp->extracode,l
1c800 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 6c 6e  emp->extracodeln
1c810 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63  ,&lineno);..  fc
1c820 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f  lose(in);.  fclo
1c830 73 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75 72  se(out);.  retur
1c840 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  n;.}../* Generat
1c850 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20  e a header file 
1c860 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
1c870 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61  /.void ReportHea
1c880 64 65 72 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  der(lemp).struct
1c890 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
1c8a0 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e    FILE *out, *in
1c8b0 3b 0a 20 20 63 68 61 72 20 2a 70 72 65 66 69 78  ;.  char *prefix
1c8c0 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
1c8d0 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20  NESIZE];.  char 
1c8e0 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45  pattern[LINESIZE
1c8f0 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  ];.  int i;..  i
1c900 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
1c910 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
1c920 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1c930 78 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20  x;.  else       
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
1c950 66 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d  fix = "";.  in =
1c960 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
1c970 22 2e 68 22 2c 22 72 62 22 29 3b 0a 20 20 69 66  ".h","rb");.  if
1c980 28 20 69 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28  ( in ){.    for(
1c990 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
1c9a0 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28  rminal && fgets(
1c9b0 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e  line,LINESIZE,in
1c9c0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ); i++){.      s
1c9d0 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c 22  printf(pattern,"
1c9e0 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
1c9f0 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
1ca00 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1ca10 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 69  name,i);.      i
1ca20 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70  f( strcmp(line,p
1ca30 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b 3b  attern) ) break;
1ca40 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73  .    }.    fclos
1ca50 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 69  e(in);.    if( i
1ca60 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  ==lemp->ntermina
1ca70 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  l ){.      /* No
1ca80 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 66   change in the f
1ca90 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65 77 72  ile.  Don't rewr
1caa0 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ite it. */.     
1cab0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1cac0 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f   }.  out = file_
1cad0 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22  open(lemp,".h","
1cae0 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 20  wb");.  if( out 
1caf0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
1cb00 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
1cb10 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  l; i++){.      f
1cb20 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1cb30 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c  ine %s%-30s %2d\
1cb40 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e  n",prefix,lemp->
1cb50 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
1cb60 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ,i);.    }.    f
1cb70 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20 0a 20 20  close(out);  .  
1cb80 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
1cb90 2a 20 52 65 64 75 63 65 20 74 68 65 20 73 69 7a  * Reduce the siz
1cba0 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20  e of the action 
1cbb0 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73 69  tables, if possi
1cbc0 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75  ble, by making u
1cbd0 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74  se.** of default
1cbe0 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  s..**.** In this
1cbf0 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b   version, we tak
1cc00 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71 75  e the most frequ
1cc10 65 6e 74 20 52 45 44 55 43 45 20 61 63 74 69 6f  ent REDUCE actio
1cc20 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74  n and make.** it
1cc30 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 45   the default.  E
1cc40 78 63 65 70 74 2c 20 74 68 65 72 65 20 69 73 20  xcept, there is 
1cc50 6e 6f 20 64 65 66 61 75 6c 74 20 69 66 20 74 68  no default if th
1cc60 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e  e wildcard token
1cc70 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73 69 62 6c  .** is a possibl
1cc80 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f  e look-ahead..*/
1cc90 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61  .void CompressTa
1cca0 62 6c 65 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  bles(lemp).struc
1ccb0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
1ccc0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
1ccd0 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *stp;.  struct a
1cce0 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 3b  ction *ap, *ap2;
1ccf0 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
1cd00 72 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73 74  rp, *rp2, *rbest
1cd10 3b 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e  ;.  int nbest, n
1cd20 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1cd30 20 75 73 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a   usesWildcard;..
1cd40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1cd50 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
1cd60 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1cd70 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1cd80 6e 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 72  nbest = 0;.    r
1cd90 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 75 73  best = 0;.    us
1cda0 65 73 57 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a  esWildcard = 0;.
1cdb0 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
1cdc0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1cdd0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1cde0 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54   ap->type==SHIFT
1cdf0 20 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70   && ap->sp==lemp
1ce00 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20  ->wildcard ){.  
1ce10 20 20 20 20 20 20 75 73 65 73 57 69 6c 64 63 61        usesWildca
1ce20 72 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rd = 1;.      }.
1ce30 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1ce40 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e  pe!=REDUCE ) con
1ce50 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20  tinue;.      rp 
1ce60 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20  = ap->x.rp;.    
1ce70 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73 74 20    if( rp==rbest 
1ce80 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ce90 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66    n = 1;.      f
1cea0 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b  or(ap2=ap->next;
1ceb0 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e   ap2; ap2=ap2->n
1cec0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
1ced0 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52 45 44  ( ap2->type!=RED
1cee0 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UCE ) continue;.
1cef0 20 20 20 20 20 20 20 20 72 70 32 20 3d 20 61 70          rp2 = ap
1cf00 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 20  2->x.rp;.       
1cf10 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73 74 20   if( rp2==rbest 
1cf20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1cf30 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 70 20      if( rp2==rp 
1cf40 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ) n++;.      }. 
1cf50 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65 73 74       if( n>nbest
1cf60 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62 65 73   ){.        nbes
1cf70 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 72  t = n;.        r
1cf80 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20 20 20  best = rp;.     
1cf90 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f   }.    }. .    /
1cfa0 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20  * Do not make a 
1cfb0 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 6e  default if the n
1cfc0 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20 74  umber of rules t
1cfd0 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  o default.    **
1cfe0 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73 74   is not at least
1cff0 20 31 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c   1 or if the wil
1d000 64 63 61 72 64 20 74 6f 6b 65 6e 20 69 73 20 61  dcard token is a
1d010 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a   possible.    **
1d020 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20   lookahead..    
1d030 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62 65 73 74  */.    if( nbest
1d040 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c 64 63 61  <1 || usesWildca
1d050 72 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  rd ) continue;..
1d060 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20  .    /* Combine 
1d070 6d 61 74 63 68 69 6e 67 20 52 45 44 55 43 45 20  matching REDUCE 
1d080 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73  actions into a s
1d090 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f  ingle default */
1d0a0 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
1d0b0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1d0c0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1d0d0 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
1d0e0 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72  E && ap->x.rp==r
1d0f0 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  best ) break;.  
1d100 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1d110 61 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70  ap );.    ap->sp
1d120 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b   = Symbol_new("{
1d130 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20  default}");.    
1d140 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  for(ap=ap->next;
1d150 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1d160 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
1d170 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
1d180 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74   ap->x.rp==rbest
1d190 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f   ) ap->type = NO
1d1a0 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  T_USED;.    }.  
1d1b0 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69    stp->ap = Acti
1d1c0 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29  on_sort(stp->ap)
1d1d0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
1d1e0 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74  Compare two stat
1d1f0 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70  es for sorting p
1d200 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 73 6d  urposes.  The sm
1d210 61 6c 6c 65 72 20 73 74 61 74 65 20 69 73 20 74  aller state is t
1d220 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74  he.** one with t
1d230 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d  he most non-term
1d240 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49  inal actions.  I
1d250 66 20 74 68 65 79 20 68 61 76 65 20 74 68 65 20  f they have the 
1d260 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  same number.** o
1d270 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61  f non-terminal a
1d280 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65  ctions, then the
1d290 20 73 6d 61 6c 6c 65 72 20 69 73 20 74 68 65 20   smaller is the 
1d2a0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73  one with the mos
1d2b0 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f  t.** token actio
1d2c0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
1d2d0 74 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d  t stateResortCom
1d2e0 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  pare(const void 
1d2f0 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *a, const void *
1d300 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  b){.  const stru
1d310 63 74 20 73 74 61 74 65 20 2a 70 41 20 3d 20 2a  ct state *pA = *
1d320 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74  (const struct st
1d330 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74  ate**)a;.  const
1d340 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70   struct state *p
1d350 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75  B = *(const stru
1d360 63 74 20 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20  ct state**)b;.  
1d370 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42  int n;..  n = pB
1d380 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e  ->nNtAct - pA->n
1d390 4e 74 41 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d  NtAct;.  if( n==
1d3a0 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d  0 ){.    n = pB-
1d3b0 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e  >nTknAct - pA->n
1d3c0 54 6b 6e 41 63 74 3b 0a 20 20 7d 0a 20 20 72 65  TknAct;.  }.  re
1d3d0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
1d3e0 2a 20 52 65 6e 75 6d 62 65 72 20 61 6e 64 20 72  * Renumber and r
1d3f0 65 73 6f 72 74 20 73 74 61 74 65 73 20 73 6f 20  esort states so 
1d400 74 68 61 74 20 73 74 61 74 65 73 20 77 69 74 68  that states with
1d410 20 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a 2a   fewer choices.*
1d420 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  * occur at the e
1d430 6e 64 2e 20 20 45 78 63 65 70 74 2c 20 6b 65 65  nd.  Except, kee
1d440 70 20 73 74 61 74 65 20 30 20 61 73 20 74 68 65  p state 0 as the
1d450 20 66 69 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f   first state..*/
1d460 0a 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74  .void ResortStat
1d470 65 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  es(lemp).struct 
1d480 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
1d490 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1d4a0 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
1d4b0 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
1d4c0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
1d4d0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
1d4e0 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
1d4f0 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
1d500 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 20     stp->nTknAct 
1d510 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 20 3d 20  = stp->nNtAct = 
1d520 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69 44 66 6c  0;.    stp->iDfl
1d530 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  t = lemp->nstate
1d540 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a   + lemp->nrule;.
1d550 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73      stp->iTknOfs
1d560 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20  t = NO_OFFSET;. 
1d570 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20     stp->iNtOfst 
1d580 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20  = NO_OFFSET;.   
1d590 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1d5a0 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1d5b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6d  ){.      if( com
1d5c0 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
1d5d0 2c 61 70 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ,ap)>=0 ){.     
1d5e0 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
1d5f0 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  ndex<lemp->nterm
1d600 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  inal ){.        
1d610 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b    stp->nTknAct++
1d620 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1d630 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1d640 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  x<lemp->nsymbol 
1d650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70  ){.          stp
1d660 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20 20 20  ->nNtAct++;.    
1d670 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d680 20 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 20       stp->iDflt 
1d690 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  = compute_action
1d6a0 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20  (lemp, ap);.    
1d6b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1d6c0 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f 72 74 28    }.  }.  qsort(
1d6d0 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 31 5d  &lemp->sorted[1]
1d6e0 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2d 31  , lemp->nstate-1
1d6f0 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73  , sizeof(lemp->s
1d700 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20 20 20 20  orted[0]),.     
1d710 20 20 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f     stateResortCo
1d720 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72 28 69 3d  mpare);.  for(i=
1d730 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
1d740 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d  e; i++){.    lem
1d750 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 73 74  p->sorted[i]->st
1d760 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a  atenum = i;.  }.
1d770 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
1d780 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
1d790 66 69 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a  file "set.c" ***
1d7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d7c0 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e  */./*.** Set man
1d7d0 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ipulation routin
1d7e0 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  es for the LEMON
1d7f0 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
1d800 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  r..*/..static in
1d810 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20  t size = 0;../* 
1d820 53 65 74 20 74 68 65 20 73 65 74 20 73 69 7a 65  Set the set size
1d830 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a 65   */.void SetSize
1d840 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73  (n).int n;.{.  s
1d850 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a  ize = n+1;.}../*
1d860 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1d870 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74  set */.char *Set
1d880 4e 65 77 28 29 7b 0a 20 20 63 68 61 72 20 2a 73  New(){.  char *s
1d890 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 20 3d  ;.  int i;.  s =
1d8a0 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20   (char*)malloc( 
1d8b0 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 73 3d  size );.  if( s=
1d8c0 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  =0 ){.    extern
1d8d0 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72   void memory_err
1d8e0 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  or();.    memory
1d8f0 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20  _error();.  }.  
1d900 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1d910 20 69 2b 2b 29 20 73 5b 69 5d 20 3d 20 30 3b 0a   i++) s[i] = 0;.
1d920 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f    return s;.}../
1d930 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73  * Deallocate a s
1d940 65 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72  et */.void SetFr
1d950 65 65 28 73 29 0a 63 68 61 72 20 2a 73 3b 0a 7b  ee(s).char *s;.{
1d960 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f  .  free(s);.}../
1d970 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
1d980 65 6e 74 20 74 6f 20 74 68 65 20 73 65 74 2e 20  ent to the set. 
1d990 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1d9a0 74 68 65 20 65 6c 65 6d 65 6e 74 20 77 61 73 20  the element was 
1d9b0 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c  added.** and FAL
1d9c0 53 45 20 69 66 20 69 74 20 77 61 73 20 61 6c 72  SE if it was alr
1d9d0 65 61 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69  eady there. */.i
1d9e0 6e 74 20 53 65 74 41 64 64 28 73 2c 65 29 0a 63  nt SetAdd(s,e).c
1d9f0 68 61 72 20 2a 73 3b 0a 69 6e 74 20 65 3b 0a 7b  har *s;.int e;.{
1da00 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20 72 76 20  .  int rv;.  rv 
1da10 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d  = s[e];.  s[e] =
1da20 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76   1;.  return !rv
1da30 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72  ;.}../* Add ever
1da40 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20  y element of s2 
1da50 74 6f 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54  to s1.  Return T
1da60 52 55 45 20 69 66 20 73 31 20 63 68 61 6e 67 65  RUE if s1 change
1da70 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69  s. */.int SetUni
1da80 6f 6e 28 73 31 2c 73 32 29 0a 63 68 61 72 20 2a  on(s1,s2).char *
1da90 73 31 3b 0a 63 68 61 72 20 2a 73 32 3b 0a 7b 0a  s1;.char *s2;.{.
1daa0 20 20 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73    int i, progres
1dab0 73 3b 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20  s;.  progress = 
1dac0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
1dad0 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  size; i++){.    
1dae0 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63  if( s2[i]==0 ) c
1daf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1db00 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20   s1[i]==0 ){.   
1db10 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
1db20 0a 20 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31  .      s1[i] = 1
1db30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1db40 74 75 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d  turn progress;.}
1db50 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1db60 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
1db70 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22  e file "table.c"
1db80 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1db90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
1dba0 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e  *.** All code in
1dbb0 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62   this file has b
1dbc0 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  een automaticall
1dbd0 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66  y generated.** f
1dbe0 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74  rom a specificat
1dbf0 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  ion in the file.
1dc00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1dc10 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20  "table.q".** by 
1dc20 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20  the associative 
1dc30 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64  array code build
1dc40 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67  ing program "aag
1dc50 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65  en"..** Do not e
1dc60 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20  dit this file!  
1dc70 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68  Instead, edit th
1dc80 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a  e specification.
1dc90 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ** file, then re
1dca0 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a  run aagen..*/./*
1dcb0 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f  .** Code for pro
1dcc0 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69  cessing tables i
1dcd0 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
1dce0 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
1dcf0 0a 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74  ..PRIVATE int st
1dd00 72 68 61 73 68 28 78 29 0a 63 68 61 72 20 2a 78  rhash(x).char *x
1dd10 3b 0a 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b  ;.{.  int h = 0;
1dd20 0a 20 20 77 68 69 6c 65 28 20 2a 78 29 20 68 20  .  while( *x) h 
1dd30 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b  = h*13 + *(x++);
1dd40 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a  .  return h;.}..
1dd50 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74  /* Works like st
1dd60 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20  rdup, sort of.  
1dd70 53 61 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e  Save a string in
1dd80 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79   malloced memory
1dd90 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74  , but.** keep st
1dda0 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65  rings in a table
1ddb0 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d   so that the sam
1ddc0 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20  e string is not 
1ddd0 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20  in more.** than 
1dde0 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 68  one place..*/.ch
1ddf0 61 72 20 2a 53 74 72 73 61 66 65 28 79 29 0a 63  ar *Strsafe(y).c
1de00 68 61 72 20 2a 79 3b 0a 7b 0a 20 20 63 68 61 72  har *y;.{.  char
1de10 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30   *z;..  if( y==0
1de20 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
1de30 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e 64 28   = Strsafe_find(
1de40 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26  y);.  if( z==0 &
1de50 26 20 28 7a 3d 6d 61 6c 6c 6f 63 28 20 73 74 72  & (z=malloc( str
1de60 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d 30 20 29  len(y)+1 ))!=0 )
1de70 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a 2c 79  {.    strcpy(z,y
1de80 29 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f 69  );.    Strsafe_i
1de90 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20  nsert(z);.  }.  
1dea0 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a  MemoryCheck(z);.
1deb0 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f    return z;.}../
1dec0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
1ded0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1dee0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1def0 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
1df00 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1df10 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a   of type "x1"..*
1df20 2f 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b 0a  /.struct s_x1 {.
1df30 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
1df40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1df50 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1df60 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df80 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
1df90 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
1dfa0 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
1dfb0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
1dfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfd0 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
1dfe0 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e000 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
1e010 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
1e020 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1e030 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  1node *tbl;  /* 
1e040 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
1e050 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
1e060 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x1node **ht; 
1e070 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
1e080 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
1e090 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1e0a0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1e0b0 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
1e0c0 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
1e0d0 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
1e0e0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
1e0f0 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a  f type "x1"..*/.
1e100 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
1e110 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63 68 61 72  _x1node {.  char
1e120 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
1e130 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e140 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74  data */.  struct
1e150 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b   s_x1node *next;
1e160 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
1e170 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68   with the same h
1e180 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ash */.  struct 
1e190 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b  s_x1node **from;
1e1a0 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69    /* Previous li
1e1b0 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a  nk */.} x1node;.
1e1c0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c  ./* There is onl
1e1d0 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  y one instance o
1e1e0 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69  f the array, whi
1e1f0 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch is the follow
1e200 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ing */.static st
1e210 72 75 63 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a  ruct s_x1 *x1a;.
1e220 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
1e230 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ew associative a
1e240 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72  rray */.void Str
1e250 73 61 66 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69  safe_init(){.  i
1e260 66 28 20 78 31 61 20 29 20 72 65 74 75 72 6e 3b  f( x1a ) return;
1e270 0a 20 20 78 31 61 20 3d 20 28 73 74 72 75 63 74  .  x1a = (struct
1e280 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x1*)malloc( s
1e290 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
1e2a0 31 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61 20  1) );.  if( x1a 
1e2b0 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a 65  ){.    x1a->size
1e2c0 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31 61   = 1024;.    x1a
1e2d0 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
1e2e0 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e   x1a->tbl = (x1n
1e2f0 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20  ode*)malloc( .  
1e300 20 20 20 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f      (sizeof(x1no
1e310 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e  de) + sizeof(x1n
1e320 6f 64 65 2a 29 29 2a 31 30 32 34 20 29 3b 0a 20  ode*))*1024 );. 
1e330 20 20 20 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d     if( x1a->tbl=
1e340 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
1e350 28 78 31 61 29 3b 0a 20 20 20 20 20 20 78 31 61  (x1a);.      x1a
1e360 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1e370 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1e380 20 20 20 20 78 31 61 2d 3e 68 74 20 3d 20 28 78      x1a->ht = (x
1e390 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74  1node**)&(x1a->t
1e3a0 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20 20  bl[1024]);.     
1e3b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32 34   for(i=0; i<1024
1e3c0 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69  ; i++) x1a->ht[i
1e3d0 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
1e3e0 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e  .}./* Insert a n
1e3f0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
1e400 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  he array.  Retur
1e410 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73  n TRUE if succes
1e420 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64  sful..** Prior d
1e430 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d  ata with the sam
1e440 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65  e key is NOT ove
1e450 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20  rwritten */.int 
1e460 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 64  Strsafe_insert(d
1e470 61 74 61 29 0a 63 68 61 72 20 2a 64 61 74 61 3b  ata).char *data;
1e480 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b  .{.  x1node *np;
1e490 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
1e4a0 70 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d  ph;..  if( x1a==
1e4b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1e4c0 70 68 20 3d 20 73 74 72 68 61 73 68 28 64 61 74  ph = strhash(dat
1e4d0 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28  a);.  h = ph & (
1e4e0 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x1a->size-1);.  
1e4f0 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  np = x1a->ht[h];
1e500 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
1e510 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
1e520 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30  p->data,data)==0
1e530 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
1e540 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
1e550 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
1e560 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
1e570 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
1e580 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
1e590 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
1e5a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1e5b0 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
1e5c0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
1e5d0 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x1a->count>=x
1e5e0 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  1a->size ){.    
1e5f0 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
1e600 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
1e610 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
1e620 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72   i,size;.    str
1e630 75 63 74 20 73 5f 78 31 20 61 72 72 61 79 3b 0a  uct s_x1 array;.
1e640 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d      array.size =
1e650 20 73 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a   size = x1a->siz
1e660 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
1e670 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e  ount = x1a->coun
1e680 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
1e690 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x1node*)mall
1e6a0 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f  oc(.      (sizeo
1e6b0 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x1node) + size
1e6c0 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 73 69 7a  of(x1node*))*siz
1e6d0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  e );.    if( arr
1e6e0 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
1e6f0 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
1e700 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
1e710 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
1e720 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a  y.ht = (x1node**
1e730 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a  )&(array.tbl[siz
1e740 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
1e750 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
1e760 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
1e770 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
1e780 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  1a->count; i++){
1e790 0a 20 20 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f  .      x1node *o
1e7a0 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
1e7b0 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31      oldnp = &(x1
1e7c0 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
1e7d0 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c    h = strhash(ol
1e7e0 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69  dnp->data) & (si
1e7f0 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
1e800 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
1e810 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
1e820 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
1e830 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
1e840 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
1e850 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
1e860 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
1e870 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
1e880 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61  data = oldnp->da
1e890 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ta;.      newnp-
1e8a0 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e  >from = &(array.
1e8b0 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72  ht[h]);.      ar
1e8c0 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e  ray.ht[h] = newn
1e8d0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65  p;.    }.    fre
1e8e0 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20  e(x1a->tbl);.   
1e8f0 20 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20   *x1a = array;. 
1e900 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74   }.  /* Insert t
1e910 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20  he new data */. 
1e920 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e   h = ph & (x1a->
1e930 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
1e940 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e  &(x1a->tbl[x1a->
1e950 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d  count++]);.  np-
1e960 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
1e970 69 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29  if( x1a->ht[h] )
1e980 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x1a->ht[h]->fro
1e990 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
1e9a0 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31  .  np->next = x1
1e9b0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d  a->ht[h];.  x1a-
1e9c0 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
1e9d0 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d  p->from = &(x1a-
1e9e0 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
1e9f0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
1ea00 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
1ea10 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
1ea20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
1ea30 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
1ea40 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
1ea50 2f 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  /.char *Strsafe_
1ea60 66 69 6e 64 28 6b 65 79 29 0a 63 68 61 72 20 2a  find(key).char *
1ea70 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key;.{.  int h;.
1ea80 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x1node *np;.. 
1ea90 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65   if( x1a==0 ) re
1eaa0 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74  turn 0;.  h = st
1eab0 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 31  rhash(key) & (x1
1eac0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1ead0 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x1a->ht[h];. 
1eae0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
1eaf0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
1eb00 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20  >data,key)==0 ) 
1eb10 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
1eb20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
1eb30 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
1eb40 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
1eb50 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1eb60 20 74 6f 20 74 68 65 20 28 74 65 72 6d 69 6e 61   to the (termina
1eb70 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  l or nonterminal
1eb80 29 20 73 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a  ) symbol "x"..**
1eb90 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79   Create a new sy
1eba0 6d 62 6f 6c 20 69 66 20 74 68 69 73 20 69 73 20  mbol if this is 
1ebb0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 22  the first time "
1ebc0 78 22 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e  x" has been seen
1ebd0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  ..*/.struct symb
1ebe0 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  ol *Symbol_new(x
1ebf0 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 73  ).char *x;.{.  s
1ec00 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1ec10 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c  ;..  sp = Symbol
1ec20 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20  _find(x);.  if( 
1ec30 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20  sp==0 ){.    sp 
1ec40 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
1ec50 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   *)malloc( sizeo
1ec60 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 29  f(struct symbol)
1ec70 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68   );.    MemoryCh
1ec80 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70 2d  eck(sp);.    sp-
1ec90 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65 28  >name = Strsafe(
1eca0 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70 65  x);.    sp->type
1ecb0 20 3d 20 69 73 75 70 70 65 72 28 2a 78 29 20 3f   = isupper(*x) ?
1ecc0 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54   TERMINAL : NONT
1ecd0 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d  ERMINAL;.    sp-
1ece0 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73  >rule = 0;.    s
1ecf0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
1ed00 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20  .    sp->prec = 
1ed10 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f  -1;.    sp->asso
1ed20 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d  c = UNK;.    sp-
1ed30 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a 20  >firstset = 0;. 
1ed40 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20     sp->lambda = 
1ed50 42 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d  B_FALSE;.    sp-
1ed60 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b  >destructor = 0;
1ed70 0a 20 20 20 20 73 70 2d 3e 64 61 74 61 74 79 70  .    sp->datatyp
1ed80 65 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f  e = 0;.    Symbo
1ed90 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e  l_insert(sp,sp->
1eda0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  name);.  }.  ret
1edb0 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f  urn sp;.}../* Co
1edc0 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c  mpare two symbol
1edd0 73 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 70 75  s for working pu
1ede0 72 70 6f 73 65 73 0a 2a 2a 0a 2a 2a 20 53 79 6d  rposes.**.** Sym
1edf0 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20  bols that begin 
1ee00 77 69 74 68 20 75 70 70 65 72 20 63 61 73 65 20  with upper case 
1ee10 6c 65 74 74 65 72 73 20 28 74 65 72 6d 69 6e 61  letters (termina
1ee20 6c 73 20 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a  ls or tokens).**
1ee30 20 6d 75 73 74 20 73 6f 72 74 20 62 65 66 6f 72   must sort befor
1ee40 65 20 73 79 6d 62 6f 6c 73 20 74 68 61 74 20 62  e symbols that b
1ee50 65 67 69 6e 20 77 69 74 68 20 6c 6f 77 65 72 20  egin with lower 
1ee60 63 61 73 65 20 6c 65 74 74 65 72 73 0a 2a 2a 20  case letters.** 
1ee70 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 29 2e  (non-terminals).
1ee80 20 20 4f 74 68 65 72 20 74 68 61 6e 20 74 68 61    Other than tha
1ee90 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  t, the order doe
1eea0 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a 2a  s not matter..**
1eeb0 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78 70 65  .** We find expe
1eec0 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74 20  rimentally that 
1eed0 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79 6d 62  leaving the symb
1eee0 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f 72 69  ols in their ori
1eef0 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20 28  ginal.** order (
1ef00 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20 61  the order they a
1ef10 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20 67  ppeared in the g
1ef20 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67 69 76  rammar file) giv
1ef30 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65  es the.** smalle
1ef40 73 74 20 70 61 72 73 65 72 20 74 61 62 6c 65 73  st parser tables
1ef50 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69   in SQLite..*/.i
1ef60 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 73 74  nt Symbolcmpp(st
1ef70 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 2c  ruct symbol **a,
1ef80 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1ef90 2a 62 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20  *b){.  int i1 = 
1efa0 28 2a 2a 61 29 2e 69 6e 64 65 78 20 2b 20 31 30  (**a).index + 10
1efb0 30 30 30 30 30 30 2a 28 28 2a 2a 61 29 2e 6e 61  000000*((**a).na
1efc0 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 69 6e  me[0]>'Z');.  in
1efd0 74 20 69 32 20 3d 20 28 2a 2a 62 29 2e 69 6e 64  t i2 = (**b).ind
1efe0 65 78 20 2b 20 31 30 30 30 30 30 30 30 2a 28 28  ex + 10000000*((
1eff0 2a 2a 62 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27  **b).name[0]>'Z'
1f000 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 31 2d 69  );.  return i1-i
1f010 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  2;.}../* There i
1f020 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1f030 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1f040 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
1f050 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
1f060 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
1f070 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x2"..*/.struct 
1f080 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x2 {.  int siz
1f090 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1f0a0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1f0b0 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
1f0c0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0e0 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
1f0f0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
1f100 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
1f110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f120 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
1f130 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
1f140 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
1f150 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f160 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
1f170 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
1f180 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62  uct s_x2node *tb
1f190 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
1f1a0 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
1f1b0 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
1f1c0 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
1f1d0 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
1f1e0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
1f1f0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1f200 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1f210 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
1f220 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
1f230 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
1f240 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
1f250 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  2"..*/.typedef s
1f260 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b  truct s_x2node {
1f270 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1f280 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
1f290 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f2a0 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
1f2b0 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  key;            
1f2c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
1f2d0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  y */.  struct s_
1f2e0 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x2node *next;   
1f2f0 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
1f300 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
1f310 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1f320 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  2node **from;  /
1f330 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
1f340 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x2node;../*
1f350 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
1f360 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1f370 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
1f380 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
1f390 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
1f3a0 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a  t s_x2 *x2a;../*
1f3b0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1f3c0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1f3d0 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c  y */.void Symbol
1f3e0 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
1f3f0 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  2a ) return;.  x
1f400 32 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  2a = (struct s_x
1f410 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  2*)malloc( sizeo
1f420 66 28 73 74 72 75 63 74 20 73 5f 78 32 29 20 29  f(struct s_x2) )
1f430 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20  ;.  if( x2a ){. 
1f440 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31     x2a->size = 1
1f450 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75  28;.    x2a->cou
1f460 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d  nt = 0;.    x2a-
1f470 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29  >tbl = (x2node*)
1f480 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
1f490 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
1f4a0 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
1f4b0 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28  )*128 );.    if(
1f4c0 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x2a->tbl==0 ){.
1f4d0 20 20 20 20 20 20 66 72 65 65 28 78 32 61 29 3b        free(x2a);
1f4e0 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30 3b 0a  .      x2a = 0;.
1f4f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f500 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 32   int i;.      x2
1f510 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a  a->ht = (x2node*
1f520 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38  *)&(x2a->tbl[128
1f530 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ]);.      for(i=
1f540 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78  0; i<128; i++) x
1f550 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  2a->ht[i] = 0;. 
1f560 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
1f570 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
1f580 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
1f590 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1f5a0 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
1f5b0 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
1f5c0 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
1f5d0 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
1f5e0 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69   */.int Symbol_i
1f5f0 6e 73 65 72 74 28 64 61 74 61 2c 6b 65 79 29 0a  nsert(data,key).
1f600 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
1f610 61 74 61 3b 0a 63 68 61 72 20 2a 6b 65 79 3b 0a  ata;.char *key;.
1f620 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x2node *np;.
1f630 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70    int h;.  int p
1f640 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  h;..  if( x2a==0
1f650 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1f660 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
1f670 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  ;.  h = ph & (x2
1f680 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1f690 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
1f6a0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
1f6b0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
1f6c0 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a  >key,key)==0 ){.
1f6d0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
1f6e0 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
1f6f0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
1f700 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
1f710 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
1f720 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
1f730 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
1f740 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1f750 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
1f760 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
1f770 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e  2a->count>=x2a->
1f780 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
1f790 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
1f7a0 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
1f7b0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73  r */.    int i,s
1f7c0 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ize;.    struct 
1f7d0 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20 20  s_x2 array;.    
1f7e0 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a  array.size = siz
1f7f0 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b  e = x2a->size*2;
1f800 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
1f810 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x2a->count;. 
1f820 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
1f830 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a  x2node*)malloc(.
1f840 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32        (sizeof(x2
1f850 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
1f860 32 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b  2node*))*size );
1f870 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
1f880 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
1f890 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
1f8a0 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
1f8b0 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
1f8c0 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61   = (x2node**)&(a
1f8d0 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b  rray.tbl[size]);
1f8e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1f8f0 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
1f900 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
1f910 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e  for(i=0; i<x2a->
1f920 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
1f930 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x2node *oldnp
1f940 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
1f950 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74  oldnp = &(x2a->t
1f960 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
1f970 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d  = strhash(oldnp-
1f980 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29  >key) & (size-1)
1f990 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
1f9a0 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
1f9b0 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
1f9c0 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
1f9d0 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
1f9e0 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
1f9f0 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
1fa00 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
1fa10 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d      newnp->key =
1fa20 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20   oldnp->key;.   
1fa30 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
1fa40 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
1fa50 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
1fa60 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
1fa70 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
1fa80 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
1fa90 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61 2d   }.    free(x2a-
1faa0 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20  >tbl);.    *x2a 
1fab0 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
1fac0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
1fad0 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
1fae0 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  h & (x2a->size-1
1faf0 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61 2d  );.  np = &(x2a-
1fb00 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x2a->count+
1fb10 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d  +]);.  np->key =
1fb20 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61   key;.  np->data
1fb30 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
1fb40 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d  2a->ht[h] ) x2a-
1fb50 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
1fb60 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
1fb70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68 74  ->next = x2a->ht
1fb80 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68  [h];.  x2a->ht[h
1fb90 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
1fba0 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68  om = &(x2a->ht[h
1fbb0 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
1fbc0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
1fbd0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
1fbe0 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
1fbf0 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
1fc00 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
1fc10 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
1fc20 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
1fc30 6f 6c 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68 61  ol_find(key).cha
1fc40 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20  r *key;.{.  int 
1fc50 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b  h;.  x2node *np;
1fc60 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ..  if( x2a==0 )
1fc70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
1fc80 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20   strhash(key) & 
1fc90 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x2a->size-1);. 
1fca0 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d   np = x2a->ht[h]
1fcb0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1fcc0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1fcd0 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
1fce0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20  ) break;.    np 
1fcf0 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
1fd00 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70    return np ? np
1fd10 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->data : 0;.}../
1fd20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d 74  * Return the n-t
1fd30 68 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20  h data.  Return 
1fd40 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75 74  NULL if n is out
1fd50 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74   of range. */.st
1fd60 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
1fd70 62 6f 6c 5f 4e 74 68 28 6e 29 0a 69 6e 74 20 6e  bol_Nth(n).int n
1fd80 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ;.{.  struct sym
1fd90 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66 28  bol *data;.  if(
1fda0 20 78 32 61 20 26 26 20 6e 3e 30 20 26 26 20 6e   x2a && n>0 && n
1fdb0 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a  <=x2a->count ){.
1fdc0 20 20 20 20 64 61 74 61 20 3d 20 78 32 61 2d 3e      data = x2a->
1fdd0 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20  tbl[n-1].data;. 
1fde0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61   }else{.    data
1fdf0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1fe00 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52  rn data;.}../* R
1fe10 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1fe20 66 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 69  f the array */.i
1fe30 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28  nt Symbol_count(
1fe40 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78 32 61  ).{.  return x2a
1fe50 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20   ? x2a->count : 
1fe60 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
1fe70 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
1fe80 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61  ters to all data
1fe90 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1fea0 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f  * The array is o
1feb0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
1fec0 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  loc.  Return NUL
1fed0 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  L if memory allo
1fee0 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65  cation.** proble
1fef0 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72  ms, or if the ar
1ff00 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ray is empty. */
1ff10 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
1ff20 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28  *Symbol_arrayof(
1ff30 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ).{.  struct sym
1ff40 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69  bol **array;.  i
1ff50 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28  nt i,size;.  if(
1ff60 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
1ff70 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 32 61   0;.  size = x2a
1ff80 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79  ->count;.  array
1ff90 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
1ffa0 6c 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  l **)malloc( siz
1ffb0 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
1ffc0 6c 20 2a 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69  l *)*size );.  i
1ffd0 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20  f( array ){.    
1ffe0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1fff0 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d   i++) array[i] =
20000 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74   x2a->tbl[i].dat
20010 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  a;.  }.  return 
20020 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  array;.}../* Com
20030 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75  pare two configu
20040 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43  rations */.int C
20050 6f 6e 66 69 67 63 6d 70 28 61 2c 62 29 0a 73 74  onfigcmp(a,b).st
20060 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a  ruct config *a;.
20070 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
20080 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78  ;.{.  int x;.  x
20090 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20   = a->rp->index 
200a0 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a  - b->rp->index;.
200b0 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d    if( x==0 ) x =
200c0 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74   a->dot - b->dot
200d0 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a  ;.  return x;.}.
200e0 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
200f0 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54  states */.PRIVAT
20100 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28 61  E int statecmp(a
20110 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ,b).struct confi
20120 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e  g *a;.struct con
20130 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20  fig *b;.{.  int 
20140 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20  rc;.  for(rc=0; 
20150 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62 3b  rc==0 && a && b;
20160 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e    a=a->bp, b=b->
20170 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d  bp){.    rc = a-
20180 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e  >rp->index - b->
20190 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69  rp->index;.    i
201a0 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
201b0 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b  a->dot - b->dot;
201c0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
201d0 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29 20   ){.    if( a ) 
201e0 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  rc = 1;.    if( 
201f0 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d  b ) rc = -1;.  }
20200 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20210 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74 65  ./* Hash a state
20220 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20   */.PRIVATE int 
20230 73 74 61 74 65 68 61 73 68 28 61 29 0a 73 74 72  statehash(a).str
20240 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b  uct config *a;.{
20250 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68  .  int h=0;.  wh
20260 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20  ile( a ){.    h 
20270 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d  = h*571 + a->rp-
20280 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64  >index*37 + a->d
20290 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62  ot;.    a = a->b
202a0 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
202b0 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  h;.}../* Allocat
202c0 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73 74  e a new state st
202d0 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63  ructure */.struc
202e0 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
202f0 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  ew().{.  struct 
20300 73 74 61 74 65 20 2a 6e 65 77 3b 0a 20 20 6e 65  state *new;.  ne
20310 77 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74  w = (struct stat
20320 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  e *)malloc( size
20330 6f 66 28 73 74 72 75 63 74 20 73 74 61 74 65 29  of(struct state)
20340 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63   );.  MemoryChec
20350 6b 28 6e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e  k(new);.  return
20360 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72   new;.}../* Ther
20370 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
20380 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
20390 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
203a0 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
203b0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
203c0 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x3"..*/.stru
203d0 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20  ct s_x3 {.  int 
203e0 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
203f0 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
20400 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
20410 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20430 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
20440 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
20450 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
20460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
20480 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
20490 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
204a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
204b0 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
204c0 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
204d0 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
204e0 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
204f0 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
20500 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
20510 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
20520 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
20530 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
20540 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
20550 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
20560 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
20570 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
20580 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
20590 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
205a0 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x3"..*/.typede
205b0 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64  f struct s_x3nod
205c0 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  e {.  struct sta
205d0 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  te *data;       
205e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
205f0 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
20600 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20  ct config *key; 
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20620 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
20630 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
20640 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
20650 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
20660 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
20670 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
20680 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
20690 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
206a0 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x3node;../* Ther
206b0 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
206c0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
206d0 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
206e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
206f0 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
20700 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  3 *x3a;../* Allo
20710 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
20720 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
20730 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28  void State_init(
20740 29 7b 0a 20 20 69 66 28 20 78 33 61 20 29 20 72  ){.  if( x3a ) r
20750 65 74 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28  eturn;.  x3a = (
20760 73 74 72 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c  struct s_x3*)mal
20770 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
20780 63 74 20 73 5f 78 33 29 20 29 3b 0a 20 20 69 66  ct s_x3) );.  if
20790 28 20 78 33 61 20 29 7b 0a 20 20 20 20 78 33 61  ( x3a ){.    x3a
207a0 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20  ->size = 128;.  
207b0 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x3a->count = 0
207c0 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d  ;.    x3a->tbl =
207d0 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x3node*)malloc
207e0 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  ( .      (sizeof
207f0 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x3node) + sizeo
20800 66 28 78 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20  f(x3node*))*128 
20810 29 3b 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e  );.    if( x3a->
20820 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
20830 66 72 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20  free(x3a);.     
20840 20 78 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x3a = 0;.    }e
20850 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
20860 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20  ;.      x3a->ht 
20870 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33  = (x3node**)&(x3
20880 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20  a->tbl[128]);.  
20890 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
208a0 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74  28; i++) x3a->ht
208b0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
208c0 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
208d0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
208e0 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
208f0 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
20900 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
20910 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
20920 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
20930 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
20940 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 64  t State_insert(d
20950 61 74 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20  ata,key).struct 
20960 73 74 61 74 65 20 2a 64 61 74 61 3b 0a 73 74 72  state *data;.str
20970 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b  uct config *key;
20980 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b  .{.  x3node *np;
20990 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
209a0 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d  ph;..  if( x3a==
209b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
209c0 70 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b  ph = statehash(k
209d0 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ey);.  h = ph & 
209e0 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
209f0 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d   np = x3a->ht[h]
20a00 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
20a10 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d  .    if( statecm
20a20 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
20a30 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
20a40 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
20a50 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
20a60 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
20a70 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
20a80 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
20a90 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
20aa0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
20ab0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
20ac0 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
20ad0 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x3a->count>=
20ae0 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x3a->size ){.   
20af0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
20b00 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
20b10 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
20b20 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74  t i,size;.    st
20b30 72 75 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b  ruct s_x3 array;
20b40 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
20b50 3d 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69  = size = x3a->si
20b60 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
20b70 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75  count = x3a->cou
20b80 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
20b90 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c  l = (x3node*)mal
20ba0 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65  loc(.      (size
20bb0 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
20bc0 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 73 69  eof(x3node*))*si
20bd0 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72  ze );.    if( ar
20be0 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
20bf0 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
20c00 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
20c10 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
20c20 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a  ay.ht = (x3node*
20c30 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
20c40 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
20c50 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
20c60 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
20c70 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20c80 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x3a->count; i++)
20c90 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a  {.      x3node *
20ca0 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
20cb0 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
20cc0 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  3a->tbl[i]);.   
20cd0 20 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68     h = statehash
20ce0 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28  (oldnp->key) & (
20cf0 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  size-1);.      n
20d00 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
20d10 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
20d20 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
20d30 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
20d40 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
20d50 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
20d60 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
20d70 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
20d80 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b  ->key = oldnp->k
20d90 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ey;.      newnp-
20da0 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
20db0 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
20dc0 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
20dd0 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
20de0 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
20df0 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
20e00 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x3a->tbl);.  
20e10 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79 3b 0a    *x3a = array;.
20e20 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
20e30 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
20e40 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d    h = ph & (x3a-
20e50 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
20e60 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d   &(x3a->tbl[x3a-
20e70 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
20e80 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e  ->key = key;.  n
20e90 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
20ea0 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d    if( x3a->ht[h]
20eb0 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x3a->ht[h]->f
20ec0 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
20ed0 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
20ee0 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33  x3a->ht[h];.  x3
20ef0 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
20f00 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33   np->from = &(x3
20f10 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
20f20 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
20f30 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
20f40 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
20f50 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
20f60 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
20f70 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
20f80 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65   */.struct state
20f90 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 6b 65 79   *State_find(key
20fa0 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
20fb0 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b  *key;.{.  int h;
20fc0 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x3node *np;..
20fd0 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72    if( x3a==0 ) r
20fe0 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73  eturn 0;.  h = s
20ff0 74 61 74 65 68 61 73 68 28 6b 65 79 29 20 26 20  tatehash(key) & 
21000 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
21010 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d   np = x3a->ht[h]
21020 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
21030 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d  .    if( statecm
21040 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
21050 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
21060 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
21070 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
21080 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
21090 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72  ./* Return an ar
210a0 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
210b0 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74  to all data in t
210c0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65  he table..** The
210d0 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e   array is obtain
210e0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
210f0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
21100 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
21110 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f  n.** problems, o
21120 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20 69  r if the array i
21130 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75  s empty. */.stru
21140 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65  ct state **State
21150 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73  _arrayof().{.  s
21160 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72  truct state **ar
21170 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a  ray;.  int i,siz
21180 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  e;.  if( x3a==0 
21190 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69  ) return 0;.  si
211a0 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b  ze = x3a->count;
211b0 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75  .  array = (stru
211c0 63 74 20 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c  ct state **)mall
211d0 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
211e0 74 20 73 74 61 74 65 20 2a 29 2a 73 69 7a 65 20  t state *)*size 
211f0 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
21200 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
21210 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
21220 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b  y[i] = x3a->tbl[
21230 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72  i].data;.  }.  r
21240 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a  eturn array;.}..
21250 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66 69 67  /* Hash a config
21260 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41  uration */.PRIVA
21270 54 45 20 69 6e 74 20 63 6f 6e 66 69 67 68 61 73  TE int confighas
21280 68 28 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  h(a).struct conf
21290 69 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68  ig *a;.{.  int h
212a0 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20  =0;.  h = h*571 
212b0 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33  + a->rp->index*3
212c0 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65  7 + a->dot;.  re
212d0 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn h;.}../* Th
212e0 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
212f0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
21300 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
21310 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
21320 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
21330 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74  type "x4"..*/.st
21340 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e  ruct s_x4 {.  in
21350 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
21360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
21370 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
21380 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213a0 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
213b0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
213c0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
213d0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
213e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
213f0 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
21400 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
21410 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21420 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
21430 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
21440 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
21450 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
21460 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
21470 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
21480 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  4node **ht;  /* 
21490 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
214a0 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
214b0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
214c0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
214d0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
214e0 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
214f0 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
21500 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
21510 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x4"..*/.type
21520 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e  def struct s_x4n
21530 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63  ode {.  struct c
21540 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20  onfig *data;    
21550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21560 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
21570 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
21580 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
21590 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
215a0 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
215b0 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a  ruct s_x4node **
215c0 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
215d0 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e  us link */.} x4n
215e0 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
215f0 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
21600 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
21610 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
21620 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
21630 69 63 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a  ic struct s_x4 *
21640 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x4a;../* Allocat
21650 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
21660 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
21670 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  d Configtable_in
21680 69 74 28 29 7b 0a 20 20 69 66 28 20 78 34 61 20  it(){.  if( x4a 
21690 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20  ) return;.  x4a 
216a0 3d 20 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29  = (struct s_x4*)
216b0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
216c0 74 72 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20  truct s_x4) );. 
216d0 20 69 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20   if( x4a ){.    
216e0 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a  x4a->size = 64;.
216f0 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d      x4a->count =
21700 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c   0;.    x4a->tbl
21710 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x4node*)mall
21720 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
21730 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x4node) + siz
21740 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 36 34  eof(x4node*))*64
21750 20 29 3b 0a 20 20 20 20 69 66 28 20 78 34 61 2d   );.    if( x4a-
21760 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
21770 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20 20 20   free(x4a);.    
21780 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x4a = 0;.    }
21790 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
217a0 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e 68 74  i;.      x4a->ht
217b0 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78   = (x4node**)&(x
217c0 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20  4a->tbl[64]);.  
217d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36      for(i=0; i<6
217e0 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b  4; i++) x4a->ht[
217f0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
21800 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
21810 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
21820 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
21830 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
21840 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
21850 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
21860 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
21870 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
21880 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
21890 65 72 74 28 64 61 74 61 29 0a 73 74 72 75 63 74  ert(data).struct
218a0 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 0a 7b   config *data;.{
218b0 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x4node *np;. 
218c0 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68   int h;.  int ph
218d0 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  ;..  if( x4a==0 
218e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
218f0 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61   = confighash(da
21900 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ta);.  h = ph & 
21910 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
21920 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d   np = x4a->ht[h]
21930 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
21940 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63  .    if( Configc
21950 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61  mp(np->data,data
21960 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
21970 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
21980 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
21990 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
219a0 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
219b0 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
219c0 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
219d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
219e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
219f0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
21a00 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e  .  if( x4a->coun
21a10 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x4a->size ){.
21a20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
21a30 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
21a40 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
21a50 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20   int i,size;.   
21a60 20 73 74 72 75 63 74 20 73 5f 78 34 20 61 72 72   struct s_x4 arr
21a70 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
21a80 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 34 61 2d  ze = size = x4a-
21a90 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
21aa0 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e  ay.count = x4a->
21ab0 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
21ac0 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29  .tbl = (x4node*)
21ad0 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73  malloc(.      (s
21ae0 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20  izeof(x4node) + 
21af0 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29  sizeof(x4node*))
21b00 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  *size );.    if(
21b10 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
21b20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
21b30 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
21b40 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
21b50 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f  array.ht = (x4no
21b60 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
21b70 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  [size]);.    for
21b80 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
21b90 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
21ba0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
21bb0 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x4a->count; i
21bc0 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64  ++){.      x4nod
21bd0 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
21be0 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
21bf0 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x4a->tbl[i]);.
21c00 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66 69 67        h = config
21c10 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
21c20 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
21c30 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
21c40 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
21c50 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
21c60 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
21c70 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
21c80 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
21c90 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
21ca0 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
21cb0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
21cc0 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
21cd0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
21ce0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
21cf0 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
21d00 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
21d10 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62      free(x4a->tb
21d20 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61  l);.    *x4a = a
21d30 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
21d40 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
21d50 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
21d60 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
21d70 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62    np = &(x4a->tb
21d80 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x4a->count++])
21d90 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
21da0 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e  ata;.  if( x4a->
21db0 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b  ht[h] ) x4a->ht[
21dc0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
21dd0 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
21de0 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  xt = x4a->ht[h];
21df0 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x4a->ht[h] = 
21e00 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
21e10 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x4a->ht[h]);.
21e20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
21e30 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
21e40 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
21e50 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
21e60 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
21e70 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
21e80 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
21e90 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61  config *Configta
21ea0 62 6c 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74  ble_find(key).st
21eb0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
21ec0 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ;.{.  int h;.  x
21ed0 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  4node *np;..  if
21ee0 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
21ef0 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69  n 0;.  h = confi
21f00 67 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 34  ghash(key) & (x4
21f10 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
21f20 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
21f30 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
21f40 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
21f50 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30  np->data,key)==0
21f60 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
21f70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
21f80 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
21f90 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
21fa0 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61  /* Remove all da
21fb0 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  ta from the tabl
21fc0 65 2e 20 20 50 61 73 73 20 65 61 63 68 20 64 61  e.  Pass each da
21fd0 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ta to the functi
21fe0 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20  on "f".** as it 
21ff0 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66  is removed.  ("f
22000 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f  " may be null to
22010 20 61 76 6f 69 64 20 74 68 69 73 20 73 74 65 70   avoid this step
22020 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  .) */.void Confi
22030 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 66 29 0a  gtable_clear(f).
22040 69 6e 74 28 2a 66 29 28 2f 2a 20 73 74 72 75 63  int(*f)(/* struc
22050 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a  t config * */);.
22060 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
22070 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e   x4a==0 || x4a->
22080 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72  count==0 ) retur
22090 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72  n;.  if( f ) for
220a0 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75  (i=0; i<x4a->cou
220b0 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34  nt; i++) (*f)(x4
220c0 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b  a->tbl[i].data);
220d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34  .  for(i=0; i<x4
220e0 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34  a->size; i++) x4
220f0 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
22100 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x4a->count = 0;.
22110 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.