/ Hex Artifact Content
Login

Artifact 2938bec507110397c937bd8a03b0c9596a709a04:


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 72 63 20 3d 20 61 70  0 ){.    rc = ap
3870: 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2d  1->x.rp->index -
3880: 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65   ap2->x.rp->inde
3890: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
38a0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70  rc;.}../* Sort p
38b0: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f  arser actions */
38c0: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  .struct action *
38d0: 41 63 74 69 6f 6e 5f 73 6f 72 74 28 61 70 29 0a  Action_sort(ap).
38e0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
38f0: 70 3b 0a 7b 0a 20 20 61 70 20 3d 20 28 73 74 72  p;.{.  ap = (str
3900: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f  uct action *)mso
3910: 72 74 28 28 63 68 61 72 20 2a 29 61 70 2c 28 63  rt((char *)ap,(c
3920: 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e 65 78 74  har **)&ap->next
3930: 2c 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72  ,actioncmp);.  r
3940: 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69  eturn ap;.}..voi
3950: 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 61 70 70  d Action_add(app
3960: 2c 74 79 70 65 2c 73 70 2c 61 72 67 29 0a 73 74  ,type,sp,arg).st
3970: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2a 61 70  ruct action **ap
3980: 70 3b 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e  p;.enum e_action
3990: 20 74 79 70 65 3b 0a 73 74 72 75 63 74 20 73 79   type;.struct sy
39a0: 6d 62 6f 6c 20 2a 73 70 3b 0a 63 68 61 72 20 2a  mbol *sp;.char *
39b0: 61 72 67 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  arg;.{.  struct 
39c0: 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a 20 20 6e  action *new;.  n
39d0: 65 77 20 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28  ew = Action_new(
39e0: 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78 74 20 3d  );.  new->next =
39f0: 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20   *app;.  *app = 
3a00: 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e 74 79 70 65  new;.  new->type
3a10: 20 3d 20 74 79 70 65 3b 0a 20 20 6e 65 77 2d 3e   = type;.  new->
3a20: 73 70 20 3d 20 73 70 3b 0a 20 20 69 66 28 20 74  sp = sp;.  if( t
3a30: 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20  ype==SHIFT ){.  
3a40: 20 20 6e 65 77 2d 3e 78 2e 73 74 70 20 3d 20 28    new->x.stp = (
3a50: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 61  struct state *)a
3a60: 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rg;.  }else{.   
3a70: 20 6e 65 77 2d 3e 78 2e 72 70 20 3d 20 28 73 74   new->x.rp = (st
3a80: 72 75 63 74 20 72 75 6c 65 20 2a 29 61 72 67 3b  ruct rule *)arg;
3a90: 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  .  }.}./********
3aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
3ab0: 65 77 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  ew code to imple
3ac0: 6d 65 6e 74 20 74 68 65 20 22 61 63 74 74 61 62  ment the "acttab
3ad0: 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a  " module *******
3ae0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ****/./*.** This
3af0: 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e   module implemen
3b00: 74 73 20 72 6f 75 74 69 6e 65 73 20 75 73 65 20  ts routines use 
3b10: 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
3b20: 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
3b30: 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  le..*/../*.** Th
3b40: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 79  e state of the y
3b50: 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 75  y_action table u
3b60: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
3b70: 6e 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  n is an instance
3b80: 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f   of.** the follo
3b90: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a  wing structure.*
3ba0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
3bb0: 20 61 63 74 74 61 62 20 61 63 74 74 61 62 3b 0a   acttab acttab;.
3bc0: 73 74 72 75 63 74 20 61 63 74 74 61 62 20 7b 0a  struct acttab {.
3bd0: 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20    int nAction;  
3be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3bf0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 64  * Number of used
3c00: 20 73 6c 6f 74 73 20 69 6e 20 61 41 63 74 69 6f   slots in aActio
3c10: 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63  n[] */.  int nAc
3c20: 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20  tionAlloc;      
3c30: 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61        /* Slots a
3c40: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 41 63  llocated for aAc
3c50: 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75  tion[] */.  stru
3c60: 63 74 20 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 6f  ct {.    int loo
3c70: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
3c80: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
3c90: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f  the lookahead to
3ca0: 6b 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ken */.    int a
3cb0: 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
3cc0: 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20        /* Action 
3cd0: 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65 20 67  to take on the g
3ce0: 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a  iven lookahead *
3cf0: 2f 0a 20 20 7d 20 2a 61 41 63 74 69 6f 6e 2c 20  /.  } *aAction, 
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d10: 20 2f 2a 20 54 68 65 20 79 79 5f 61 63 74 69 6f   /* The yy_actio
3d20: 6e 5b 5d 20 74 61 62 6c 65 20 75 6e 64 65 72 20  n[] table under 
3d30: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
3d40: 20 20 20 20 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b      *aLookahead;
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d60: 2a 20 41 20 73 69 6e 67 6c 65 20 6e 65 77 20 74  * A single new t
3d70: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 2a  ransaction set *
3d80: 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68  /.  int mnLookah
3d90: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3da0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f   /* Minimum aLoo
3db0: 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65  kahead[].lookahe
3dc0: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 41 63  ad */.  int mnAc
3dd0: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
3de0: 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 61       /* Action a
3df0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6d  ssociated with m
3e00: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20  nLookahead */.  
3e10: 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b  int mxLookahead;
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3e30: 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65  Maximum aLookahe
3e40: 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a  ad[].lookahead *
3e50: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65  /.  int nLookahe
3e60: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
3e70: 20 2f 2a 20 55 73 65 64 20 73 6c 6f 74 73 20 69   /* Used slots i
3e80: 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a  n aLookahead[] *
3e90: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65  /.  int nLookahe
3ea0: 61 64 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  adAlloc;        
3eb0: 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61   /* Slots alloca
3ec0: 74 65 64 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61  ted in aLookahea
3ed0: 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65  d[] */.};../* Re
3ee0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
3ef0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
3f00: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
3f10: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74  e */.#define act
3f20: 74 61 62 5f 73 69 7a 65 28 58 29 20 28 28 58 29  tab_size(X) ((X)
3f30: 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54  ->nAction)../* T
3f40: 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
3f50: 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79   N-th entry in y
3f60: 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a 23 64 65 66  y_action */.#def
3f70: 69 6e 65 20 61 63 74 74 61 62 5f 79 79 61 63 74  ine acttab_yyact
3f80: 69 6f 6e 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e  ion(X,N)  ((X)->
3f90: 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61 63 74 69 6f  aAction[N].actio
3fa0: 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65  n)../* The value
3fb0: 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e   for the N-th en
3fc0: 74 72 79 20 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68  try in yy_lookah
3fd0: 65 61 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61  ead */.#define a
3fe0: 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61  cttab_yylookahea
3ff0: 64 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41  d(X,N)  ((X)->aA
4000: 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65  ction[N].lookahe
4010: 61 64 29 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c  ad)../* Free all
4020: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
4030: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
4040: 6e 20 61 63 74 74 61 62 20 2a 2f 0a 76 6f 69 64  n acttab */.void
4050: 20 61 63 74 74 61 62 5f 66 72 65 65 28 61 63 74   acttab_free(act
4060: 74 61 62 20 2a 70 29 7b 0a 20 20 66 72 65 65 28  tab *p){.  free(
4070: 20 70 2d 3e 61 41 63 74 69 6f 6e 20 29 3b 0a 20   p->aAction );. 
4080: 20 66 72 65 65 28 20 70 2d 3e 61 4c 6f 6f 6b 61   free( p->aLooka
4090: 68 65 61 64 20 29 3b 0a 20 20 66 72 65 65 28 20  head );.  free( 
40a0: 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63  p );.}../* Alloc
40b0: 61 74 65 20 61 20 6e 65 77 20 61 63 74 74 61 62  ate a new acttab
40c0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 61 63   structure */.ac
40d0: 74 74 61 62 20 2a 61 63 74 74 61 62 5f 61 6c 6c  ttab *acttab_all
40e0: 6f 63 28 76 6f 69 64 29 7b 0a 20 20 61 63 74 74  oc(void){.  actt
40f0: 61 62 20 2a 70 20 3d 20 6d 61 6c 6c 6f 63 28 20  ab *p = malloc( 
4100: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
4110: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
4120: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
4130: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
4140: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
4150: 6e 65 77 20 61 63 74 74 61 62 2e 22 29 3b 0a 20  new acttab.");. 
4160: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
4170: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
4180: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 72 65  izeof(*p));.  re
4190: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20 41 64  turn p;.}../* Ad
41a0: 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e 20 74  d a new action t
41b0: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  o the current tr
41c0: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 2a 2f  ansaction set.*/
41d0: 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61 63 74  .void acttab_act
41e0: 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c 20 69  ion(acttab *p, i
41f0: 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20 69 6e  nt lookahead, in
4200: 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69 66 28  t action){.  if(
4210: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 3d   p->nLookahead>=
4220: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c  p->nLookaheadAll
4230: 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 6f  oc ){.    p->nLo
4240: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b 3d 20  okaheadAlloc += 
4250: 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f 6f 6b  25;.    p->aLook
4260: 61 68 65 61 64 20 3d 20 72 65 61 6c 6c 6f 63 28  ahead = realloc(
4270: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a   p->aLookahead,.
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
42a0: 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  eof(p->aLookahea
42b0: 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68  d[0])*p->nLookah
42c0: 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20  eadAlloc );.    
42d0: 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  if( p->aLookahea
42e0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  d==0 ){.      fp
42f0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61  rintf(stderr,"ma
4300: 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b  lloc failed\n");
4310: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
4320: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
4330: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30  p->nLookahead==0
4340: 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f   ){.    p->mxLoo
4350: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
4360: 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f  ad;.    p->mnLoo
4370: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
4380: 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74  ad;.    p->mnAct
4390: 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20  ion = action;.  
43a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
43b0: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f  ->mxLookahead<lo
43c0: 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c  okahead ) p->mxL
43d0: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
43e0: 68 65 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d  head;.    if( p-
43f0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f  >mnLookahead>loo
4400: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
4410: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mnLookahead =
4420: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
4430: 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20    p->mnAction = 
4440: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20  action;.    }.  
4450: 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  }.  p->aLookahea
4460: 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d  d[p->nLookahead]
4470: 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  .lookahead = loo
4480: 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f  kahead;.  p->aLo
4490: 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b  okahead[p->nLook
44a0: 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20  ahead].action = 
44b0: 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f  action;.  p->nLo
44c0: 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a  okahead++;.}../*
44d0: 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e  .** Add the tran
44e0: 73 61 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c  saction set buil
44f0: 74 20 75 70 20 77 69 74 68 20 70 72 69 6f 72 20  t up with prior 
4500: 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f  calls to acttab_
4510: 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f  action().** into
4520: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63 74   the current act
4530: 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  ion table.  Then
4540: 20 72 65 73 65 74 20 74 68 65 20 74 72 61 6e 73   reset the trans
4550: 61 63 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a  action set back.
4560: 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73  ** to an empty s
4570: 65 74 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  et in preparatio
4580: 6e 20 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e  n for a new roun
4590: 64 20 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69  d of acttab_acti
45a0: 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  on() calls..**.*
45b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
45c0: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74  set into the act
45d0: 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ion table of the
45e0: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
45f0: 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74 61 62 5f  ..*/.int acttab_
4600: 69 6e 73 65 72 74 28 61 63 74 74 61 62 20 2a 70  insert(acttab *p
4610: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
4620: 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
4630: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29  ->nLookahead>0 )
4640: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
4650: 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75 67 68  e we have enough
4660: 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   space to hold t
4670: 68 65 20 65 78 70 61 6e 64 65 64 20 61 63 74 69  he expanded acti
4680: 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  on table.  ** in
4690: 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e   the worst case.
46a0: 20 20 54 68 65 20 77 6f 72 73 74 20 63 61 73 65    The worst case
46b0: 20 6f 63 63 75 72 73 20 69 66 20 74 68 65 20 74   occurs if the t
46c0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 20  ransaction set. 
46d0: 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70 70 65   ** must be appe
46e0: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
46f0: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
4700: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6d  .  */.  n = p->m
4710: 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 31 3b 0a  xLookahead + 1;.
4720: 20 20 69 66 28 20 70 2d 3e 6e 41 63 74 69 6f 6e    if( p->nAction
4730: 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41 63 74 69   + n >= p->nActi
4740: 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  onAlloc ){.    i
4750: 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d  nt oldAlloc = p-
4760: 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20  >nActionAlloc;. 
4770: 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c     p->nActionAll
4780: 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 20  oc = p->nAction 
4790: 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e  + n + p->nAction
47a0: 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20 20  Alloc + 20;.    
47b0: 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20 72 65 61  p->aAction = rea
47c0: 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f 6e  lloc( p->aAction
47d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
47f0: 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  of(p->aAction[0]
4800: 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  )*p->nActionAllo
4810: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  c);.    if( p->a
4820: 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Action==0 ){.   
4830: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
4840: 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  r,"malloc failed
4850: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  \n");.      exit
4860: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
4870: 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69  or(i=oldAlloc; i
4880: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  <p->nActionAlloc
4890: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
48a0: 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b  >aAction[i].look
48b0: 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20  ahead = -1;.    
48c0: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e    p->aAction[i].
48d0: 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20  action = -1;.   
48e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61   }.  }..  /* Sca
48f0: 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 61  n the existing a
4900: 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f 6b  ction table look
4910: 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73 65  ing for an offse
4920: 74 20 77 68 65 72 65 20 77 65 20 63 61 6e 0a 20  t where we can. 
4930: 20 2a 2a 20 69 6e 73 65 72 74 20 74 68 65 20 63   ** insert the c
4940: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
4950: 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c 20 6f 75  on set.  Fall ou
4960: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68  t of the loop wh
4970: 65 6e 20 74 68 61 74 0a 20 20 2a 2a 20 6f 66 66  en that.  ** off
4980: 73 65 74 20 69 73 20 66 6f 75 6e 64 2e 20 20 49  set is found.  I
4990: 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65  n the worst case
49a0: 2c 20 77 65 20 66 61 6c 6c 20 6f 75 74 20 6f 66  , we fall out of
49b0: 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 0a 20   the loop when. 
49c0: 20 2a 2a 20 69 20 72 65 61 63 68 65 73 20 70 2d   ** i reaches p-
49d0: 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20  >nAction, which 
49e0: 6d 65 61 6e 73 20 77 65 20 61 70 70 65 6e 64 20  means we append 
49f0: 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74  the new transact
4a00: 69 6f 6e 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20  ion set..  **.  
4a10: 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65  ** i is the inde
4a20: 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  x in p->aAction[
4a30: 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c 6f 6f  ] where p->mnLoo
4a40: 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65 72 74  kahead is insert
4a50: 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ed..  */.  for(i
4a60: 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  =0; i<p->nAction
4a70: 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b  +p->mnLookahead;
4a80: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
4a90: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f  ->aAction[i].loo
4aa0: 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20 20 20 20  kahead<0 ){.    
4ab0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
4ac0: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29  nLookahead; j++)
4ad0: 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d  {.        k = p-
4ae0: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c  >aLookahead[j].l
4af0: 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e  ookahead - p->mn
4b00: 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20  Lookahead + i;. 
4b10: 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29         if( k<0 )
4b20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4b30: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b  if( p->aAction[k
4b40: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20 29  ].lookahead>=0 )
4b50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4b60: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e        if( j<p->n
4b70: 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74  Lookahead ) cont
4b80: 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
4b90: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
4ba0: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
4bb0: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4bc0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b  j].lookahead==j+
4bd0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69  p->mnLookahead-i
4be0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4bf0: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
4c00: 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ->nAction ){.   
4c10: 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20       break;  /* 
4c20: 46 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c  Fits in empty sl
4c30: 6f 74 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ots */.      }. 
4c40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
4c50: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
4c60: 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61  head==p->mnLooka
4c70: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 69 66  head ){.      if
4c80: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e  ( p->aAction[i].
4c90: 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74  action!=p->mnAct
4ca0: 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ion ) continue;.
4cb0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4cc0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
4cd0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
4ce0: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
4cf0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
4d00: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
4d10: 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  i;.        if( k
4d20: 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74  <0 || k>=p->nAct
4d30: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
4d40: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f       if( p->aLoo
4d50: 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68  kahead[j].lookah
4d60: 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ead!=p->aAction[
4d70: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62  k].lookahead ) b
4d80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
4d90: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  ( p->aLookahead[
4da0: 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41  j].action!=p->aA
4db0: 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20  ction[k].action 
4dc0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
4dd0: 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e  .      if( j<p->
4de0: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e  nLookahead ) con
4df0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d  tinue;.      n =
4e00: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
4e10: 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b  0; j<p->nAction;
4e20: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
4e30: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d  f( p->aAction[j]
4e40: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 20 63  .lookahead<0 ) c
4e50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
4e60: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4e70: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b  j].lookahead==j+
4e80: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69  p->mnLookahead-i
4e90: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) n++;.      }.
4ea0: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70 2d 3e        if( n==p->
4eb0: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20  nLookahead ){.  
4ec0: 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a        break;  /*
4ed0: 20 53 61 6d 65 20 61 73 20 61 20 70 72 69 6f 72   Same as a prior
4ee0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
4ef0: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
4f00: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  }.  }.  /* Inser
4f10: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
4f20: 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20 2a 2f  t at index i. */
4f30: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d  .  for(j=0; j<p-
4f40: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
4f50: 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c  ){.    k = p->aL
4f60: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
4f70: 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  ahead - p->mnLoo
4f80: 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20  kahead + i;.    
4f90: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d 20  p->aAction[k] = 
4fa0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
4fb0: 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d 3e  ;.    if( k>=p->
4fc0: 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41 63  nAction ) p->nAc
4fd0: 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d 0a  tion = k+1;.  }.
4fe0: 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20    p->nLookahead 
4ff0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  = 0;..  /* Retur
5000: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74 68 61  n the offset tha
5010: 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  t is added to th
5020: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20 6f  e lookahead in o
5030: 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 0a  rder to get the.
5040: 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20    ** index into 
5050: 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68 65  yy_action of the
5060: 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65 74   action */.  ret
5070: 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  urn i - p->mnLoo
5080: 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  kahead;.}../****
5090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50a0: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
50b0: 20 22 61 73 73 65 72 74 2e 63 22 20 2a 2a 2a 2a   "assert.c" ****
50c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50d0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
50e0: 41 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  A more efficient
50f0: 20 77 61 79 20 6f 66 20 68 61 6e 64 6c 69 6e 67   way of handling
5100: 20 61 73 73 65 72 74 69 6f 6e 73 2e 0a 2a 2f 0a   assertions..*/.
5110: 76 6f 69 64 20 6d 79 61 73 73 65 72 74 28 66 69  void myassert(fi
5120: 6c 65 2c 6c 69 6e 65 29 0a 63 68 61 72 20 2a 66  le,line).char *f
5130: 69 6c 65 3b 0a 69 6e 74 20 6c 69 6e 65 3b 0a 7b  ile;.int line;.{
5140: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
5150: 72 2c 22 41 73 73 65 72 74 69 6f 6e 20 66 61 69  r,"Assertion fai
5160: 6c 65 64 20 6f 6e 20 6c 69 6e 65 20 25 64 20 6f  led on line %d o
5170: 66 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c 6e 22  f file \"%s\"\n"
5180: 2c 6c 69 6e 65 2c 66 69 6c 65 29 3b 0a 20 20 65  ,line,file);.  e
5190: 78 69 74 28 31 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  xit(1);.}./*****
51a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51b0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
51c0: 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a 2a  "build.c" ******
51d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51e0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52  *******/./*.** R
51f0: 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e 73 74  outines to const
5200: 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69 6e 69  ruction the fini
5210: 74 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65  te state machine
5220: 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 0a 2a   for the LEMON.*
5230: 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  * parser generat
5240: 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20  or..*/../* Find 
5250: 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d  a precedence sym
5260: 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72 75 6c  bol of every rul
5270: 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72  e in the grammar
5280: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65 20 72  ..** .** Those r
5290: 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65 20  ules which have 
52a0: 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d  a precedence sym
52b0: 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74 68 65  bol coded in the
52c0: 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d 6d 61   input.** gramma
52d0: 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b 73 79  r using the "[sy
52e0: 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75 63 74  mbol]" construct
52f0: 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20 68 61   will already ha
5300: 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e 70 72  ve the.** rp->pr
5310: 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69 6c 6c  ecsym field fill
5320: 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c 65 73  ed.  Other rules
5330: 20 74 61 6b 65 20 61 73 20 74 68 65 69 72 20 70   take as their p
5340: 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d  recedence.** sym
5350: 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20 52 48  bol the first RH
5360: 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20 61 20  S symbol with a 
5370: 64 65 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e  defined preceden
5380: 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  ce.  If there.**
5390: 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73 79 6d   are not RHS sym
53a0: 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65 66 69  bols with a defi
53b0: 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65 2c 20  ned precedence, 
53c0: 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 0a 2a  the precedence.*
53d0: 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64 20 69  * symbol field i
53e0: 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a 2a 2f  s left blank..*/
53f0: 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65 50 72  .void FindRulePr
5400: 65 63 65 64 65 6e 63 65 73 28 78 70 29 0a 73 74  ecedences(xp).st
5410: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 3b 0a  ruct lemon *xp;.
5420: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
5430: 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78 70  *rp;.  for(rp=xp
5440: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
5450: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
5460: 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30  ( rp->precsym==0
5470: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   ){.      int i,
5480: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   j;.      for(i=
5490: 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26 26  0; i<rp->nrhs &&
54a0: 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 3b   rp->precsym==0;
54b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
54c0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
54d0: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
54e0: 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74         if( sp->t
54f0: 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
5500: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
5510: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e 6e  for(j=0; j<sp->n
5520: 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20  subsym; j++){.  
5530: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70            if( sp
5540: 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72 65  ->subsym[j]->pre
5550: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
5560: 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79        rp->precsy
5570: 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a  m = sp->subsym[j
5580: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
5590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
55a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
55b0: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
55c0: 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20  if( sp->prec>=0 
55d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  ){.          rp-
55e0: 3e 70 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e 72  >precsym = rp->r
55f0: 68 73 5b 69 5d 3b 0a 09 7d 0a 20 20 20 20 20 20  hs[i];..}.      
5600: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
5610: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64  turn;.}../* Find
5620: 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   all nonterminal
5630: 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67 65 6e  s which will gen
5640: 65 72 61 74 65 20 74 68 65 20 65 6d 70 74 79 20  erate the empty 
5650: 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20  string..** Then 
5660: 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70  go back and comp
5670: 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73 65  ute the first se
5680: 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74  ts of every nont
5690: 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20  erminal..** The 
56a0: 66 69 72 73 74 20 73 65 74 20 69 73 20 74 68 65  first set is the
56b0: 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d   set of all term
56c0: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69  inal symbols whi
56d0: 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20  ch can begin.** 
56e0: 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72 61 74  a string generat
56f0: 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e 74 65  ed by that nonte
5700: 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  rminal..*/.void 
5710: 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 6c 65  FindFirstSets(le
5720: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
5730: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
5740: 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 72  i, j;.  struct r
5750: 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20 70  ule *rp;.  int p
5760: 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f 72 28  rogress;..  for(
5770: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
5780: 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
5790: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
57a0: 2d 3e 6c 61 6d 62 64 61 20 3d 20 42 5f 46 41 4c  ->lambda = B_FAL
57b0: 53 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  SE;.  }.  for(i=
57c0: 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
57d0: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
57e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70  ; i++){.    lemp
57f0: 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69  ->symbols[i]->fi
5800: 72 73 74 73 65 74 20 3d 20 53 65 74 4e 65 77 28  rstset = SetNew(
5810: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72  );.  }..  /* Fir
5820: 73 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c  st compute all l
5830: 61 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a  ambdas */.  do{.
5840: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30      progress = 0
5850: 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d  ;.    for(rp=lem
5860: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
5870: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  rp->next){.     
5880: 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61   if( rp->lhs->la
5890: 6d 62 64 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mbda ) continue;
58a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
58b0: 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
58c0: 7b 0a 20 20 20 20 20 20 20 20 20 73 74 72 75 63  {.         struc
58d0: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72  t symbol *sp = r
58e0: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
58f0: 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
5900: 21 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70  !=TERMINAL || sp
5910: 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53  ->lambda==B_FALS
5920: 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E ) break;.     
5930: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d   }.      if( i==
5940: 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20  rp->nrhs ){.    
5950: 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d      rp->lhs->lam
5960: 62 64 61 20 3d 20 42 5f 54 52 55 45 3b 0a 20 20  bda = B_TRUE;.  
5970: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d        progress =
5980: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
5990: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67  }.  }while( prog
59a0: 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  ress );..  /* No
59b0: 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69  w compute all fi
59c0: 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f  rst sets */.  do
59d0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
59e0: 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20  bol *s1, *s2;.  
59f0: 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a    progress = 0;.
5a00: 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d      for(rp=lemp-
5a10: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
5a20: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 73  ->next){.      s
5a30: 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20  1 = rp->lhs;.   
5a40: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
5a50: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
5a60: 20 20 20 20 20 20 73 32 20 3d 20 72 70 2d 3e 72        s2 = rp->r
5a70: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs[i];.        i
5a80: 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52  f( s2->type==TER
5a90: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
5aa0: 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53     progress += S
5ab0: 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73  etAdd(s1->firsts
5ac0: 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20  et,s2->index);. 
5ad0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5ae0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
5af0: 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( s2->type==MULT
5b00: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
5b10: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
5b20: 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a  j<s2->nsubsym; j
5b30: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
5b40: 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74   progress += Set
5b50: 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74  Add(s1->firstset
5b60: 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e  ,s2->subsym[j]->
5b70: 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
5b80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
5b90: 65 61 6b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  eak;..}else if( 
5ba0: 73 31 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20 20  s1==s2 ){.      
5bb0: 20 20 20 20 69 66 28 20 73 31 2d 3e 6c 61 6d 62      if( s1->lamb
5bc0: 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29 20 62 72  da==B_FALSE ) br
5bd0: 65 61 6b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20  eak;..}else{.   
5be0: 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20         progress 
5bf0: 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d 3e  += SetUnion(s1->
5c00: 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 66 69 72  firstset,s2->fir
5c10: 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  stset);.        
5c20: 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64 61    if( s2->lambda
5c30: 3d 3d 42 5f 46 41 4c 53 45 20 29 20 62 72 65 61  ==B_FALSE ) brea
5c40: 6b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20  k;..}.      }.  
5c50: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
5c60: 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 65 74 75  ogress );.  retu
5c70: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74  rn;.}../* Comput
5c80: 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74  e all LR(0) stat
5c90: 65 73 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d  es for the gramm
5ca0: 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72  ar.  Links.** ar
5cb0: 65 20 61 64 64 65 64 20 74 6f 20 62 65 74 77 65  e added to betwe
5cc0: 65 6e 20 73 6f 6d 65 20 73 74 61 74 65 73 20 73  en some states s
5cd0: 6f 20 74 68 61 74 20 74 68 65 20 4c 52 28 31 29  o that the LR(1)
5ce0: 20 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20   follow sets.** 
5cf0: 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20  can be computed 
5d00: 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54  later..*/.PRIVAT
5d10: 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  E struct state *
5d20: 67 65 74 73 74 61 74 65 28 2f 2a 20 73 74 72 75  getstate(/* stru
5d30: 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 20  ct lemon * */); 
5d40: 20 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65   /* forward refe
5d50: 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20 46 69  rence */.void Fi
5d60: 6e 64 53 74 61 74 65 73 28 6c 65 6d 70 29 0a 73  ndStates(lemp).s
5d70: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
5d80: 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  p;.{.  struct sy
5d90: 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75  mbol *sp;.  stru
5da0: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20  ct rule *rp;..  
5db0: 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28  Configlist_init(
5dc0: 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  );..  /* Find th
5dd0: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a  e start symbol *
5de0: 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  /.  if( lemp->st
5df0: 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  art ){.    sp = 
5e00: 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70  Symbol_find(lemp
5e10: 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66  ->start);.    if
5e20: 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( sp==0 ){.     
5e30: 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
5e40: 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65  filename,0,."The
5e50: 20 73 70 65 63 69 66 69 65 64 20 73 74 61 72 74   specified start
5e60: 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69   symbol \"%s\" i
5e70: 73 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e  s not \.in a non
5e80: 74 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20  terminal of the 
5e90: 67 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22  grammar.  \"%s\"
5ea0: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73   will be used as
5eb0: 20 74 68 65 20 73 74 61 72 74 20 5c 0a 73 79 6d   the start \.sym
5ec0: 62 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65  bol instead.",le
5ed0: 6d 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e  mp->start,lemp->
5ee0: 72 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  rule->lhs->name)
5ef0: 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
5f00: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
5f10: 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d  sp = lemp->rule-
5f20: 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  >lhs;.    }.  }e
5f30: 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  lse{.    sp = le
5f40: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
5f50: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
5f60: 72 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  re the start sym
5f70: 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63 75  bol doesn't occu
5f80: 72 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  r on the right-h
5f90: 61 6e 64 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a  and side of.  **
5fa0: 20 61 6e 79 20 72 75 6c 65 2e 20 20 52 65 70 6f   any rule.  Repo
5fb0: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  rt an error if i
5fc0: 74 20 64 6f 65 73 2e 20 20 28 59 41 43 43 20 77  t does.  (YACC w
5fd0: 6f 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61 20  ould generate a 
5fe0: 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72 74 20 73  new.  ** start s
5ff0: 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20 63 61  ymbol in this ca
6000: 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70  se.) */.  for(rp
6010: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
6020: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
6030: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
6040: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
6050: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  s; i++){.      i
6060: 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73  f( rp->rhs[i]==s
6070: 70 20 29 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45  p ){   /* FIX ME
6080: 3a 20 20 44 65 61 6c 20 77 69 74 68 20 6d 75 6c  :  Deal with mul
6090: 74 69 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20  titerminals */. 
60a0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
60b0: 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30  lemp->filename,0
60c0: 2c 0a 22 54 68 65 20 73 74 61 72 74 20 73 79 6d  ,."The start sym
60d0: 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72  bol \"%s\" occur
60e0: 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74  s on the \.right
60f0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20  -hand side of a 
6100: 72 75 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  rule. This will 
6110: 72 65 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73  result in a pars
6120: 65 72 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20  er which \.does 
6130: 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c  not work properl
6140: 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  y.",sp->name);. 
6150: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
6160: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
6170: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6180: 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   The basis confi
6190: 67 75 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72  guration set for
61a0: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
61b0: 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c  .  ** is all rul
61c0: 65 73 20 77 68 69 63 68 20 68 61 76 65 20 74 68  es which have th
61d0: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61  e start symbol a
61e0: 73 20 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66  s their.  ** lef
61f0: 74 2d 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20  t-hand side */. 
6200: 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65   for(rp=sp->rule
6210: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
6220: 74 6c 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63  tlhs){.    struc
6230: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70  t config *newcfp
6240: 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43  ;.    newcfp = C
6250: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
6260: 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20 53 65  is(rp,0);.    Se
6270: 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73  tAdd(newcfp->fws
6280: 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ,0);.  }..  /* C
6290: 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72 73 74  ompute the first
62a0: 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74 68   state.  All oth
62b0: 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c 20 62  er states will b
62c0: 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20  e.  ** computed 
62d0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 75  automatically du
62e0: 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75 74 61  ring the computa
62f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
6300: 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20  t one..  ** The 
6310: 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
6320: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74   to the first st
6330: 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  ate is not used.
6340: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 73   */.  (void)gets
6350: 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72 65  tate(lemp);.  re
6360: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  turn;.}../* Retu
6370: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
6380: 61 20 73 74 61 74 65 20 77 68 69 63 68 20 69 73  a state which is
6390: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 68   described by th
63a0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a  e configuration.
63b0: 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20 68 61  ** list which ha
63c0: 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66 72 6f  s been built fro
63d0: 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66 69  m calls to Confi
63e0: 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52  glist_add..*/.PR
63f0: 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64  IVATE void build
6400: 73 68 69 66 74 73 28 2f 2a 20 73 74 72 75 63 74  shifts(/* struct
6410: 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74   lemon *, struct
6420: 20 73 74 61 74 65 20 2a 20 2a 2f 29 3b 20 2f 2a   state * */); /*
6430: 20 46 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50 52   Forwd ref */.PR
6440: 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74 61  IVATE struct sta
6450: 74 65 20 2a 67 65 74 73 74 61 74 65 28 6c 65 6d  te *getstate(lem
6460: 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
6470: 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63  *lemp;.{.  struc
6480: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a  t config *cfp, *
6490: 62 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  bp;.  struct sta
64a0: 74 65 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45  te *stp;..  /* E
64b0: 78 74 72 61 63 74 20 74 68 65 20 73 6f 72 74 65  xtract the sorte
64c0: 64 20 62 61 73 69 73 20 6f 66 20 74 68 65 20 6e  d basis of the n
64d0: 65 77 20 73 74 61 74 65 2e 20 20 54 68 65 20 62  ew state.  The b
64e0: 61 73 69 73 20 77 61 73 20 63 6f 6e 73 74 72 75  asis was constru
64f0: 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 70 72 69  cted.  ** by pri
6500: 6f 72 20 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e  or calls to "Con
6510: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
6520: 28 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67  ()". */.  Config
6530: 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29  list_sortbasis()
6540: 3b 0a 20 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c  ;.  bp = Configl
6550: 69 73 74 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20  ist_basis();..  
6560: 2f 2a 20 47 65 74 20 61 20 73 74 61 74 65 20 77  /* Get a state w
6570: 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61 73  ith the same bas
6580: 69 73 20 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74  is */.  stp = St
6590: 61 74 65 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20  ate_find(bp);.  
65a0: 69 66 28 20 73 74 70 20 29 7b 0a 20 20 20 20 2f  if( stp ){.    /
65b0: 2a 20 41 20 73 74 61 74 65 20 77 69 74 68 20 74  * A state with t
65c0: 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 61 6c  he same basis al
65d0: 72 65 61 64 79 20 65 78 69 73 74 73 21 20 20 43  ready exists!  C
65e0: 6f 70 79 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c  opy all the foll
65f0: 6f 77 2d 73 65 74 0a 20 20 20 20 2a 2a 20 70 72  ow-set.    ** pr
6600: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20  opagation links 
6610: 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 75  from the state u
6620: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
6630: 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  n into the.    *
6640: 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 73 74  * preexisting st
6650: 61 74 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ate, then return
6660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6670: 65 20 70 72 65 65 78 69 73 74 69 6e 67 20 73 74  e preexisting st
6680: 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ate */.    struc
6690: 74 20 63 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b  t config *x, *y;
66a0: 0a 20 20 20 20 66 6f 72 28 78 3d 62 70 2c 20 79  .    for(x=bp, y
66b0: 3d 73 74 70 2d 3e 62 70 3b 20 78 20 26 26 20 79  =stp->bp; x && y
66c0: 3b 20 78 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e  ; x=x->bp, y=y->
66d0: 62 70 29 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  bp){.      Plink
66e0: 5f 63 6f 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78  _copy(&y->bplp,x
66f0: 2d 3e 62 70 6c 70 29 3b 0a 20 20 20 20 20 20 50  ->bplp);.      P
6700: 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66  link_delete(x->f
6710: 70 6c 70 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66  plp);.      x->f
6720: 70 6c 70 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20  plp = x->bplp = 
6730: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 66 70  0;.    }.    cfp
6740: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65   = Configlist_re
6750: 74 75 72 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66  turn();.    Conf
6760: 69 67 6c 69 73 74 5f 65 61 74 28 63 66 70 29 3b  iglist_eat(cfp);
6770: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
6780: 20 54 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20   This really is 
6790: 61 20 6e 65 77 20 73 74 61 74 65 2e 20 20 43 6f  a new state.  Co
67a0: 6e 73 74 72 75 63 74 20 61 6c 6c 20 74 68 65 20  nstruct all the 
67b0: 64 65 74 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43  details */.    C
67c0: 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72  onfiglist_closur
67d0: 65 28 6c 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43  e(lemp);    /* C
67e0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 66 69  ompute the confi
67f0: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
6800: 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69   */.    Configli
6810: 73 74 5f 73 6f 72 74 28 29 3b 20 20 20 20 20 20  st_sort();      
6820: 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 74 68 65       /* Sort the
6830: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
6840: 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 63 66  losure */.    cf
6850: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72  p = Configlist_r
6860: 65 74 75 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65  eturn();   /* Ge
6870: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
6880: 68 65 20 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a  he config list *
6890: 2f 0a 20 20 20 20 73 74 70 20 3d 20 53 74 61 74  /.    stp = Stat
68a0: 65 5f 6e 65 77 28 29 3b 20 20 20 20 20 20 20 20  e_new();        
68b0: 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 74 61 74     /* A new stat
68c0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
68d0: 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73     MemoryCheck(s
68e0: 74 70 29 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70  tp);.    stp->bp
68f0: 20 3d 20 62 70 3b 20 20 20 20 20 20 20 20 20 20   = bp;          
6900: 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65        /* Remembe
6910: 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  r the configurat
6920: 69 6f 6e 20 62 61 73 69 73 20 2a 2f 0a 20 20 20  ion basis */.   
6930: 20 73 74 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b   stp->cfp = cfp;
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6950: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f   Remember the co
6960: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73  nfiguration clos
6970: 75 72 65 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  ure */.    stp->
6980: 73 74 61 74 65 6e 75 6d 20 3d 20 6c 65 6d 70 2d  statenum = lemp-
6990: 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a 20 45 76  >nstate++; /* Ev
69a0: 65 72 79 20 73 74 61 74 65 20 67 65 74 73 20 61  ery state gets a
69b0: 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72   sequence number
69c0: 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20   */.    stp->ap 
69d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
69e0: 20 20 20 20 20 2f 2a 20 4e 6f 20 61 63 74 69 6f       /* No actio
69f0: 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a 20 20 20 20  ns, yet. */.    
6a00: 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74 70  State_insert(stp
6a10: 2c 73 74 70 2d 3e 62 70 29 3b 20 20 20 2f 2a 20  ,stp->bp);   /* 
6a20: 41 64 64 20 74 6f 20 74 68 65 20 73 74 61 74 65  Add to the state
6a30: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 62 75   table */.    bu
6a40: 69 6c 64 73 68 69 66 74 73 28 6c 65 6d 70 2c 73  ildshifts(lemp,s
6a50: 74 70 29 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  tp);       /* Re
6a60: 63 75 72 73 69 76 65 6c 79 20 63 6f 6d 70 75 74  cursively comput
6a70: 65 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74  e successor stat
6a80: 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  es */.  }.  retu
6a90: 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn stp;.}../*.**
6aa0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
6ab0: 74 77 6f 20 73 79 6d 62 6f 6c 73 20 61 72 65 20  two symbols are 
6ac0: 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  the same..*/.int
6ad0: 20 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 61 2c 62   same_symbol(a,b
6ae0: 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  ).struct symbol 
6af0: 2a 61 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  *a;.struct symbo
6b00: 6c 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  l *b;.{.  int i;
6b10: 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20 72 65  .  if( a==b ) re
6b20: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 61 2d  turn 1;.  if( a-
6b30: 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d  >type!=MULTITERM
6b40: 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b  INAL ) return 0;
6b50: 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65 21 3d  .  if( b->type!=
6b60: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 20  MULTITERMINAL ) 
6b70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
6b80: 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d 3e 6e  a->nsubsym!=b->n
6b90: 73 75 62 73 79 6d 20 29 20 72 65 74 75 72 6e 20  subsym ) return 
6ba0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
6bb0: 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29  a->nsubsym; i++)
6bc0: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73 75 62  {.    if( a->sub
6bd0: 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62 73 79  sym[i]!=b->subsy
6be0: 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b  m[i] ) return 0;
6bf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
6c00: 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74  .}../* Construct
6c10: 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72 20 73   all successor s
6c20: 74 61 74 65 73 20 74 6f 20 74 68 65 20 67 69 76  tates to the giv
6c30: 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22 73 75  en state.  A "su
6c40: 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74  ccessor".** stat
6c50: 65 20 69 73 20 61 6e 79 20 73 74 61 74 65 20 77  e is any state w
6c60: 68 69 63 68 20 63 61 6e 20 62 65 20 72 65 61 63  hich can be reac
6c70: 68 65 64 20 62 79 20 61 20 73 68 69 66 74 20 61  hed by a shift a
6c80: 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
6c90: 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66  E void buildshif
6ca0: 74 73 28 6c 65 6d 70 2c 73 74 70 29 0a 73 74 72  ts(lemp,stp).str
6cb0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
6cc0: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73  .struct state *s
6cd0: 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 73  tp;     /* The s
6ce0: 74 61 74 65 20 66 72 6f 6d 20 77 68 69 63 68 20  tate from which 
6cf0: 73 75 63 63 65 73 73 6f 72 73 20 61 72 65 20 63  successors are c
6d00: 6f 6d 70 75 74 65 64 20 2a 2f 0a 7b 0a 20 20 73  omputed */.{.  s
6d10: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
6d20: 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  p;  /* For loopi
6d30: 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66  ng thru the conf
6d40: 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73  ig closure of "s
6d50: 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  tp" */.  struct 
6d60: 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a  config *bcfp; /*
6d70: 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c   For the inner l
6d80: 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c  oop on config cl
6d90: 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a  osure of "stp" *
6da0: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
6db0: 67 20 2a 6e 65 77 3b 20 20 2f 2a 20 2a 2f 0a 20  g *new;  /* */. 
6dc0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
6dd0: 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20  sp;   /* Symbol 
6de0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f  following the do
6df0: 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  t in configurati
6e00: 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20 73 74  on "cfp" */.  st
6e10: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 73 70  ruct symbol *bsp
6e20: 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c  ;  /* Symbol fol
6e30: 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69  lowing the dot i
6e40: 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  n configuration 
6e50: 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75  "bcfp" */.  stru
6e60: 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73 74 70  ct state *newstp
6e70: 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  ; /* A pointer t
6e80: 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20 73 74  o a successor st
6e90: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63  ate */..  /* Eac
6ea0: 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  h configuration 
6eb0: 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65 74 65  becomes complete
6ec0: 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74 69 62   after it contib
6ed0: 75 74 65 73 20 74 6f 20 61 20 73 75 63 63 65 73  utes to a succes
6ee0: 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  sor.  ** state. 
6ef0: 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c 6c 20   Initially, all 
6f00: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61  configurations a
6f10: 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f  re incomplete */
6f20: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
6f30: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
6f40: 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e 73 74  p->next) cfp->st
6f50: 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54  atus = INCOMPLET
6f60: 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  E;..  /* Loop th
6f70: 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66 69 67  rough all config
6f80: 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  urations of the 
6f90: 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f 0a 20  state "stp" */. 
6fa0: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
6fb0: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
6fc0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
6fd0: 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d  cfp->status==COM
6fe0: 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65  PLETE ) continue
6ff0: 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20  ;    /* Already 
7000: 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20 6c 6f  used by inner lo
7010: 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 66  op */.    if( cf
7020: 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d  p->dot>=cfp->rp-
7030: 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65  >nrhs ) continue
7040: 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66  ;  /* Can't shif
7050: 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20 2a 2f  t this config */
7060: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
7070: 72 65 73 65 74 28 29 3b 20 20 20 20 20 20 20 20  reset();        
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7090: 20 52 65 73 65 74 20 74 68 65 20 6e 65 77 20 63   Reset the new c
70a0: 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20 20 20  onfig set */.   
70b0: 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d 3e 72   sp = cfp->rp->r
70c0: 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20  hs[cfp->dot];   
70d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d            /* Sym
70e0: 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20 64 6f  bol after the do
70f0: 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  t */..    /* For
7100: 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61   every configura
7110: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74  tion in the stat
7120: 65 20 22 73 74 70 22 20 77 68 69 63 68 20 68 61  e "stp" which ha
7130: 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70  s the symbol "sp
7140: 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  ".    ** followi
7150: 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64 64 20  ng its dot, add 
7160: 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69 67 75  the same configu
7170: 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 62 61  ration to the ba
7180: 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a 20 20  sis set under.  
7190: 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f    ** constructio
71a0: 6e 20 62 75 74 20 77 69 74 68 20 74 68 65 20 64  n but with the d
71b0: 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65 20 73  ot shifted one s
71c0: 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72 69 67  ymbol to the rig
71d0: 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 62  ht. */.    for(b
71e0: 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b 20 62  cfp=cfp; bcfp; b
71f0: 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74 29 7b  cfp=bcfp->next){
7200: 0a 20 20 20 20 20 20 69 66 28 20 62 63 66 70 2d  .      if( bcfp-
7210: 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54  >status==COMPLET
7220: 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  E ) continue;   
7230: 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64   /* Already used
7240: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 63   */.      if( bc
7250: 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e 72  fp->dot>=bcfp->r
7260: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
7270: 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73 68 69  ue; /* Can't shi
7280: 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ft this one */. 
7290: 20 20 20 20 20 62 73 70 20 3d 20 62 63 66 70 2d       bsp = bcfp-
72a0: 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d 3e 64  >rp->rhs[bcfp->d
72b0: 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ot];           /
72c0: 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61 66 74  * Get symbol aft
72d0: 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20 20 20  er dot */.      
72e0: 69 66 28 20 21 73 61 6d 65 5f 73 79 6d 62 6f 6c  if( !same_symbol
72f0: 28 62 73 70 2c 73 70 29 20 29 20 63 6f 6e 74 69  (bsp,sp) ) conti
7300: 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20 4d 75 73  nue;      /* Mus
7310: 74 20 62 65 20 73 61 6d 65 20 61 73 20 66 6f 72  t be same as for
7320: 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20 20 20   "cfp" */.      
7330: 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43  bcfp->status = C
7340: 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20 20 20  OMPLETE;        
7350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72            /* Mar
7360: 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20 61 73  k this config as
7370: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e   used */.      n
7380: 65 77 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  ew = Configlist_
7390: 61 64 64 62 61 73 69 73 28 62 63 66 70 2d 3e 72  addbasis(bcfp->r
73a0: 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a  p,bcfp->dot+1);.
73b0: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28        Plink_add(
73c0: 26 6e 65 77 2d 3e 62 70 6c 70 2c 62 63 66 70 29  &new->bplp,bcfp)
73d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
73e0: 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  Get a pointer to
73f0: 20 74 68 65 20 73 74 61 74 65 20 64 65 73 63 72   the state descr
7400: 69 62 65 64 20 62 79 20 74 68 65 20 62 61 73 69  ibed by the basi
7410: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
7420: 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74  set.    ** const
7430: 72 75 63 74 65 64 20 69 6e 20 74 68 65 20 70 72  ructed in the pr
7440: 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a  eceding loop */.
7450: 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67 65 74      newstp = get
7460: 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20  state(lemp);..  
7470: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20 22    /* The state "
7480: 6e 65 77 73 74 70 22 20 69 73 20 72 65 61 63 68  newstp" is reach
7490: 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ed from the stat
74a0: 65 20 22 73 74 70 22 20 62 79 20 61 20 73 68 69  e "stp" by a shi
74b0: 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ft action.    **
74c0: 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20 22   on the symbol "
74d0: 73 70 22 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  sp" */.    if( s
74e0: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
74f0: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
7500: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
7510: 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73 75 62  (i=0; i<sp->nsub
7520: 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sym; i++){.     
7530: 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73     Action_add(&s
7540: 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2d  tp->ap,SHIFT,sp-
7550: 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63 68 61 72  >subsym[i],(char
7560: 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20 20  *)newstp);.     
7570: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
7580: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
7590: 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70  stp->ap,SHIFT,sp
75a0: 2c 28 63 68 61 72 20 2a 29 6e 65 77 73 74 70 29  ,(char *)newstp)
75b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
75c0: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74  *.** Construct t
75d0: 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  he propagation l
75e0: 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  inks.*/.void Fin
75f0: 64 4c 69 6e 6b 73 28 6c 65 6d 70 29 0a 73 74 72  dLinks(lemp).str
7600: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
7610: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  .{.  int i;.  st
7620: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
7630: 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74 72 75  , *other;.  stru
7640: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
7650: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70   struct plink *p
7660: 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73 65 6b  lp;..  /* Housek
7670: 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a 0a 20  eeping detail:. 
7680: 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65 72 79   ** Add to every
7690: 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b 20   propagate link 
76a0: 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 20 74  a pointer back t
76b0: 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f 0a 20  o the state to. 
76c0: 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20 6c 69   ** which the li
76d0: 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64 2e 20  nk is attached. 
76e0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
76f0: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
7700: 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
7710: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
7720: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
7730: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
7740: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
7750: 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70 3b 0a  cfp->stp = stp;.
7760: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7770: 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61 63 6b  Convert all back
7780: 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72 77 61  links into forwa
7790: 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c 79 20  rd links.  Only 
77a0: 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20 2a 2a  the forward.  **
77b0: 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65 64 20   links are used 
77c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  in the follow-se
77d0: 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20 2a  t computation. *
77e0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
77f0: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
7800: 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
7810: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
7820: 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63    for(cfp=stp->c
7830: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
7840: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66  ->next){.      f
7850: 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70 6c 70  or(plp=cfp->bplp
7860: 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e  ; plp; plp=plp->
7870: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 6f  next){.        o
7880: 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66 70 3b  ther = plp->cfp;
7890: 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61  .        Plink_a
78a0: 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c 70 2c  dd(&other->fplp,
78b0: 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cfp);.      }.  
78c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f    }.  }.}../* Co
78d0: 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c 6f 77  mpute all follow
78e0: 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 66 6f  sets..**.** A fo
78f0: 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65 20 73  llowset is the s
7900: 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62 6f 6c  et of all symbol
7910: 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f 6d 65  s which can come
7920: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
7930: 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67 75 72  after a configur
7940: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 46  ation..*/.void F
7950: 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 6c 65  indFollowSets(le
7960: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
7970: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
7980: 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  i;.  struct conf
7990: 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63  ig *cfp;.  struc
79a0: 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20  t plink *plp;.  
79b0: 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 20 20  int progress;.  
79c0: 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20 66  int change;..  f
79d0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
79e0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
79f0: 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e    for(cfp=lemp->
7a00: 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20  sorted[i]->cfp; 
7a10: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
7a20: 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e  xt){.      cfp->
7a30: 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c  status = INCOMPL
7a40: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ETE;.    }.  }. 
7a50: 20 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67   .  do{.    prog
7a60: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
7a70: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
7a80: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
7a90: 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d     for(cfp=lemp-
7aa0: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b  >sorted[i]->cfp;
7ab0: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
7ac0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
7ad0: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
7ae0: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
7af0: 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ue;.        for(
7b00: 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70  plp=cfp->fplp; p
7b10: 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78  lp; plp=plp->nex
7b20: 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68  t){.          ch
7b30: 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28  ange = SetUnion(
7b40: 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66  plp->cfp->fws,cf
7b50: 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20 20  p->fws);.       
7b60: 20 20 20 69 66 28 20 63 68 61 6e 67 65 20 29 7b     if( change ){
7b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 70  .            plp
7b80: 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20  ->cfp->status = 
7b90: 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20  INCOMPLETE;.    
7ba0: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
7bb0: 20 3d 20 31 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20   = 1;..  }..}.  
7bc0: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
7bd0: 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20  s = COMPLETE;.  
7be0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
7bf0: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
7c00: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
7c10: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
7c20: 28 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20  ();../* Compute 
7c30: 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f  the reduce actio
7c40: 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76 65 20  ns, and resolve 
7c50: 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f  conflicts..*/.vo
7c60: 69 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 6c  id FindActions(l
7c70: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
7c80: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
7c90: 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63 74 20 63   i,j;.  struct c
7ca0: 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74  onfig *cfp;.  st
7cb0: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
7cc0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
7cd0: 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72   *sp;.  struct r
7ce0: 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f 2a 20 41  ule *rp;..  /* A
7cf0: 64 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65  dd all of the re
7d00: 64 75 63 65 20 61 63 74 69 6f 6e 73 20 0a 20 20  duce actions .  
7d10: 2a 2a 20 41 20 72 65 64 75 63 65 20 61 63 74 69  ** A reduce acti
7d20: 6f 6e 20 69 73 20 61 64 64 65 64 20 66 6f 72 20  on is added for 
7d30: 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20  each element of 
7d40: 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20 6f 66  the followset of
7d50: 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67 75 72  .  ** a configur
7d60: 61 74 69 6f 6e 20 77 68 69 63 68 20 68 61 73 20  ation which has 
7d70: 69 74 73 20 64 6f 74 20 61 74 20 74 68 65 20 65  its dot at the e
7d80: 78 74 72 65 6d 65 20 72 69 67 68 74 2e 0a 20 20  xtreme right..  
7d90: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
7da0: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
7db0: 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  +){   /* Loop ov
7dc0: 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20 2a 2f  er all states */
7dd0: 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
7de0: 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
7df0: 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70  for(cfp=stp->cfp
7e00: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
7e10: 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20  next){  /* Loop 
7e20: 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69 67 75  over all configu
7e30: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  rations */.     
7e40: 20 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e 6e 72   if( cfp->rp->nr
7e50: 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 7b 20  hs==cfp->dot ){ 
7e60: 20 20 20 20 20 20 20 2f 2a 20 49 73 20 64 6f 74         /* Is dot
7e70: 20 61 74 20 65 78 74 72 65 6d 65 20 72 69 67 68   at extreme righ
7e80: 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  t? */.        fo
7e90: 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e  r(j=0; j<lemp->n
7ea0: 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a  terminal; j++){.
7eb0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 65            if( Se
7ec0: 74 46 69 6e 64 28 63 66 70 2d 3e 66 77 73 2c 6a  tFind(cfp->fws,j
7ed0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
7ee0: 20 2f 2a 20 41 64 64 20 61 20 72 65 64 75 63 65   /* Add a reduce
7ef0: 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 73   action to the s
7f00: 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68  tate "stp" which
7f10: 20 77 69 6c 6c 20 72 65 64 75 63 65 20 62 79 20   will reduce by 
7f20: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
7f30: 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e 72 70  ** rule "cfp->rp
7f40: 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65  " if the lookahe
7f50: 61 64 20 73 79 6d 62 6f 6c 20 69 73 20 22 6c 65  ad symbol is "le
7f60: 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 22 20  mp->symbols[j]" 
7f70: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  */.            A
7f80: 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e  ction_add(&stp->
7f90: 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70 2d 3e  ap,REDUCE,lemp->
7fa0: 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68 61 72  symbols[j],(char
7fb0: 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20 20 20   *)cfp->rp);.   
7fc0: 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20         }..}.    
7fd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
7fe0: 20 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63 65   /* Add the acce
7ff0: 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20  pting token */. 
8000: 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74   if( lemp->start
8010: 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d   ){.    sp = Sym
8020: 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73  bol_find(lemp->s
8030: 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tart);.    if( s
8040: 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d 70  p==0 ) sp = lemp
8050: 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d  ->rule->lhs;.  }
8060: 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c  else{.    sp = l
8070: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a  emp->rule->lhs;.
8080: 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74 6f 20    }.  /* Add to 
8090: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20  the first state 
80a0: 28 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73  (which is always
80b0: 20 74 68 65 20 73 74 61 72 74 69 6e 67 20 73 74   the starting st
80c0: 61 74 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ate of the.  ** 
80d0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
80e0: 68 69 6e 65 29 20 61 6e 20 61 63 74 69 6f 6e 20  hine) an action 
80f0: 74 6f 20 41 43 43 45 50 54 20 69 66 20 74 68 65  to ACCEPT if the
8100: 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20 74 68   lookahead is th
8110: 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e 6f 6e  e.  ** start non
8120: 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20  terminal.  */.  
8130: 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65 6d 70  Action_add(&lemp
8140: 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61 70 2c  ->sorted[0]->ap,
8150: 41 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a 0a 20  ACCEPT,sp,0);.. 
8160: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6e 66   /* Resolve conf
8170: 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69  licts */.  for(i
8180: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
8190: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
81a0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c  ruct action *ap,
81b0: 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74 72 75 63   *nap;.    struc
81c0: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
81d0: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
81e0: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 73 73  rted[i];.    ass
81f0: 65 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 0a  ert( stp->ap );.
8200: 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63      stp->ap = Ac
8210: 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61  tion_sort(stp->a
8220: 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  p);.    for(ap=s
8230: 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61 70  tp->ap; ap && ap
8240: 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e 6e  ->next; ap=ap->n
8250: 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ext){.      for(
8260: 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e 61  nap=ap->next; na
8270: 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61 70  p && nap->sp==ap
8280: 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e  ->sp; nap=nap->n
8290: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 2f  ext){.         /
82a0: 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69 6f 6e  * The two action
82b0: 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61 70 22  s "ap" and "nap"
82c0: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6c   have the same l
82d0: 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 20 20  ookahead..      
82e0: 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74     ** Figure out
82f0: 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f 75 6c   which one shoul
8300: 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20 20  d be used */.   
8310: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e        lemp->ncon
8320: 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76 65  flict += resolve
8330: 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61 70  _conflict(ap,nap
8340: 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 29 3b 0a  ,lemp->errsym);.
8350: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8360: 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 61  }..  /* Report a
8370: 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63 68  n error for each
8380: 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20 6e   rule that can n
8390: 65 76 65 72 20 62 65 20 72 65 64 75 63 65 64 2e  ever be reduced.
83a0: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
83b0: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
83c0: 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63 61  rp->next) rp->ca
83d0: 6e 52 65 64 75 63 65 20 3d 20 42 5f 46 41 4c 53  nReduce = B_FALS
83e0: 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  E;.  for(i=0; i<
83f0: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
8400: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61  +){.    struct a
8410: 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66  ction *ap;.    f
8420: 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  or(ap=lemp->sort
8430: 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61  ed[i]->ap; ap; a
8440: 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
8450: 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
8460: 3d 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78 2e  =REDUCE ) ap->x.
8470: 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20  rp->canReduce = 
8480: 42 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  B_TRUE;.    }.  
8490: 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  }.  for(rp=lemp-
84a0: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
84b0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
84c0: 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 29   rp->canReduce )
84d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45   continue;.    E
84e0: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
84f0: 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
8500: 69 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20 63  ine,"This rule c
8510: 61 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63 65  an not be reduce
8520: 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70  d.\n");.    lemp
8530: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
8540: 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20  }.}../* Resolve 
8550: 61 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77 65  a conflict betwe
8560: 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e  en the two given
8570: 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68   actions.  If th
8580: 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61  e.** conflict ca
8590: 6e 27 74 20 62 65 20 72 65 73 6f 6c 76 65 2c 20  n't be resolve, 
85a0: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
85b0: 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52  .**.** NO LONGER
85c0: 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72   TRUE:.**   To r
85d0: 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63  esolve a conflic
85e0: 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f  t, first look to
85f0: 20 73 65 65 20 69 66 20 65 69 74 68 65 72 20 61   see if either a
8600: 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e  ction.**   is on
8610: 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20   an error rule. 
8620: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
8630: 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77  ake the action w
8640: 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74  hich.**   is not
8650: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8660: 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e   the error rule.
8670: 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20    If neither or 
8680: 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e  both.**   action
8690: 73 20 61 72 65 20 61 73 73 6f 63 69 61 74 65 64  s are associated
86a0: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72   with an error r
86b0: 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  ule, then try to
86c0: 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65 64  .**   use preced
86d0: 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  ence to resolve 
86e0: 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a  the conflict..**
86f0: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61 63  .** If either ac
8700: 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c  tion is a SHIFT,
8710: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65   then it must be
8720: 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66   apx.  This.** f
8730: 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f  unction won't wo
8740: 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d  rk if apx->type=
8750: 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d  =REDUCE and apy-
8760: 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f  >type==SHIFT..*/
8770: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
8780: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 78  lve_conflict(apx
8790: 2c 61 70 79 2c 65 72 72 73 79 6d 29 0a 73 74 72  ,apy,errsym).str
87a0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 78 3b  uct action *apx;
87b0: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  .struct action *
87c0: 61 70 79 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  apy;.struct symb
87d0: 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a  ol *errsym;   /*
87e0: 20 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f   The error symbo
87f0: 6c 20 28 69 66 20 64 65 66 69 6e 65 64 2e 20 20  l (if defined.  
8800: 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 29 20  NULL otherwise) 
8810: 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  */.{.  struct sy
8820: 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79 3b  mbol *spx, *spy;
8830: 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20  .  int errcnt = 
8840: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 78  0;.  assert( apx
8850: 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29 3b  ->sp==apy->sp );
8860: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 74    /* Otherwise t
8870: 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e 6f  here would be no
8880: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
8890: 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48  f( apx->type==SH
88a0: 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65  IFT && apy->type
88b0: 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 61  ==SHIFT ){.    a
88c0: 70 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46 4c  py->type = CONFL
88d0: 49 43 54 3b 0a 20 20 20 20 65 72 72 63 6e 74 2b  ICT;.    errcnt+
88e0: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 70 78  +;.  }.  if( apx
88f0: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26  ->type==SHIFT &&
8900: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apy->type==REDU
8910: 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d 20  CE ){.    spx = 
8920: 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20 73 70 79  apx->sp;.    spy
8930: 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72   = apy->x.rp->pr
8940: 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73  ecsym;.    if( s
8950: 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72  py==0 || spx->pr
8960: 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e 70 72 65  ec<0 || spy->pre
8970: 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  c<0 ){.      /* 
8980: 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72 65 63 65  Not enough prece
8990: 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  dence informatio
89a0: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d  n. */.      apy-
89b0: 3e 74 79 70 65 20 3d 20 43 4f 4e 46 4c 49 43 54  >type = CONFLICT
89c0: 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b  ;.      errcnt++
89d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
89e0: 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70  spx->prec>spy->p
89f0: 72 65 63 20 29 7b 20 20 20 20 2f 2a 20 4c 6f 77  rec ){    /* Low
8a00: 65 72 20 70 72 65 63 65 64 65 6e 63 65 20 77 69  er precedence wi
8a10: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d  ns */.      apy-
8a20: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
8a30: 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  VED;.    }else i
8a40: 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79  f( spx->prec<spy
8a50: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
8a60: 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52  apx->type = SH_R
8a70: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
8a80: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
8a90: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
8aa0: 70 78 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54  px->assoc==RIGHT
8ab0: 20 29 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61   ){ /* Use opera
8ac0: 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  tor */.      apy
8ad0: 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f  ->type = RD_RESO
8ae0: 4c 56 45 44 3b 20 20 20 20 20 20 20 20 20 20 20  LVED;           
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69    /* associativi
8b10: 74 79 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  ty */.    }else 
8b20: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73  if( spx->prec==s
8b30: 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d  py->prec && spx-
8b40: 3e 61 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20  >assoc==LEFT ){ 
8b50: 20 2f 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65   /* to break tie
8b60: 20 2a 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   */.      apx->t
8b70: 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45  ype = SH_RESOLVE
8b80: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  D;.    }else{.  
8b90: 20 20 20 20 61 73 73 65 72 74 28 20 73 70 78 2d      assert( spx-
8ba0: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
8bb0: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
8bc0: 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70  NONE );.      ap
8bd0: 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46 4c 49  y->type = CONFLI
8be0: 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74  CT;.      errcnt
8bf0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
8c00: 65 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d  e if( apx->type=
8c10: 3d 52 45 44 55 43 45 20 26 26 20 61 70 79 2d 3e  =REDUCE && apy->
8c20: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a  type==REDUCE ){.
8c30: 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 78      spx = apx->x
8c40: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
8c50: 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72    spy = apy->x.r
8c60: 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20  p->precsym;.    
8c70: 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70  if( spx==0 || sp
8c80: 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65  y==0 || spx->pre
8c90: 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e  c<0 ||.    spy->
8ca0: 70 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70  prec<0 || spx->p
8cb0: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29  rec==spy->prec )
8cc0: 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  {.      apy->typ
8cd0: 65 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20  e = CONFLICT;.  
8ce0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
8cf0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
8d00: 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20  >prec>spy->prec 
8d10: 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  ){.      apy->ty
8d20: 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44  pe = RD_RESOLVED
8d30: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8d40: 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70  spx->prec<spy->p
8d50: 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78  rec ){.      apx
8d60: 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f  ->type = RD_RESO
8d70: 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LVED;.    }.  }e
8d80: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
8d90: 20 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70   .      apx->typ
8da0: 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c  e==SH_RESOLVED |
8db0: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
8dc0: 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c  e==RD_RESOLVED |
8dd0: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
8de0: 65 3d 3d 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  e==CONFLICT ||. 
8df0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
8e00: 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20  SH_RESOLVED ||. 
8e10: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
8e20: 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20  RD_RESOLVED ||. 
8e30: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
8e40: 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29 3b 0a  CONFLICT.    );.
8e50: 20 20 20 20 2f 2a 20 54 68 65 20 52 45 44 55 43      /* The REDUC
8e60: 45 2f 53 48 49 46 54 20 63 61 73 65 20 63 61 6e  E/SHIFT case can
8e70: 6e 6f 74 20 68 61 70 70 65 6e 20 62 65 63 61 75  not happen becau
8e80: 73 65 20 53 48 49 46 54 73 20 63 6f 6d 65 20 62  se SHIFTs come b
8e90: 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52 45 44  efore.    ** RED
8ea0: 55 43 45 73 20 6f 6e 20 74 68 65 20 6c 69 73 74  UCEs on the list
8eb0: 2e 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74  .  If we reach t
8ec0: 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73  his point it mus
8ed0: 74 20 62 65 20 62 65 63 61 75 73 65 0a 20 20 20  t be because.   
8ee0: 20 2a 2a 20 74 68 65 20 70 61 72 73 65 72 20 63   ** the parser c
8ef0: 6f 6e 66 6c 69 63 74 20 68 61 64 20 61 6c 72 65  onflict had alre
8f00: 61 64 79 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  ady been resolve
8f10: 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  d. */.  }.  retu
8f20: 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a  rn errcnt;.}./**
8f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f40: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
8f50: 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63 22  e "configlist.c"
8f60: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
8f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
8f80: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 70 72  * Routines to pr
8f90: 6f 63 65 73 73 69 6e 67 20 61 20 63 6f 6e 66 69  ocessing a confi
8fa0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
8fb0: 64 20 62 75 69 6c 64 69 6e 67 20 61 20 73 74 61  d building a sta
8fc0: 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d  te.** in the LEM
8fd0: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
8fe0: 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  tor..*/..static 
8ff0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 66  struct config *f
9000: 72 65 65 6c 69 73 74 20 3d 20 30 3b 20 20 20 20  reelist = 0;    
9010: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
9020: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  e configurations
9030: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
9040: 74 20 63 6f 6e 66 69 67 20 2a 63 75 72 72 65 6e  t config *curren
9050: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
9060: 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 63  Top of list of c
9070: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
9080: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
9090: 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e 74 65  onfig **currente
90a0: 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61 73  nd = 0;   /* Las
90b0: 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f 6e  t on list of con
90c0: 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  figs */.static s
90d0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 61  truct config *ba
90e0: 73 69 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sis = 0;        
90f0: 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20   /* Top of list 
9100: 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73  of basis configs
9110: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
9120: 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69 73  t config **basis
9130: 65 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  end = 0;     /* 
9140: 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66 20 62  End of list of b
9150: 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  asis configs */.
9160: 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
9170: 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 6f  nter to a new co
9180: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50  nfiguration */.P
9190: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 63 6f  RIVATE struct co
91a0: 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67 28  nfig *newconfig(
91b0: 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  ){.  struct conf
91c0: 69 67 20 2a 6e 65 77 3b 0a 20 20 69 66 28 20 66  ig *new;.  if( f
91d0: 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
91e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
91f0: 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20 66 72   amt = 3;.    fr
9200: 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74  eelist = (struct
9210: 20 63 6f 6e 66 69 67 20 2a 29 6d 61 6c 6c 6f 63   config *)malloc
9220: 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
9230: 63 6f 6e 66 69 67 29 2a 61 6d 74 20 29 3b 0a 20  config)*amt );. 
9240: 20 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d     if( freelist=
9250: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  =0 ){.      fpri
9260: 6e 74 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62  ntf(stderr,"Unab
9270: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
9280: 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
9290: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 22 29  configuration.")
92a0: 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
92b0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
92c0: 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
92d0: 29 20 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  ) freelist[i].ne
92e0: 78 74 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69  xt = &freelist[i
92f0: 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  +1];.    freelis
9300: 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
9310: 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 66  0;.  }.  new = f
9320: 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c  reelist;.  freel
9330: 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e  ist = freelist->
9340: 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  next;.  return n
9350: 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f  ew;.}../* The co
9360: 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 6f 6c 64  nfiguration "old
9370: 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  " is no longer u
9380: 73 65 64 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  sed */.PRIVATE v
9390: 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e 66 69 67  oid deleteconfig
93a0: 28 6f 6c 64 29 0a 73 74 72 75 63 74 20 63 6f 6e  (old).struct con
93b0: 66 69 67 20 2a 6f 6c 64 3b 0a 7b 0a 20 20 6f 6c  fig *old;.{.  ol
93c0: 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c 69  d->next = freeli
93d0: 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d  st;.  freelist =
93e0: 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74   old;.}../* Init
93f0: 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66  ialized the conf
9400: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62  iguration list b
9410: 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43  uilder */.void C
9420: 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29  onfiglist_init()
9430: 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  {.  current = 0;
9440: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
9450: 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69  &current;.  basi
9460: 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e  s = 0;.  basisen
9470: 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f  d = &basis;.  Co
9480: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29  nfigtable_init()
9490: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
94a0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68  * Initialized th
94b0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
94c0: 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a  list builder */.
94d0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
94e0: 72 65 73 65 74 28 29 7b 0a 20 20 63 75 72 72 65  reset(){.  curre
94f0: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
9500: 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b  tend = &current;
9510: 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20  .  basis = 0;.  
9520: 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69  basisend = &basi
9530: 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65  s;.  Configtable
9540: 5f 63 6c 65 61 72 28 30 29 3b 0a 20 20 72 65 74  _clear(0);.  ret
9550: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  urn;.}../* Add a
9560: 6e 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61  nother configura
9570: 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66  tion to the conf
9580: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a  iguration list *
9590: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
95a0: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28  *Configlist_add(
95b0: 72 70 2c 64 6f 74 29 0a 73 74 72 75 63 74 20 72  rp,dot).struct r
95c0: 75 6c 65 20 2a 72 70 3b 20 20 20 20 2f 2a 20 54  ule *rp;    /* T
95d0: 68 65 20 72 75 6c 65 20 2a 2f 0a 69 6e 74 20 64  he rule */.int d
95e0: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ot;            /
95f0: 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  * Index into the
9600: 20 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c 65   RHS of the rule
9610: 20 77 68 65 72 65 20 74 68 65 20 64 6f 74 20 67   where the dot g
9620: 6f 65 73 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63  oes */.{.  struc
9630: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d  t config *cfp, m
9640: 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28  odel;..  assert(
9650: 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29   currentend!=0 )
9660: 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72  ;.  model.rp = r
9670: 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d  p;.  model.dot =
9680: 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f   dot;.  cfp = Co
9690: 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26  nfigtable_find(&
96a0: 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66  model);.  if( cf
96b0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20  p==0 ){.    cfp 
96c0: 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20  = newconfig();. 
96d0: 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b     cfp->rp = rp;
96e0: 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20  .    cfp->dot = 
96f0: 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77  dot;.    cfp->fw
9700: 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20  s = SetNew();.  
9710: 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a    cfp->stp = 0;.
9720: 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20      cfp->fplp = 
9730: 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20  cfp->bplp = 0;. 
9740: 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30     cfp->next = 0
9750: 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20  ;.    cfp->bp = 
9760: 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65  0;.    *currente
9770: 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75  nd = cfp;.    cu
9780: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d  rrentend = &cfp-
9790: 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f 6e 66 69  >next;.    Confi
97a0: 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66  gtable_insert(cf
97b0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
97c0: 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20   cfp;.}../* Add 
97d0: 61 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  a basis configur
97e0: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e  ation to the con
97f0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
9800: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
9810: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   *Configlist_add
9820: 62 61 73 69 73 28 72 70 2c 64 6f 74 29 0a 73 74  basis(rp,dot).st
9830: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 69  ruct rule *rp;.i
9840: 6e 74 20 64 6f 74 3b 0a 7b 0a 20 20 73 74 72 75  nt dot;.{.  stru
9850: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20  ct config *cfp, 
9860: 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74  model;..  assert
9870: 28 20 62 61 73 69 73 65 6e 64 21 3d 30 20 29 3b  ( basisend!=0 );
9880: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65  .  assert( curre
9890: 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f  ntend!=0 );.  mo
98a0: 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d  del.rp = rp;.  m
98b0: 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a  odel.dot = dot;.
98c0: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61    cfp = Configta
98d0: 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29  ble_find(&model)
98e0: 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29  ;.  if( cfp==0 )
98f0: 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63  {.    cfp = newc
9900: 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70  onfig();.    cfp
9910: 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63  ->rp = rp;.    c
9920: 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  fp->dot = dot;. 
9930: 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65     cfp->fws = Se
9940: 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d  tNew();.    cfp-
9950: 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  >stp = 0;.    cf
9960: 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62  p->fplp = cfp->b
9970: 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  plp = 0;.    cfp
9980: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
9990: 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20  cfp->bp = 0;.   
99a0: 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63   *currentend = c
99b0: 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65  fp;.    currente
99c0: 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b  nd = &cfp->next;
99d0: 0a 20 20 20 20 2a 62 61 73 69 73 65 6e 64 20 3d  .    *basisend =
99e0: 20 63 66 70 3b 0a 20 20 20 20 62 61 73 69 73 65   cfp;.    basise
99f0: 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20  nd = &cfp->bp;. 
9a00: 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69     Configtable_i
9a10: 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a  nsert(cfp);.  }.
9a20: 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a    return cfp;.}.
9a30: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
9a40: 63 6c 6f 73 75 72 65 20 6f 66 20 74 68 65 20 63  closure of the c
9a50: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9a60: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
9a70: 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d  list_closure(lem
9a80: 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
9a90: 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63  *lemp;.{.  struc
9aa0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a  t config *cfp, *
9ab0: 6e 65 77 63 66 70 3b 0a 20 20 73 74 72 75 63 74  newcfp;.  struct
9ac0: 20 72 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72   rule *rp, *newr
9ad0: 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  p;.  struct symb
9ae0: 6f 6c 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20  ol *sp, *xsp;.  
9af0: 69 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61  int i, dot;..  a
9b00: 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e  ssert( currenten
9b10: 64 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63 66  d!=0 );.  for(cf
9b20: 70 3d 63 75 72 72 65 6e 74 3b 20 63 66 70 3b 20  p=current; cfp; 
9b30: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
9b40: 20 20 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70      rp = cfp->rp
9b50: 3b 0a 20 20 20 20 64 6f 74 20 3d 20 63 66 70 2d  ;.    dot = cfp-
9b60: 3e 64 6f 74 3b 0a 20 20 20 20 69 66 28 20 64 6f  >dot;.    if( do
9b70: 74 3e 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f  t>=rp->nrhs ) co
9b80: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d  ntinue;.    sp =
9b90: 20 72 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20   rp->rhs[dot];. 
9ba0: 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
9bb0: 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  =NONTERMINAL ){.
9bc0: 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 72 75        if( sp->ru
9bd0: 6c 65 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d  le==0 && sp!=lem
9be0: 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20  p->errsym ){.   
9bf0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
9c00: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
9c10: 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e  >line,"Nontermin
9c20: 61 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f  al \"%s\" has no
9c30: 20 72 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20   rules.",.      
9c40: 20 20 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20      sp->name);. 
9c50: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
9c60: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
9c70: 0a 20 20 20 20 20 20 66 6f 72 28 6e 65 77 72 70  .      for(newrp
9c80: 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70  =sp->rule; newrp
9c90: 3b 20 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e  ; newrp=newrp->n
9ca0: 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 20 20 20  extlhs){.       
9cb0: 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67   newcfp = Config
9cc0: 6c 69 73 74 5f 61 64 64 28 6e 65 77 72 70 2c 30  list_add(newrp,0
9cd0: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
9ce0: 3d 64 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72  =dot+1; i<rp->nr
9cf0: 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
9d00: 20 20 20 20 78 73 70 20 3d 20 72 70 2d 3e 72 68      xsp = rp->rh
9d10: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
9d20: 69 66 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54  if( xsp->type==T
9d30: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
9d40: 20 20 20 20 20 20 20 53 65 74 41 64 64 28 6e 65         SetAdd(ne
9d50: 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69  wcfp->fws,xsp->i
9d60: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ndex);.         
9d70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9d80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 73      }else if( xs
9d90: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
9da0: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
9db0: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
9dc0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30           for(k=0
9dd0: 3b 20 6b 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d  ; k<xsp->nsubsym
9de0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
9df0: 20 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77        SetAdd(new
9e00: 63 66 70 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73  cfp->fws, xsp->s
9e10: 75 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29  ubsym[k]->index)
9e20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9e40: 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20  k;..  }else{.   
9e50: 20 20 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f           SetUnio
9e60: 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73  n(newcfp->fws,xs
9e70: 70 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20  p->firstset);.  
9e80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73            if( xs
9e90: 70 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c  p->lambda==B_FAL
9ea0: 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 20 20 7d  SE ) break;..  }
9eb0: 0a 09 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ..}.        if( 
9ec0: 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c  i==rp->nrhs ) Pl
9ed0: 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66 70  ink_add(&cfp->fp
9ee0: 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20 20  lp,newcfp);.    
9ef0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9f00: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f  return;.}../* So
9f10: 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  rt the configura
9f20: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
9f30: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
9f40: 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  t(){.  current =
9f50: 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20   (struct config 
9f60: 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29  *)msort((char *)
9f70: 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20 2a 2a  current,(char **
9f80: 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74  )&(current->next
9f90: 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20  ),Configcmp);.  
9fa0: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a  currentend = 0;.
9fb0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
9fc0: 53 6f 72 74 20 74 68 65 20 62 61 73 69 73 20 63  Sort the basis c
9fd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9fe0: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
9ff0: 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29  list_sortbasis()
a000: 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74 72  {.  basis = (str
a010: 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f  uct config *)mso
a020: 72 74 28 28 63 68 61 72 20 2a 29 63 75 72 72 65  rt((char *)curre
a030: 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26 28 63 75  nt,(char **)&(cu
a040: 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66 69  rrent->bp),Confi
a050: 67 63 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e  gcmp);.  basisen
a060: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
a070: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
a080: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
a090: 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ead of the confi
a0a0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
a0b0: 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c  d.** reset the l
a0c0: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
a0d0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
a0e0: 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20 73 74 72  _return(){.  str
a0f0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
a100: 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74  .  old = current
a110: 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  ;.  current = 0;
a120: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
a130: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
a140: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
a150: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
a160: 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ead of the confi
a170: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
a180: 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c  d.** reset the l
a190: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
a1a0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
a1b0: 5f 62 61 73 69 73 28 29 7b 0a 20 20 73 74 72 75  _basis(){.  stru
a1c0: 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a  ct config *old;.
a1d0: 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20    old = basis;. 
a1e0: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
a1f0: 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  sisend = 0;.  re
a200: 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20  turn old;.}../* 
a210: 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  Free all element
a220: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63  s of the given c
a230: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
a240: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
a250: 6c 69 73 74 5f 65 61 74 28 63 66 70 29 0a 73 74  list_eat(cfp).st
a260: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
a270: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
a280: 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20  fig *nextcfp;.  
a290: 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e  for(; cfp; cfp=n
a2a0: 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78  extcfp){.    nex
a2b0: 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74  tcfp = cfp->next
a2c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 66  ;.    assert( cf
a2d0: 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20  p->fplp==0 );.  
a2e0: 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62    assert( cfp->b
a2f0: 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  plp==0 );.    if
a300: 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74  ( cfp->fws ) Set
a310: 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a  Free(cfp->fws);.
a320: 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67      deleteconfig
a330: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
a340: 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  urn;.}./********
a350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
a360: 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63  he file "error.c
a370: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
a380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a390: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ***/./*.** Code 
a3a0: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72  for printing err
a3b0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a  or message..*/..
a3c0: 2f 2a 20 46 69 6e 64 20 61 20 67 6f 6f 64 20 70  /* Find a good p
a3d0: 6c 61 63 65 20 74 6f 20 62 72 65 61 6b 20 22 6d  lace to break "m
a3e0: 73 67 22 20 73 6f 20 74 68 61 74 20 69 74 73 20  sg" so that its 
a3f0: 6c 65 6e 67 74 68 20 69 73 20 61 74 20 6c 65 61  length is at lea
a400: 73 74 20 22 6d 69 6e 22 0a 2a 2a 20 62 75 74 20  st "min".** but 
a410: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 22 6d 61  no more than "ma
a420: 78 22 2e 20 20 4d 61 6b 65 20 74 68 65 20 70 6f  x".  Make the po
a430: 69 6e 74 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  int as close to 
a440: 6d 61 78 20 61 73 20 70 6f 73 73 69 62 6c 65 2e  max as possible.
a450: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a460: 69 6e 64 62 72 65 61 6b 28 6d 73 67 2c 6d 69 6e  indbreak(msg,min
a470: 2c 6d 61 78 29 0a 63 68 61 72 20 2a 6d 73 67 3b  ,max).char *msg;
a480: 0a 69 6e 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d 61  .int min;.int ma
a490: 78 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 73 70 6f  x;.{.  int i,spo
a4a0: 74 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66  t;.  char c;.  f
a4b0: 6f 72 28 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20 69  or(i=spot=min; i
a4c0: 3c 3d 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  <=max; i++){.   
a4d0: 20 63 20 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20 20   c = msg[i];.   
a4e0: 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 20 6d   if( c=='\t' ) m
a4f0: 73 67 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20 20  sg[i] = ' ';.   
a500: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 20   if( c=='\n' ){ 
a510: 6d 73 67 5b 69 5d 20 3d 20 27 20 27 3b 20 73 70  msg[i] = ' '; sp
a520: 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d  ot = i; break; }
a530: 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  .    if( c==0 ){
a540: 20 73 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b   spot = i; break
a550: 3b 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  ; }.    if( c=='
a560: 2d 27 20 26 26 20 69 3c 6d 61 78 2d 31 20 29 20  -' && i<max-1 ) 
a570: 73 70 6f 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20  spot = i+1;.    
a580: 69 66 28 20 63 3d 3d 27 20 27 20 29 20 73 70 6f  if( c==' ' ) spo
a590: 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  t = i;.  }.  ret
a5a0: 75 72 6e 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a  urn spot;.}../*.
a5b0: 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73  ** The error mes
a5c0: 73 61 67 65 20 69 73 20 73 70 6c 69 74 20 61 63  sage is split ac
a5d0: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 20 6c 69  ross multiple li
a5e0: 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79  nes if necessary
a5f0: 2e 20 20 54 68 65 0a 2a 2a 20 73 70 6c 69 74 73  .  The.** splits
a600: 20 6f 63 63 75 72 20 61 74 20 61 20 73 70 61 63   occur at a spac
a610: 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  e, if there is a
a620: 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
a630: 20 6e 65 61 72 20 74 68 65 20 65 6e 64 0a 2a 2a   near the end.**
a640: 20 6f 66 20 74 68 65 20 6c 69 6e 65 2e 0a 2a 2f   of the line..*/
a650: 0a 23 64 65 66 69 6e 65 20 45 52 52 4d 53 47 53  .#define ERRMSGS
a660: 49 5a 45 20 20 31 30 30 30 30 20 2f 2a 20 48 6f  IZE  10000 /* Ho
a670: 70 65 20 74 68 69 73 20 69 73 20 62 69 67 20 65  pe this is big e
a680: 6e 6f 75 67 68 2e 20 20 4e 6f 20 77 61 79 20 74  nough.  No way t
a690: 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 20 2a 2f  o error check */
a6a0: 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 57 49 44  .#define LINEWID
a6b0: 54 48 20 20 20 20 20 20 37 39 20 2f 2a 20 4d 61  TH      79 /* Ma
a6c0: 78 20 77 69 64 74 68 20 6f 66 20 61 6e 79 20 6f  x width of any o
a6d0: 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 23 64  utput line */.#d
a6e0: 65 66 69 6e 65 20 50 52 45 46 49 58 4c 49 4d 49  efine PREFIXLIMI
a6f0: 54 20 20 20 20 33 30 20 2f 2a 20 4d 61 78 20 77  T    30 /* Max w
a700: 69 64 74 68 20 6f 66 20 74 68 65 20 70 72 65 66  idth of the pref
a710: 69 78 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20  ix on each line 
a720: 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67  */.void ErrorMsg
a730: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c  (const char *fil
a740: 65 6e 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e  ename, int linen
a750: 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  o, const char *f
a760: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63  ormat, ...){.  c
a770: 68 61 72 20 65 72 72 6d 73 67 5b 45 52 52 4d 53  har errmsg[ERRMS
a780: 47 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70  GSIZE];.  char p
a790: 72 65 66 69 78 5b 50 52 45 46 49 58 4c 49 4d 49  refix[PREFIXLIMI
a7a0: 54 2b 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72 72  T+10];.  int err
a7b0: 6d 73 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20 70  msgsize;.  int p
a7c0: 72 65 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e 74  refixsize;.  int
a7d0: 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68 3b   availablewidth;
a7e0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
a7f0: 20 69 6e 74 20 65 6e 64 2c 20 72 65 73 74 61 72   int end, restar
a800: 74 2c 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f 73  t, base;..  va_s
a810: 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29  tart(ap, format)
a820: 3b 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61  ;.  /* Prepare a
a830: 20 70 72 65 66 69 78 20 74 6f 20 62 65 20 70 72   prefix to be pr
a840: 65 70 65 6e 64 65 64 20 74 6f 20 65 76 65 72 79  epended to every
a850: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a   output line */.
a860: 20 20 69 66 28 20 6c 69 6e 65 6e 6f 3e 30 20 29    if( lineno>0 )
a870: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 72  {.    sprintf(pr
a880: 65 66 69 78 2c 22 25 2e 2a 73 3a 25 64 3a 20 22  efix,"%.*s:%d: "
a890: 2c 50 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c  ,PREFIXLIMIT-10,
a8a0: 66 69 6c 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29  filename,lineno)
a8b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
a8c0: 70 72 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25  printf(prefix,"%
a8d0: 2e 2a 73 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d  .*s: ",PREFIXLIM
a8e0: 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 29 3b  IT-10,filename);
a8f0: 0a 20 20 7d 0a 20 20 70 72 65 66 69 78 73 69 7a  .  }.  prefixsiz
a900: 65 20 3d 20 73 74 72 6c 65 6e 28 70 72 65 66 69  e = strlen(prefi
a910: 78 29 3b 0a 20 20 61 76 61 69 6c 61 62 6c 65 77  x);.  availablew
a920: 69 64 74 68 20 3d 20 4c 49 4e 45 57 49 44 54 48  idth = LINEWIDTH
a930: 20 2d 20 70 72 65 66 69 78 73 69 7a 65 3b 0a 0a   - prefixsize;..
a940: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
a950: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
a960: 2a 2f 0a 20 20 76 73 70 72 69 6e 74 66 28 65 72  */.  vsprintf(er
a970: 72 6d 73 67 2c 66 6f 72 6d 61 74 2c 61 70 29 3b  rmsg,format,ap);
a980: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
a990: 20 65 72 72 6d 73 67 73 69 7a 65 20 3d 20 73 74   errmsgsize = st
a9a0: 72 6c 65 6e 28 65 72 72 6d 73 67 29 3b 0a 20 20  rlen(errmsg);.  
a9b0: 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61 69 6c 69  /* Remove traili
a9c0: 6e 67 20 27 5c 6e 27 73 20 66 72 6f 6d 20 74 68  ng '\n's from th
a9d0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
a9e0: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 65 72 72   */.  while( err
a9f0: 6d 73 67 73 69 7a 65 3e 30 20 26 26 20 65 72 72  msgsize>0 && err
aa00: 6d 73 67 5b 65 72 72 6d 73 67 73 69 7a 65 2d 31  msg[errmsgsize-1
aa10: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
aa20: 65 72 72 6d 73 67 5b 2d 2d 65 72 72 6d 73 67 73  errmsg[--errmsgs
aa30: 69 7a 65 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ize] = 0;.  }.. 
aa40: 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 65 72   /* Print the er
aa50: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
aa60: 20 62 61 73 65 20 3d 20 30 3b 0a 20 20 77 68 69   base = 0;.  whi
aa70: 6c 65 28 20 65 72 72 6d 73 67 5b 62 61 73 65 5d  le( errmsg[base]
aa80: 21 3d 30 20 29 7b 0a 20 20 20 20 65 6e 64 20 3d  !=0 ){.    end =
aa90: 20 72 65 73 74 61 72 74 20 3d 20 66 69 6e 64 62   restart = findb
aaa0: 72 65 61 6b 28 26 65 72 72 6d 73 67 5b 62 61 73  reak(&errmsg[bas
aab0: 65 5d 2c 30 2c 61 76 61 69 6c 61 62 6c 65 77 69  e],0,availablewi
aac0: 64 74 68 29 3b 0a 20 20 20 20 72 65 73 74 61 72  dth);.    restar
aad0: 74 20 2b 3d 20 62 61 73 65 3b 0a 20 20 20 20 77  t += base;.    w
aae0: 68 69 6c 65 28 20 65 72 72 6d 73 67 5b 72 65 73  hile( errmsg[res
aaf0: 74 61 72 74 5d 3d 3d 27 20 27 20 29 20 72 65 73  tart]==' ' ) res
ab00: 74 61 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72 69  tart++;.    fpri
ab10: 6e 74 66 28 73 74 64 6f 75 74 2c 22 25 73 25 2e  ntf(stdout,"%s%.
ab20: 2a 73 5c 6e 22 2c 70 72 65 66 69 78 2c 65 6e 64  *s\n",prefix,end
ab30: 2c 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 29 3b  ,&errmsg[base]);
ab40: 0a 20 20 20 20 62 61 73 65 20 3d 20 72 65 73 74  .    base = rest
ab50: 61 72 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a  art;.  }.}./****
ab60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
ab70: 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e  m the file "main
ab80: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
ab90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aba0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
abb0: 4d 61 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c  Main program fil
abc0: 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20  e for the LEMON 
abd0: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
abe0: 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20  ..*/../* Report 
abf0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
ac00: 20 63 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61   condition and a
ac10: 62 6f 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63  bort.  This func
ac20: 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20  tion.** is used 
ac30: 6d 6f 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d  mostly by the "M
ac40: 65 6d 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72  emoryCheck" macr
ac50: 6f 20 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f  o in struct.h.*/
ac60: 0a 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72  .void memory_err
ac70: 6f 72 28 29 7b 0a 20 20 66 70 72 69 6e 74 66 28  or(){.  fprintf(
ac80: 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
ac90: 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67  emory.  Aborting
aca0: 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28  ...\n");.  exit(
acb0: 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  1);.}..static in
acc0: 74 20 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20 20  t nDefine = 0;  
acd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ace0: 20 2d 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20 74   -D options on t
acf0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
ad00: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
ad10: 2a 61 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20 20  *azDefine = 0;  
ad20: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 2d  /* Name of the -
ad30: 44 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20  D macros */../* 
ad40: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
ad50: 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
ad60: 61 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63 68  argument to each
ad70: 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65   -D command-line
ad80: 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20   option..** Add 
ad90: 74 68 65 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  the macro define
ada0: 64 20 74 6f 20 74 68 65 20 61 7a 44 65 66 69 6e  d to the azDefin
adb0: 65 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  e array..*/.stat
adc0: 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 44  ic void handle_D
add0: 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29  _option(char *z)
ade0: 7b 0a 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b 0a  {.  char **paz;.
adf0: 20 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20 61    nDefine++;.  a
ae00: 7a 44 65 66 69 6e 65 20 3d 20 72 65 61 6c 6c 6f  zDefine = reallo
ae10: 63 28 61 7a 44 65 66 69 6e 65 2c 20 73 69 7a 65  c(azDefine, size
ae20: 6f 66 28 61 7a 44 65 66 69 6e 65 5b 30 5d 29 2a  of(azDefine[0])*
ae30: 6e 44 65 66 69 6e 65 29 3b 0a 20 20 69 66 28 20  nDefine);.  if( 
ae40: 61 7a 44 65 66 69 6e 65 3d 3d 30 20 29 7b 0a 20  azDefine==0 ){. 
ae50: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
ae60: 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"out of memory
ae70: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
ae80: 29 3b 0a 20 20 7d 0a 20 20 70 61 7a 20 3d 20 26  );.  }.  paz = &
ae90: 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65  azDefine[nDefine
aea0: 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20 3d 20 6d 61  -1];.  *paz = ma
aeb0: 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 7a 29 2b  lloc( strlen(z)+
aec0: 31 20 29 3b 0a 20 20 69 66 28 20 2a 70 61 7a 3d  1 );.  if( *paz=
aed0: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
aee0: 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66  f(stderr,"out of
aef0: 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
af00: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
af10: 73 74 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b  strcpy(*paz, z);
af20: 0a 20 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a  .  for(z=*paz; *
af30: 7a 20 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b  z && *z!='='; z+
af40: 2b 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d  +){}.  *z = 0;.}
af50: 0a 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70  .../* The main p
af60: 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74  rogram.  Parse t
af70: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
af80: 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a  and do it... */.
af90: 69 6e 74 20 6d 61 69 6e 28 61 72 67 63 2c 61 72  int main(argc,ar
afa0: 67 76 29 0a 69 6e 74 20 61 72 67 63 3b 0a 63 68  gv).int argc;.ch
afb0: 61 72 20 2a 2a 61 72 67 76 3b 0a 7b 0a 20 20 73  ar **argv;.{.  s
afc0: 74 61 74 69 63 20 69 6e 74 20 76 65 72 73 69 6f  tatic int versio
afd0: 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  n = 0;.  static 
afe0: 69 6e 74 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a  int rpflag = 0;.
aff0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 61 73    static int bas
b000: 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74  isflag = 0;.  st
b010: 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 72 65 73  atic int compres
b020: 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  s = 0;.  static 
b030: 69 6e 74 20 71 75 69 65 74 20 3d 20 30 3b 0a 20  int quiet = 0;. 
b040: 20 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74   static int stat
b050: 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 73 74  istics = 0;.  st
b060: 61 74 69 63 20 69 6e 74 20 6d 68 66 6c 61 67 20  atic int mhflag 
b070: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74  = 0;.  static st
b080: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f  ruct s_options o
b090: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20  ptions[] = {.   
b0a0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c   {OPT_FLAG, "b",
b0b0: 20 28 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c   (char*)&basisfl
b0c0: 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20  ag, "Print only 
b0d0: 74 68 65 20 62 61 73 69 73 20 69 6e 20 72 65 70  the basis in rep
b0e0: 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ort."},.    {OPT
b0f0: 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61  _FLAG, "c", (cha
b100: 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44  r*)&compress, "D
b110: 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68  on't compress th
b120: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22  e action table."
b130: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
b140: 2c 20 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61  , "D", (char*)ha
b150: 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22  ndle_D_option, "
b160: 44 65 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66  Define an %ifdef
b170: 20 6d 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b   macro."},.    {
b180: 4f 50 54 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28  OPT_FLAG, "g", (
b190: 63 68 61 72 2a 29 26 72 70 66 6c 61 67 2c 20 22  char*)&rpflag, "
b1a0: 50 72 69 6e 74 20 67 72 61 6d 6d 61 72 20 77 69  Print grammar wi
b1b0: 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d  thout actions."}
b1c0: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
b1d0: 20 22 6d 22 2c 20 28 63 68 61 72 2a 29 26 6d 68   "m", (char*)&mh
b1e0: 66 6c 61 67 2c 20 22 4f 75 74 70 75 74 20 61 20  flag, "Output a 
b1f0: 6d 61 6b 65 68 65 61 64 65 72 73 20 63 6f 6d 70  makeheaders comp
b200: 61 74 69 62 6c 65 20 66 69 6c 65 22 7d 2c 0a 20  atible file"},. 
b210: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71     {OPT_FLAG, "q
b220: 22 2c 20 28 63 68 61 72 2a 29 26 71 75 69 65 74  ", (char*)&quiet
b230: 2c 20 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74  , "(Quiet) Don't
b240: 20 70 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72   print the repor
b250: 74 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b  t file."},.    {
b260: 4f 50 54 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28  OPT_FLAG, "s", (
b270: 63 68 61 72 2a 29 26 73 74 61 74 69 73 74 69 63  char*)&statistic
b280: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 20 20 20 20 20 20 22 50 72 69 6e 74 20 70 61 72        "Print par
b2b0: 73 65 72 20 73 74 61 74 73 20 74 6f 20 73 74 61  ser stats to sta
b2c0: 6e 64 61 72 64 20 6f 75 74 70 75 74 2e 22 7d 2c  ndard output."},
b2d0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
b2e0: 22 78 22 2c 20 28 63 68 61 72 2a 29 26 76 65 72  "x", (char*)&ver
b2f0: 73 69 6f 6e 2c 20 22 50 72 69 6e 74 20 74 68 65  sion, "Print the
b300: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e   version number.
b310: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b320: 47 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20  G,0,0,0}.  };.  
b330: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
b340: 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70  lemon lem;..  Op
b350: 74 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f  tInit(argv,optio
b360: 6e 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66  ns,stderr);.  if
b370: 28 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20  ( version ){.   
b380: 20 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20    printf("Lemon 
b390: 76 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b  version 1.0\n");
b3a0: 0a 20 20 20 20 20 65 78 69 74 28 30 29 3b 20 0a  .     exit(0); .
b3b0: 20 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72    }.  if( OptNAr
b3c0: 67 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66  gs()!=1 ){.    f
b3d0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
b3e0: 78 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e  xactly one filen
b3f0: 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
b400: 72 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20  required.\n");. 
b410: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
b420: 20 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30    memset(&lem, 0
b430: 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a  , sizeof(lem));.
b440: 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d    lem.errorcnt =
b450: 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   0;..  /* Initia
b460: 6c 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65  lize the machine
b470: 20 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e   */.  Strsafe_in
b480: 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69  it();.  Symbol_i
b490: 6e 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69  nit();.  State_i
b4a0: 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67  nit();.  lem.arg
b4b0: 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20  v0 = argv[0];.  
b4c0: 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f  lem.filename = O
b4d0: 70 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e  ptArg(0);.  lem.
b4e0: 62 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69  basisflag = basi
b4f0: 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f 6c 5f  sflag;.  Symbol_
b500: 6e 65 77 28 22 24 22 29 3b 0a 20 20 6c 65 6d 2e  new("$");.  lem.
b510: 65 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f  errsym = Symbol_
b520: 6e 65 77 28 22 65 72 72 6f 72 22 29 3b 0a 0a 20  new("error");.. 
b530: 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e   /* Parse the in
b540: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61  put file */.  Pa
b550: 72 73 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28  rse(&lem);.  if(
b560: 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20   lem.errorcnt ) 
b570: 65 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e  exit(lem.errorcn
b580: 74 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72  t);.  if( lem.nr
b590: 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ule==0 ){.    fp
b5a0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d  rintf(stderr,"Em
b5b0: 70 74 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29  pty grammar.\n")
b5c0: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
b5d0: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61   }..  /* Count a
b5e0: 6e 64 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d  nd index the sym
b5f0: 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d  bols of the gram
b600: 6d 61 72 20 2a 2f 0a 20 20 6c 65 6d 2e 6e 73 79  mar */.  lem.nsy
b610: 6d 62 6f 6c 20 3d 20 53 79 6d 62 6f 6c 5f 63 6f  mbol = Symbol_co
b620: 75 6e 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f  unt();.  Symbol_
b630: 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29  new("{default}")
b640: 3b 0a 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20  ;.  lem.symbols 
b650: 3d 20 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66  = Symbol_arrayof
b660: 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ();.  for(i=0; i
b670: 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69  <=lem.nsymbol; i
b680: 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  ++) lem.symbols[
b690: 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20  i]->index = i;. 
b6a0: 20 71 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f   qsort(lem.symbo
b6b0: 6c 73 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b 31  ls,lem.nsymbol+1
b6c0: 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73  ,sizeof(struct s
b6d0: 79 6d 62 6f 6c 2a 29 2c 0a 20 20 20 20 20 20 20  ymbol*),.       
b6e0: 20 28 69 6e 74 28 2a 29 28 29 29 53 79 6d 62 6f   (int(*)())Symbo
b6f0: 6c 63 6d 70 70 29 3b 0a 20 20 66 6f 72 28 69 3d  lcmpp);.  for(i=
b700: 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f  0; i<=lem.nsymbo
b710: 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62  l; i++) lem.symb
b720: 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20  ols[i]->index = 
b730: 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 73  i;.  for(i=1; is
b740: 75 70 70 65 72 28 6c 65 6d 2e 73 79 6d 62 6f 6c  upper(lem.symbol
b750: 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20  s[i]->name[0]); 
b760: 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72  i++);.  lem.nter
b770: 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a  minal = i;..  /*
b780: 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 72   Generate a repr
b790: 69 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  int of the gramm
b7a0: 61 72 2c 20 69 66 20 72 65 71 75 65 73 74 65 64  ar, if requested
b7b0: 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20   on the command 
b7c0: 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70  line */.  if( rp
b7d0: 66 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72  flag ){.    Repr
b7e0: 69 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c  int(&lem);.  }el
b7f0: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  se{.    /* Initi
b800: 61 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66  alize the size f
b810: 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e  or all follow an
b820: 64 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a  d first sets */.
b830: 20 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e      SetSize(lem.
b840: 6e 74 65 72 6d 69 6e 61 6c 29 3b 0a 0a 20 20 20  nterminal);..   
b850: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72 65   /* Find the pre
b860: 63 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65 72  cedence for ever
b870: 79 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c  y production rul
b880: 65 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65 29  e (that has one)
b890: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c 65   */.    FindRule
b8a0: 50 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65 6d  Precedences(&lem
b8b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  );..    /* Compu
b8c0: 74 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f  te the lambda-no
b8d0: 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74  nterminals and t
b8e0: 68 65 20 66 69 72 73 74 2d 73 65 74 73 20 66 6f  he first-sets fo
b8f0: 72 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e  r every.    ** n
b900: 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20  onterminal */.  
b910: 20 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28    FindFirstSets(
b920: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
b930: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
b940: 20 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20 72   states.  Also r
b950: 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74  ecord follow-set
b960: 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20   propagation.   
b970: 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61   ** links so tha
b980: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74  t the follow-set
b990: 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64   can be computed
b9a0: 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65   later */.    le
b9b0: 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20 20  m.nstate = 0;.  
b9c0: 20 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c 65    FindStates(&le
b9d0: 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74  m);.    lem.sort
b9e0: 65 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61 79  ed = State_array
b9f0: 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69  of();..    /* Ti
ba00: 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20  e up loose ends 
ba10: 6f 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74 69  on the propagati
ba20: 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20  on links */.    
ba30: 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b  FindLinks(&lem);
ba40: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ba50: 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20   the follow set 
ba60: 6f 66 20 65 76 65 72 79 20 72 65 64 75 63 69 62  of every reducib
ba70: 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  le configuration
ba80: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c   */.    FindFoll
ba90: 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20  owSets(&lem);.. 
baa0: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
bab0: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20  e action tables 
bac0: 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69 6f  */.    FindActio
bad0: 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ns(&lem);..    /
bae0: 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20 61  * Compress the a
baf0: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
bb00: 20 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73 73      if( compress
bb10: 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54 61  ==0 ) CompressTa
bb20: 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  bles(&lem);..   
bb30: 20 2f 2a 20 52 65 6f 72 64 65 72 20 61 6e 64 20   /* Reorder and 
bb40: 72 65 6e 75 6d 62 65 72 20 74 68 65 20 73 74 61  renumber the sta
bb50: 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61 74  tes so that stat
bb60: 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63 68  es with fewer ch
bb70: 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63  oices.    ** occ
bb80: 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 2a  ur at the end. *
bb90: 2f 0a 20 20 20 20 52 65 73 6f 72 74 53 74 61 74  /.    ResortStat
bba0: 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  es(&lem);..    /
bbb0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70  * Generate a rep
bbc0: 6f 72 74 20 6f 66 20 74 68 65 20 70 61 72 73 65  ort of the parse
bbd0: 72 20 67 65 6e 65 72 61 74 65 64 2e 20 20 28 74  r generated.  (t
bbe0: 68 65 20 22 79 2e 6f 75 74 70 75 74 22 20 66 69  he "y.output" fi
bbf0: 6c 65 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le) */.    if( !
bc00: 71 75 69 65 74 20 29 20 52 65 70 6f 72 74 4f 75  quiet ) ReportOu
bc10: 74 70 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  tput(&lem);..   
bc20: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
bc30: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72   source code for
bc40: 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20   the parser */. 
bc50: 20 20 20 52 65 70 6f 72 74 54 61 62 6c 65 28 26     ReportTable(&
bc60: 6c 65 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20  lem, mhflag);.. 
bc70: 20 20 20 2f 2a 20 50 72 6f 64 75 63 65 20 61 20     /* Produce a 
bc80: 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20  header file for 
bc90: 75 73 65 20 62 79 20 74 68 65 20 73 63 61 6e 6e  use by the scann
bca0: 65 72 2e 20 20 28 54 68 69 73 20 73 74 65 70 20  er.  (This step 
bcb0: 69 73 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65  is.    ** omitte
bcc0: 64 20 69 66 20 74 68 65 20 22 2d 6d 22 20 6f 70  d if the "-m" op
bcd0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 65 63  tion is used bec
bce0: 61 75 73 65 20 6d 61 6b 65 68 65 61 64 65 72 73  ause makeheaders
bcf0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e   will.    ** gen
bd00: 65 72 61 74 65 20 74 68 65 20 66 69 6c 65 20 66  erate the file f
bd10: 6f 72 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69  or us.) */.    i
bd20: 66 28 20 21 6d 68 66 6c 61 67 20 29 20 52 65 70  f( !mhflag ) Rep
bd30: 6f 72 74 48 65 61 64 65 72 28 26 6c 65 6d 29 3b  ortHeader(&lem);
bd40: 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 69  .  }.  if( stati
bd50: 73 74 69 63 73 20 29 7b 0a 20 20 20 20 70 72 69  stics ){.    pri
bd60: 6e 74 66 28 22 50 61 72 73 65 72 20 73 74 61 74  ntf("Parser stat
bd70: 69 73 74 69 63 73 3a 20 25 64 20 74 65 72 6d 69  istics: %d termi
bd80: 6e 61 6c 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d  nals, %d nonterm
bd90: 69 6e 61 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c  inals, %d rules\
bda0: 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74  n",.      lem.nt
bdb0: 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79  erminal, lem.nsy
bdc0: 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d  mbol - lem.nterm
bdd0: 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29  inal, lem.nrule)
bde0: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20  ;.    printf("  
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 25 64 20 73 74 61 74 65 73 2c 20 25 64 20 70   %d states, %d p
be10: 61 72 73 65 72 20 74 61 62 6c 65 20 65 6e 74 72  arser table entr
be20: 69 65 73 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74  ies, %d conflict
be30: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e  s\n",.      lem.
be40: 6e 73 74 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c  nstate, lem.tabl
be50: 65 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66  esize, lem.nconf
be60: 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lict);.  }.  if(
be70: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 29   lem.nconflict )
be80: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
be90: 64 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67  derr,"%d parsing
bea0: 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c   conflicts.\n",l
beb0: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20  em.nconflict);. 
bec0: 20 7d 0a 20 20 65 78 69 74 28 6c 65 6d 2e 65 72   }.  exit(lem.er
bed0: 72 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f  rorcnt + lem.nco
bee0: 6e 66 6c 69 63 74 29 3b 0a 20 20 72 65 74 75 72  nflict);.  retur
bef0: 6e 20 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20  n (lem.errorcnt 
bf00: 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  + lem.nconflict)
bf10: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
bf20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
bf30: 68 65 20 66 69 6c 65 20 22 6d 73 6f 72 74 2e 63  he file "msort.c
bf40: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
bf50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bf60: 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e 65 72  */./*.** A gener
bf70: 69 63 20 6d 65 72 67 65 2d 73 6f 72 74 20 70 72  ic merge-sort pr
bf80: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53 41  ogram..**.** USA
bf90: 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70 74 72 22  GE:.** Let "ptr"
bfa0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
bfb0: 20 73 6f 6d 65 20 73 74 72 75 63 74 75 72 65 20   some structure 
bfc0: 77 68 69 63 68 20 69 73 20 61 74 20 74 68 65 20  which is at the 
bfd0: 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20 6e 75 6c  head of.** a nul
bfe0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 73  l-terminated lis
bff0: 74 2e 20 20 54 68 65 6e 20 74 6f 20 73 6f 72 74  t.  Then to sort
c000: 20 74 68 65 20 6c 69 73 74 20 63 61 6c 6c 3a 0a   the list call:.
c010: 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72 20 3d 20  **.**     ptr = 
c020: 6d 73 6f 72 74 28 70 74 72 2c 26 28 70 74 72 2d  msort(ptr,&(ptr-
c030: 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63 29 3b 0a  >next),cmpfnc);.
c040: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 6f  **.** In the abo
c050: 76 65 2c 20 22 63 6d 70 66 6e 63 22 20 69 73 20  ve, "cmpfnc" is 
c060: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
c070: 75 6e 63 74 69 6f 6e 20 77 68 69 63 68 20 63 6f  unction which co
c080: 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f 20 69 6e  mpares.** two in
c090: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73  stances of the s
c0a0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
c0b0: 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  urns an integer,
c0c0: 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72 63 6d 70   as in.** strcmp
c0d0: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  .  The second ar
c0e0: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
c0f0: 74 65 72 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  ter to the point
c100: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 65 63  er to the.** sec
c110: 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ond element of t
c120: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20  he linked list. 
c130: 20 54 68 69 73 20 61 64 64 72 65 73 73 20 69 73   This address is
c140: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
c150: 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 74  .** the offset t
c160: 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65  o the "next" fie
c170: 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  ld within the st
c180: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6f 66  ructure.  The of
c190: 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 22  fset to.** the "
c1a0: 6e 65 78 74 22 20 66 69 65 6c 64 20 6d 75 73 74  next" field must
c1b0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f 72   be constant for
c1c0: 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
c1d0: 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a  in the list..**.
c1e0: 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  ** The function 
c1f0: 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 70 6f  returns a new po
c200: 69 6e 74 65 72 20 77 68 69 63 68 20 69 73 20 74  inter which is t
c210: 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 6c  he head of the l
c220: 69 73 74 0a 2a 2a 20 61 66 74 65 72 20 73 6f 72  ist.** after sor
c230: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f  ting..**.** ALGO
c240: 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67 65 2d  RITHM:.** Merge-
c250: 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  sort..*/../*.** 
c260: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
c270: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 72   to the next str
c280: 75 63 74 75 72 65 20 69 6e 20 74 68 65 20 6c 69  ucture in the li
c290: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 23 64  nked list..*/.#d
c2a0: 65 66 69 6e 65 20 4e 45 58 54 28 41 29 20 28 2a  efine NEXT(A) (*
c2b0: 28 63 68 61 72 2a 2a 29 28 28 28 75 6e 73 69 67  (char**)(((unsig
c2c0: 6e 65 64 20 6c 6f 6e 67 29 41 29 2b 6f 66 66 73  ned long)A)+offs
c2d0: 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  et))../*.** Inpu
c2e0: 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20  ts:.**   a:     
c2f0: 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c    A sorted, null
c300: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b  -terminated link
c310: 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62  ed list.  (May b
c320: 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a  e null)..**   b:
c330: 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c         A sorted,
c340: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
c350: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28   linked list.  (
c360: 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a  May be null)..**
c370: 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f     cmp:     A po
c380: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  inter to the com
c390: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
c3a0: 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20  ..**   offset:  
c3b0: 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74  Offset in the st
c3c0: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22  ructure to the "
c3d0: 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a  next" field..**.
c3e0: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
c3f0: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
c400: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
c410: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
c420: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
c430: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74  ents.**   of bot
c440: 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a  h a and b..**.**
c450: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
c460: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
c470: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
c480: 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ents in the list
c490: 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a  s a and b are.**
c4a0: 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73     changed..*/.s
c4b0: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67  tatic char *merg
c4c0: 65 28 61 2c 62 2c 63 6d 70 2c 6f 66 66 73 65 74  e(a,b,cmp,offset
c4d0: 29 0a 63 68 61 72 20 2a 61 3b 0a 63 68 61 72 20  ).char *a;.char 
c4e0: 2a 62 3b 0a 69 6e 74 20 28 2a 63 6d 70 29 28 29  *b;.int (*cmp)()
c4f0: 3b 0a 69 6e 74 20 6f 66 66 73 65 74 3b 0a 7b 0a  ;.int offset;.{.
c500: 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65    char *ptr, *he
c510: 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20  ad;..  if( a==0 
c520: 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b  ){.    head = b;
c530: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d  .  }else if( b==
c540: 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20  0 ){.    head = 
c550: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
c560: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
c570: 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20 3d  0 ){.      ptr =
c580: 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e 45   a;.      a = NE
c590: 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65  XT(a);.    }else
c5a0: 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b  {.      ptr = b;
c5b0: 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28  .      b = NEXT(
c5c0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 65  b);.    }.    he
c5d0: 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77 68  ad = ptr;.    wh
c5e0: 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a 20  ile( a && b ){. 
c5f0: 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28       if( (*cmp)(
c600: 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  a,b)<0 ){.      
c610: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b    NEXT(ptr) = a;
c620: 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 61  .        ptr = a
c630: 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e 45  ;.        a = NE
c640: 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  XT(a);.      }el
c650: 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54  se{.        NEXT
c660: 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20 20  (ptr) = b;.     
c670: 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20     ptr = b;.    
c680: 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b      b = NEXT(b);
c690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c6a0: 20 20 20 69 66 28 20 61 20 29 20 4e 45 58 54 28     if( a ) NEXT(
c6b0: 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c  ptr) = a;.    el
c6c0: 73 65 20 20 20 20 4e 45 58 54 28 70 74 72 29 20  se    NEXT(ptr) 
c6d0: 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = b;.  }.  retur
c6e0: 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n head;.}../*.**
c6f0: 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69   Inputs:.**   li
c700: 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72  st:      Pointer
c710: 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e   to a singly-lin
c720: 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72 75  ked list of stru
c730: 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78  ctures..**   nex
c740: 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20  t:      Pointer 
c750: 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  to pointer to th
c760: 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
c770: 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   of the list..**
c780: 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41 20     cmp:       A 
c790: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
c7a0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ion..**.** Retur
c7b0: 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20  n Value:.**   A 
c7c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
c7d0: 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20  ead of a sorted 
c7e0: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
c7f0: 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20  the elements.** 
c800: 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c    orginally in l
c810: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20  ist..**.** Side 
c820: 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68  effects:.**   Th
c830: 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72  e "next" pointer
c840: 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69  s for elements i
c850: 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e 67  n list are chang
c860: 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c  ed..*/.#define L
c870: 49 53 54 53 49 5a 45 20 33 30 0a 63 68 61 72 20  ISTSIZE 30.char 
c880: 2a 6d 73 6f 72 74 28 6c 69 73 74 2c 6e 65 78 74  *msort(list,next
c890: 2c 63 6d 70 29 0a 63 68 61 72 20 2a 6c 69 73 74  ,cmp).char *list
c8a0: 3b 0a 63 68 61 72 20 2a 2a 6e 65 78 74 3b 0a 69  ;.char **next;.i
c8b0: 6e 74 20 28 2a 63 6d 70 29 28 29 3b 0a 7b 0a 20  nt (*cmp)();.{. 
c8c0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f   unsigned long o
c8d0: 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20 2a 65  ffset;.  char *e
c8e0: 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74 5b 4c  p;.  char *set[L
c8f0: 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  ISTSIZE];.  int 
c900: 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 75  i;.  offset = (u
c910: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6e 65 78  nsigned long)nex
c920: 74 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t - (unsigned lo
c930: 6e 67 29 6c 69 73 74 3b 0a 20 20 66 6f 72 28 69  ng)list;.  for(i
c940: 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20  =0; i<LISTSIZE; 
c950: 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d 20 30 3b  i++) set[i] = 0;
c960: 0a 20 20 77 68 69 6c 65 28 20 6c 69 73 74 20 29  .  while( list )
c970: 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69 73 74 3b  {.    ep = list;
c980: 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e 45 58 54  .    list = NEXT
c990: 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e 45 58 54  (list);.    NEXT
c9a0: 28 65 70 29 20 3d 20 30 3b 0a 20 20 20 20 66 6f  (ep) = 0;.    fo
c9b0: 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a  r(i=0; i<LISTSIZ
c9c0: 45 2d 31 20 26 26 20 73 65 74 5b 69 5d 21 3d 30  E-1 && set[i]!=0
c9d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 65 70  ; i++){.      ep
c9e0: 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65 74 5b   = merge(ep,set[
c9f0: 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a  i],cmp,offset);.
ca00: 20 20 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 30        set[i] = 0
ca10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74 5b  ;.    }.    set[
ca20: 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a 20 20 65  i] = ep;.  }.  e
ca30: 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  p = 0;.  for(i=0
ca40: 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b  ; i<LISTSIZE; i+
ca50: 2b 29 20 69 66 28 20 73 65 74 5b 69 5d 20 29 20  +) if( set[i] ) 
ca60: 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65  ep = merge(ep,se
ca70: 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29  t[i],cmp,offset)
ca80: 3b 0a 20 20 72 65 74 75 72 6e 20 65 70 3b 0a 7d  ;.  return ep;.}
ca90: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
caa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
cab0: 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e  the file "option
cac0: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
cad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
cae0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61 72  static char **ar
caf0: 67 76 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63  gv;.static struc
cb00: 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 3b  t s_options *op;
cb10: 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 65 72  .static FILE *er
cb20: 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65 66 69 6e  rstream;..#defin
cb30: 65 20 49 53 4f 50 54 28 58 29 20 28 28 58 29 5b  e ISOPT(X) ((X)[
cb40: 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30 5d 3d  0]=='-'||(X)[0]=
cb50: 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28 28 58 29  ='+'||strchr((X)
cb60: 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a  ,'=')!=0)../*.**
cb70: 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6d 6d 61   Print the comma
cb80: 6e 64 20 6c 69 6e 65 20 77 69 74 68 20 61 20 63  nd line with a c
cb90: 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  arrot pointing t
cba0: 6f 20 74 68 65 20 6b 2d 74 68 20 63 68 61 72 61  o the k-th chara
cbb0: 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 6e  cter.** of the n
cbc0: 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74  -th field..*/.st
cbd0: 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c 69 6e  atic void errlin
cbe0: 65 28 6e 2c 6b 2c 65 72 72 29 0a 69 6e 74 20 6e  e(n,k,err).int n
cbf0: 3b 0a 69 6e 74 20 6b 3b 0a 46 49 4c 45 20 2a 65  ;.int k;.FILE *e
cc00: 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e  rr;.{.  int spcn
cc10: 74 2c 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  t, i;.  if( argv
cc20: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72  [0] ) fprintf(er
cc30: 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b  r,"%s",argv[0]);
cc40: 0a 20 20 73 70 63 6e 74 20 3d 20 73 74 72 6c 65  .  spcnt = strle
cc50: 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a  n(argv[0]) + 1;.
cc60: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26    for(i=1; i<n &
cc70: 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b  & argv[i]; i++){
cc80: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
cc90: 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b  ," %s",argv[i]);
cca0: 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 73 74  .    spcnt += st
ccb0: 72 6c 65 6e 28 61 72 67 76 5b 69 5d 29 2b 31 3b  rlen(argv[i])+1;
ccc0: 0a 20 20 7d 0a 20 20 73 70 63 6e 74 20 2b 3d 20  .  }.  spcnt += 
ccd0: 6b 3b 0a 20 20 66 6f 72 28 3b 20 61 72 67 76 5b  k;.  for(; argv[
cce0: 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74 66  i]; i++) fprintf
ccf0: 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b  (err," %s",argv[
cd00: 69 5d 29 3b 0a 20 20 69 66 28 20 73 70 63 6e 74  i]);.  if( spcnt
cd10: 3c 32 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  <20 ){.    fprin
cd20: 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d 2d  tf(err,"\n%*s^--
cd30: 20 68 65 72 65 5c 6e 22 2c 73 70 63 6e 74 2c 22   here\n",spcnt,"
cd40: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
cd50: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e   fprintf(err,"\n
cd60: 25 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c 73  %*shere --^\n",s
cd70: 70 63 6e 74 2d 37 2c 22 22 29 3b 0a 20 20 7d 0a  pcnt-7,"");.  }.
cd80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
cd90: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
cda0: 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69 74 63 68   N-th non-switch
cdb0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75   argument.  Retu
cdc0: 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e 20 69 73  rn -1.** if N is
cdd0: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 0a 2a   out of range..*
cde0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 67  /.static int arg
cdf0: 69 6e 64 65 78 28 6e 29 0a 69 6e 74 20 6e 3b 0a  index(n).int n;.
ce00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
ce10: 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20   dashdash = 0;. 
ce20: 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20   if( argv!=0 && 
ce30: 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20  *argv!=0 ){.    
ce40: 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d  for(i=1; argv[i]
ce50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
ce60: 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49  ( dashdash || !I
ce70: 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b  SOPT(argv[i]) ){
ce80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  .        if( n==
ce90: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
cea0: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
ceb0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72   }.      if( str
cec0: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22  cmp(argv[i],"--"
ced0: 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68 20  )==0 ) dashdash 
cee0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
cef0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73   return -1;.}..s
cf00: 74 61 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b  tatic char emsg[
cf10: 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e  ] = "Command lin
cf20: 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20  e syntax error: 
cf30: 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  ";../*.** Proces
cf40: 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64  s a flag command
cf50: 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a   line argument..
cf60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
cf70: 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29  ndleflags(i,err)
cf80: 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72  .int i;.FILE *er
cf90: 72 3b 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20  r;.{.  int v;.  
cfa0: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
cfb0: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
cfc0: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
cfd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
cfe0: 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b  trncmp(&argv[i][
cff0: 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 73  1],op[j].label,s
d000: 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65  trlen(op[j].labe
d010: 6c 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  l))==0 ) break;.
d020: 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69    }.  v = argv[i
d030: 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20  ][0]=='-' ? 1 : 
d040: 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c  0;.  if( op[j].l
d050: 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  abel==0 ){.    i
d060: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
d070: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75  fprintf(err,"%su
d080: 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e  ndefined option.
d090: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
d0a0: 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72   errline(i,1,err
d0b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  );.    }.    err
d0c0: 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69  cnt++;.  }else i
d0d0: 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f  f( op[j].type==O
d0e0: 50 54 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a  PT_FLAG ){.    *
d0f0: 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67  ((int*)op[j].arg
d100: 29 20 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69  ) = v;.  }else i
d110: 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f  f( op[j].type==O
d120: 50 54 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20  PT_FFLAG ){.    
d130: 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70  (*(void(*)())(op
d140: 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20 20  [j].arg))(v);.  
d150: 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e  }else if( op[j].
d160: 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20 29  type==OPT_FSTR )
d170: 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29  {.    (*(void(*)
d180: 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28  ())(op[j].arg))(
d190: 26 61 72 67 76 5b 69 5d 5b 32 5d 29 3b 0a 20 20  &argv[i][2]);.  
d1a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 65  }else{.    if( e
d1b0: 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  rr ){.      fpri
d1c0: 6e 74 66 28 65 72 72 2c 22 25 73 6d 69 73 73 69  ntf(err,"%smissi
d1d0: 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 73  ng argument on s
d1e0: 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73 67 29 3b  witch.\n",emsg);
d1f0: 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69  .      errline(i
d200: 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ,1,err);.    }. 
d210: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d     errcnt++;.  }
d220: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74  .  return errcnt
d230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  ;.}../*.** Proce
d240: 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  ss a command lin
d250: 65 20 73 77 69 74 63 68 20 77 68 69 63 68 20 68  e switch which h
d260: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
d270: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
d280: 6e 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72  ndleswitch(i,err
d290: 29 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65  ).int i;.FILE *e
d2a0: 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d  rr;.{.  int lv =
d2b0: 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20   0;.  double dv 
d2c0: 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73  = 0.0;.  char *s
d2d0: 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63  v = 0, *end;.  c
d2e0: 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a  har *cp;.  int j
d2f0: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
d300: 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68   0;.  cp = strch
d310: 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a  r(argv[i],'=');.
d320: 20 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20    assert( cp!=0 
d330: 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  );.  *cp = 0;.  
d340: 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c  for(j=0; op[j].l
d350: 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  abel; j++){.    
d360: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
d370: 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d  i],op[j].label)=
d380: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
d390: 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69    *cp = '=';.  i
d3a0: 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d  f( op[j].label==
d3b0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  0 ){.    if( err
d3c0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
d3d0: 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e  f(err,"%sundefin
d3e0: 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d  ed option.\n",em
d3f0: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
d400: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
d410: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
d420: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70  .  }else{.    cp
d430: 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ++;.    switch( 
d440: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
d450: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
d460: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
d470: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
d480: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
d490: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
d4a0: 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75  r,"%soption requ
d4b0: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
d4c0: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d4d0: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
d4e0: 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  0,err);.        
d4f0: 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  }.        errcnt
d500: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
d510: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d520: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
d530: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
d540: 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28      dv = strtod(
d550: 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20  cp,&end);.      
d560: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
d570: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
d580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
d590: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c  printf(err,"%sil
d5a0: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
d5b0: 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  in floating-poin
d5c0: 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  t argument.\n",e
d5d0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
d5e0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e    errline(i,((un
d5f0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29  signed long)end)
d600: 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  -(unsigned long)
d610: 61 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20  argv[i],err);.  
d620: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d630: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
d640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
d660: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
d670: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
d680: 20 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74 72          lv = str
d690: 74 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a  tol(cp,&end,0);.
d6a0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64          if( *end
d6b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
d6c0: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20  ( err ){.       
d6d0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
d6e0: 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72  ,"%sillegal char
d6f0: 61 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65 72  acter in integer
d700: 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d   argument.\n",em
d710: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
d720: 20 65 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73   errline(i,((uns
d730: 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d  igned long)end)-
d740: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61  (unsigned long)a
d750: 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20  rgv[i],err);.   
d760: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d770: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
d780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
d790: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
d7a0: 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20   OPT_STR:.      
d7b0: 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20  case OPT_FSTR:. 
d7c0: 20 20 20 20 20 20 20 73 76 20 3d 20 63 70 3b 0a         sv = cp;.
d7d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d7e0: 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
d7f0: 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20   op[j].type ){. 
d800: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c       case OPT_FL
d810: 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  AG:.      case O
d820: 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20  PT_FFLAG:.      
d830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
d840: 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20  ase OPT_DBL:.   
d850: 20 20 20 20 20 2a 28 64 6f 75 62 6c 65 2a 29 28       *(double*)(
d860: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 64 76 3b  op[j].arg) = dv;
d870: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d880: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
d890: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 28 2a 28  DBL:.        (*(
d8a0: 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d  void(*)())(op[j]
d8b0: 2e 61 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20  .arg))(dv);.    
d8c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d8d0: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
d8e0: 20 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f         *(int*)(o
d8f0: 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a  p[j].arg) = lv;.
d900: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d910: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
d920: 4e 54 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76  NT:.        (*(v
d930: 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e  oid(*)())(op[j].
d940: 61 72 67 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a  arg))((int)lv);.
d950: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d960: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54       case OPT_ST
d970: 52 3a 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61  R:.        *(cha
d980: 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  r**)(op[j].arg) 
d990: 3d 20 73 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = sv;.        br
d9a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d9b0: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
d9c0: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28    (*(void(*)())(
d9d0: 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 73 76 29 3b  op[j].arg))(sv);
d9e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d9f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
da00: 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 69 6e  rn errcnt;.}..in
da10: 74 20 4f 70 74 49 6e 69 74 28 61 2c 6f 2c 65 72  t OptInit(a,o,er
da20: 72 29 0a 63 68 61 72 20 2a 2a 61 3b 0a 73 74 72  r).char **a;.str
da30: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f  uct s_options *o
da40: 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20  ;.FILE *err;.{. 
da50: 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b   int errcnt = 0;
da60: 0a 20 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f  .  argv = a;.  o
da70: 70 20 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65  p = o;.  errstre
da80: 61 6d 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20  am = err;.  if( 
da90: 61 72 67 76 20 26 26 20 2a 61 72 67 76 20 26 26  argv && *argv &&
daa0: 20 6f 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   op ){.    int i
dab0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  ;.    for(i=1; a
dac0: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
dad0: 20 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b      if( argv[i][
dae0: 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b  0]=='+' || argv[
daf0: 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20  i][0]=='-' ){.  
db00: 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20        errcnt += 
db10: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72  handleflags(i,er
db20: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
db30: 69 66 28 20 73 74 72 63 68 72 28 61 72 67 76 5b  if( strchr(argv[
db40: 69 5d 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20  i],'=') ){.     
db50: 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e     errcnt += han
db60: 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29  dleswitch(i,err)
db70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
db80: 20 20 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74    }.  if( errcnt
db90: 3e 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  >0 ){.    fprint
dba0: 66 28 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d  f(err,"Valid com
dbb0: 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
dbc0: 73 20 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65  s for \"%s\" are
dbd0: 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70  :\n",*a);.    Op
dbe0: 74 50 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78  tPrint();.    ex
dbf0: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  it(1);.  }.  ret
dc00: 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70  urn 0;.}..int Op
dc10: 74 4e 41 72 67 73 28 29 7b 0a 20 20 69 6e 74 20  tNArgs(){.  int 
dc20: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64  cnt = 0;.  int d
dc30: 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69  ashdash = 0;.  i
dc40: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76  nt i;.  if( argv
dc50: 21 3d 30 20 26 26 20 61 72 67 76 5b 30 5d 21 3d  !=0 && argv[0]!=
dc60: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  0 ){.    for(i=1
dc70: 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b  ; argv[i]; i++){
dc80: 0a 20 20 20 20 20 20 69 66 28 20 64 61 73 68 64  .      if( dashd
dc90: 61 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72  ash || !ISOPT(ar
dca0: 67 76 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a  gv[i]) ) cnt++;.
dcb0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
dcc0: 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d  (argv[i],"--")==
dcd0: 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20 31  0 ) dashdash = 1
dce0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
dcf0: 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61  turn cnt;.}..cha
dd00: 72 20 2a 4f 70 74 41 72 67 28 6e 29 0a 69 6e 74  r *OptArg(n).int
dd10: 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   n;.{.  int i;. 
dd20: 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29   i = argindex(n)
dd30: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3e 3d 30 20  ;.  return i>=0 
dd40: 3f 20 61 72 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d  ? argv[i] : 0;.}
dd50: 0a 0a 76 6f 69 64 20 4f 70 74 45 72 72 28 6e 29  ..void OptErr(n)
dd60: 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20  .int n;.{.  int 
dd70: 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65  i;.  i = arginde
dd80: 78 28 6e 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30  x(n);.  if( i>=0
dd90: 20 29 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65   ) errline(i,0,e
dda0: 72 72 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f  rrstream);.}..vo
ddb0: 69 64 20 4f 70 74 50 72 69 6e 74 28 29 7b 0a 20  id OptPrint(){. 
ddc0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61   int i;.  int ma
ddd0: 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20 3d 20  x, len;.  max = 
dde0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70  0;.  for(i=0; op
ddf0: 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b  [i].label; i++){
de00: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  .    len = strle
de10: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b  n(op[i].label) +
de20: 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   1;.    switch( 
de30: 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[i].type ){.  
de40: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
de50: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
de60: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
de70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
de80: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
de90: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
dea0: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
deb0: 39 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  9;       /* leng
dec0: 74 68 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e  th of "<integer>
ded0: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
dee0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
def0: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61  PT_DBL:.      ca
df00: 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
df10: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20       len += 6;  
df20: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
df30: 66 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20  f "<real>" */.  
df40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
df50: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
df60: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
df70: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65  FSTR:.        le
df80: 6e 20 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a  n += 8;       /*
df90: 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72   length of "<str
dfa0: 69 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  ing>" */.       
dfb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
dfc0: 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20    if( len>max ) 
dfd0: 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  max = len;.  }. 
dfe0: 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e   for(i=0; op[i].
dff0: 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  label; i++){.   
e000: 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74   switch( op[i].t
e010: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
e020: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
e030: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
e040: 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
e050: 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
e060: 25 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c  %-*s  %s\n",max,
e070: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69  op[i].label,op[i
e080: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
e090: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e0a0: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
e0b0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
e0c0: 4e 54 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  NT:.        fpri
e0d0: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
e0e0: 20 25 73 3d 3c 69 6e 74 65 67 65 72 3e 25 2a 73   %s=<integer>%*s
e0f0: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
e100: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
e110: 69 6e 74 29 28 6d 61 78 2d 73 74 72 6c 65 6e 28  int)(max-strlen(
e120: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c  op[i].label)-9),
e130: 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
e140: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
e150: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
e160: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
e170: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
e180: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
e190: 72 65 61 6d 2c 22 20 20 25 73 3d 3c 72 65 61 6c  ream,"  %s=<real
e1a0: 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
e1b0: 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
e1c0: 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 73 74 72     (int)(max-str
e1d0: 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29  len(op[i].label)
e1e0: 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73  -6),"",op[i].mes
e1f0: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
e200: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
e210: 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20   OPT_STR:.      
e220: 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20  case OPT_FSTR:. 
e230: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
e240: 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c  rrstream,"  %s=<
e250: 73 74 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c 6e  string>%*s  %s\n
e260: 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20  ",op[i].label,. 
e270: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d           (int)(m
e280: 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  ax-strlen(op[i].
e290: 6c 61 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b  label)-8),"",op[
e2a0: 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
e2b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e2c0: 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  }.  }.}./*******
e2d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e2e0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
e2f0: 70 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  parse.c" *******
e300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e310: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70  *****/./*.** Inp
e320: 75 74 20 66 69 6c 65 20 70 61 72 73 65 72 20 66  ut file parser f
e330: 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  or the LEMON par
e340: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
e350: 2f 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20  /../* The state 
e360: 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
e370: 0a 73 74 72 75 63 74 20 70 73 74 61 74 65 20 7b  .struct pstate {
e380: 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  .  char *filenam
e390: 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e;       /* Name
e3a0: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
e3b0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65  le */.  int toke
e3c0: 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a  nlineno;      /*
e3d0: 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20 77   Linenumber at w
e3e0: 68 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f 6b  hich current tok
e3f0: 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20 69  en starts */.  i
e400: 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20  nt errorcnt;    
e410: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e420: 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72 20  f errors so far 
e430: 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
e440: 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54 65  start;     /* Te
e450: 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f  xt of current to
e460: 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ken */.  struct 
e470: 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f  lemon *gp;     /
e480: 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20 76  * Global state v
e490: 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20  ector */.  enum 
e4a0: 65 5f 73 74 61 74 65 20 7b 0a 20 20 20 20 49 4e  e_state {.    IN
e4b0: 49 54 49 41 4c 49 5a 45 2c 0a 20 20 20 20 57 41  ITIALIZE,.    WA
e4c0: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
e4d0: 52 5f 52 55 4c 45 2c 0a 20 20 20 20 57 41 49 54  R_RULE,.    WAIT
e4e0: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
e4f0: 57 4f 52 44 2c 0a 20 20 20 20 57 41 49 54 49 4e  WORD,.    WAITIN
e500: 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a  G_FOR_DECL_ARG,.
e510: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
e520: 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
e530: 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  L,.    WAITING_F
e540: 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 20 20 49 4e  OR_ARROW,.    IN
e550: 5f 52 48 53 2c 0a 20 20 20 20 4c 48 53 5f 41 4c  _RHS,.    LHS_AL
e560: 49 41 53 5f 31 2c 0a 20 20 20 20 4c 48 53 5f 41  IAS_1,.    LHS_A
e570: 4c 49 41 53 5f 32 2c 0a 20 20 20 20 4c 48 53 5f  LIAS_2,.    LHS_
e580: 41 4c 49 41 53 5f 33 2c 0a 20 20 20 20 52 48 53  ALIAS_3,.    RHS
e590: 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 20 20 52 48  _ALIAS_1,.    RH
e5a0: 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 20 20 50  S_ALIAS_2,.    P
e5b0: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
e5c0: 2c 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43 45  ,.    PRECEDENCE
e5d0: 5f 4d 41 52 4b 5f 32 2c 0a 20 20 20 20 52 45 53  _MARK_2,.    RES
e5e0: 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
e5f0: 52 52 4f 52 2c 0a 20 20 20 20 52 45 53 59 4e 43  RROR,.    RESYNC
e600: 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
e610: 52 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  R,.    WAITING_F
e620: 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59  OR_DESTRUCTOR_SY
e630: 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e  MBOL,.    WAITIN
e640: 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
e650: 59 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49  YMBOL,.    WAITI
e660: 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f  NG_FOR_FALLBACK_
e670: 49 44 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f  ID,.    WAITING_
e680: 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 0a  FOR_WILDCARD_ID.
e690: 20 20 7d 20 73 74 61 74 65 3b 20 20 20 20 20 20    } state;      
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6b0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
e6c0: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 73 74 72   parser */.  str
e6d0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c  uct symbol *fall
e6e0: 62 61 63 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66  back;   /* The f
e6f0: 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f  allback token */
e700: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
e710: 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a   *lhs;        /*
e720: 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   Left-hand side 
e730: 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20  of current rule 
e740: 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 68 73 61 6c  */.  char *lhsal
e750: 69 61 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ias;            
e760: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65  /* Alias for the
e770: 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72   LHS */.  int nr
e780: 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
e790: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e7a0: 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  f right-hand sid
e7b0: 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a  e symbols seen *
e7c0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
e7d0: 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20  l *rhs[MAXRHS]; 
e7e0: 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20   /* RHS symbols 
e7f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 6c 69 61 73  */.  char *alias
e800: 5b 4d 41 58 52 48 53 5d 3b 20 20 20 20 20 20 20  [MAXRHS];       
e810: 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65  /* Aliases for e
e820: 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28  ach RHS symbol (
e830: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74  or NULL) */.  st
e840: 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72  ruct rule *prevr
e850: 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76  ule;     /* Prev
e860: 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64  ious rule parsed
e870: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 63 6c   */.  char *decl
e880: 6b 65 79 77 6f 72 64 3b 20 20 20 20 20 20 20 20  keyword;        
e890: 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61   /* Keyword of a
e8a0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
e8b0: 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67    char **declarg
e8c0: 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  slot;        /* 
e8d0: 57 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72  Where the declar
e8e0: 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73  ation argument s
e8f0: 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a  hould be put */.
e900: 20 20 69 6e 74 20 2a 64 65 63 6c 6c 6e 73 6c 6f    int *decllnslo
e910: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
e920: 57 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72  Where the declar
e930: 61 74 69 6f 6e 20 6c 69 6e 65 6e 75 6d 62 65 72  ation linenumber
e940: 20 69 73 20 70 75 74 20 2a 2f 0a 20 20 65 6e 75   is put */.  enu
e950: 6d 20 65 5f 61 73 73 6f 63 20 64 65 63 6c 61 73  m e_assoc declas
e960: 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73 69 67  soc;    /* Assig
e970: 6e 20 74 68 69 73 20 61 73 73 6f 63 69 61 74 69  n this associati
e980: 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d  on to decl argum
e990: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 70 72  ents */.  int pr
e9a0: 65 63 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  eccounter;      
e9b0: 20 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74       /* Assign t
e9c0: 68 69 73 20 70 72 65 63 65 64 65 6e 63 65 20 74  his precedence t
e9d0: 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73  o decl arguments
e9e0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
e9f0: 65 20 2a 66 69 72 73 74 72 75 6c 65 3b 20 20 20  e *firstrule;   
ea00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66   /* Pointer to f
ea10: 69 72 73 74 20 72 75 6c 65 20 69 6e 20 74 68 65  irst rule in the
ea20: 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 73 74   grammar */.  st
ea30: 72 75 63 74 20 72 75 6c 65 20 2a 6c 61 73 74 72  ruct rule *lastr
ea40: 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ule;     /* Poin
ea50: 74 65 72 20 74 6f 20 74 68 65 20 6d 6f 73 74 20  ter to the most 
ea60: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
ea70: 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50  rule */.};../* P
ea80: 61 72 73 65 20 61 20 73 69 6e 67 6c 65 20 74 6f  arse a single to
ea90: 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ken */.static vo
eaa0: 69 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e  id parseonetoken
eab0: 28 70 73 70 29 0a 73 74 72 75 63 74 20 70 73 74  (psp).struct pst
eac0: 61 74 65 20 2a 70 73 70 3b 0a 7b 0a 20 20 63 68  ate *psp;.{.  ch
ead0: 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20 53 74 72  ar *x;.  x = Str
eae0: 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b 65 6e 73  safe(psp->tokens
eaf0: 74 61 72 74 29 3b 20 20 20 20 20 2f 2a 20 53 61  tart);     /* Sa
eb00: 76 65 20 74 68 65 20 74 6f 6b 65 6e 20 70 65 72  ve the token per
eb10: 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23 69 66 20  manently */.#if 
eb20: 30 0a 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25  0.  printf("%s:%
eb30: 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d 20 73 74  d: Token=[%s] st
eb40: 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70 2d 3e 66  ate=%d\n",psp->f
eb50: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
eb60: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 78 2c  enlineno,.    x,
eb70: 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a 23 65 6e  psp->state);.#en
eb80: 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 73  dif.  switch( ps
eb90: 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20  p->state ){.    
eba0: 63 61 73 65 20 49 4e 49 54 49 41 4c 49 5a 45 3a  case INITIALIZE:
ebb0: 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76  .      psp->prev
ebc0: 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
ebd0: 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
ebe0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d   = 0;.      psp-
ebf0: 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73 70  >firstrule = psp
ec00: 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 30 3b 0a  ->lastrule = 0;.
ec10: 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 6e        psp->gp->n
ec20: 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
ec30: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20  /* Fall thru to 
ec40: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
ec50: 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
ec60: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3a 0a  R_DECL_OR_RULE:.
ec70: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
ec80: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '%' ){.        p
ec90: 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
eca0: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
ecb0: 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73  WORD;.      }els
ecc0: 65 20 69 66 28 20 69 73 6c 6f 77 65 72 28 78 5b  e if( islower(x[
ecd0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
ece0: 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d 62 6f 6c  sp->lhs = Symbol
ecf0: 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
ed00: 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20 30 3b 0a   psp->nrhs = 0;.
ed10: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
ed20: 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  alias = 0;.     
ed30: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
ed40: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f  WAITING_FOR_ARRO
ed50: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  W;.      }else i
ed60: 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 29 7b 0a  f( x[0]=='{' ){.
ed70: 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
ed80: 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a  >prevrule==0 ){.
ed90: 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
eda0: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
edb0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
edc0: 6f 2c 0a 22 54 68 65 72 65 20 69 73 20 6e 6f 74  o,."There is not
edd0: 20 70 72 69 6f 72 20 72 75 6c 65 20 6f 70 6f 6e   prior rule opon
ede0: 20 77 68 69 63 68 20 74 6f 20 61 74 74 61 63 68   which to attach
edf0: 20 74 68 65 20 63 6f 64 65 20 5c 0a 66 72 61 67   the code \.frag
ee00: 6d 65 6e 74 20 77 68 69 63 68 20 62 65 67 69 6e  ment which begin
ee10: 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 2e 22  s on this line."
ee20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
ee30: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d  ->errorcnt++;..}
ee40: 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72  else if( psp->pr
ee50: 65 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20  evrule->code!=0 
ee60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
ee70: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
ee80: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
ee90: 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67  neno,."Code frag
eea0: 6d 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f  ment beginning o
eeb0: 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
eec0: 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74  ot the first \.t
eed0: 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65  o follow the pre
eee0: 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20  vious rule.");. 
eef0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
ef00: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
ef10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ef20: 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
ef30: 2d 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f  ->line = psp->to
ef40: 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  kenlineno;.     
ef50: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
ef60: 6c 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d  le->code = &x[1]
ef70: 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ;..}.      }else
ef80: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27 20 29   if( x[0]=='[' )
ef90: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
efa0: 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43  tate = PRECEDENC
efb0: 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20 20 20  E_MARK_1;.      
efc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
efd0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
efe0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
eff0: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
f000: 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c 22 20    "Token \"%s\" 
f010: 73 68 6f 75 6c 64 20 62 65 20 65 69 74 68 65 72  should be either
f020: 20 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e 6f 6e   \"%%\" or a non
f030: 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22 2c  terminal name.",
f040: 0a 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a 20  .          x);. 
f050: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f060: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
f070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f080: 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45   case PRECEDENCE
f090: 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20 20 69  _MARK_1:.      i
f0a0: 66 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d  f( !isupper(x[0]
f0b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
f0c0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f0d0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f0e0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
f0f0: 22 54 68 65 20 70 72 65 63 65 64 65 6e 63 65 20  "The precedence 
f100: 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65 20 61  symbol must be a
f110: 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20 20   terminal.");.  
f120: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f130: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
f140: 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76  se if( psp->prev
f150: 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
f160: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f170: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f180: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f190: 20 20 20 20 20 20 22 54 68 65 72 65 20 69 73 20        "There is 
f1a0: 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 74 6f  no prior rule to
f1b0: 20 61 73 73 69 67 6e 20 70 72 65 63 65 64 65 6e   assign preceden
f1c0: 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78 29  ce \"[%s]\".",x)
f1d0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f1e0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f1f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
f200: 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79  prevrule->precsy
f210: 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
f220: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f230: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f240: 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63 65 64  nlineno,."Preced
f250: 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74 68 69  ence mark on thi
f260: 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  s line is not th
f270: 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c  e first \.to fol
f280: 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75 73  low the previous
f290: 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   rule.");.      
f2a0: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f2b0: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
f2c0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
f2d0: 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 20 3d  vrule->precsym =
f2e0: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
f2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73        }.      ps
f300: 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
f310: 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20 20  DENCE_MARK_2;.  
f320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
f330: 61 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  ase PRECEDENCE_M
f340: 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  ARK_2:.      if(
f350: 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a 20 20   x[0]!=']' ){.  
f360: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f370: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f380: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f390: 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
f3a0: 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65 63 65  g \"]\" on prece
f3b0: 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b 0a 20  dence mark.");. 
f3c0: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f3d0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
f3e0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f3f0: 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
f400: 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
f410: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
f420: 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41  se WAITING_FOR_A
f430: 52 52 4f 57 3a 0a 20 20 20 20 20 20 69 66 28 20  RROW:.      if( 
f440: 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31  x[0]==':' && x[1
f450: 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d  ]==':' && x[2]==
f460: 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '=' ){.        p
f470: 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
f480: 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  HS;.      }else 
f490: 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 29 7b  if( x[0]=='(' ){
f4a0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
f4b0: 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f  ate = LHS_ALIAS_
f4c0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
f4d0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f4e0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f4f0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f500: 0a 20 20 20 20 20 20 20 20 20 20 22 45 78 70 65  .          "Expe
f510: 63 74 65 64 20 74 6f 20 73 65 65 20 61 20 5c 22  cted to see a \"
f520: 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  :\" following th
f530: 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25  e LHS symbol \"%
f540: 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  s\".",.         
f550: 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29   psp->lhs->name)
f560: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f570: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f580: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f590: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
f5a0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
f5b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f5c0: 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53    case LHS_ALIAS
f5d0: 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73  _1:.      if( is
f5e0: 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
f5f0: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61         psp->lhsa
f600: 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20 20 20 20  lias = x;.      
f610: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c    psp->state = L
f620: 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20  HS_ALIAS_2;.    
f630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f640: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f650: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f660: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f670: 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20 6e      "\"%s\" is n
f680: 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61 73  ot a valid alias
f690: 20 66 6f 72 20 74 68 65 20 4c 48 53 20 5c 22 25   for the LHS \"%
f6a0: 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\"\n",.        
f6b0: 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61    x,psp->lhs->na
f6c0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
f6d0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
f6e0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f6f0: 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
f700: 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
f710: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f720: 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c  .    case LHS_AL
f730: 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  IAS_2:.      if(
f740: 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20   x[0]==')' ){.  
f750: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f760: 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3b 0a   = LHS_ALIAS_3;.
f770: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f780: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f790: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f7a0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f7b0: 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
f7c0: 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
f7d0: 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
f7e0: 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
f7f0: 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
f800: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f810: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f820: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
f830: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
f840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f850: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
f860: 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20 20 20  S_ALIAS_3:.     
f870: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26   if( x[0]==':' &
f880: 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78  & x[1]==':' && x
f890: 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20  [2]=='=' ){.    
f8a0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f8b0: 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
f8c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
f8d0: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
f8e0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f8f0: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
f900: 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e 5c 22   "Missing \"->\"
f910: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25 73   following: \"%s
f920: 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20 20 20  (%s)\".",.      
f930: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
f940: 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ame,psp->lhsalia
f950: 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
f960: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f970: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f980: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
f990: 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
f9a0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f9b0: 20 20 20 20 63 61 73 65 20 49 4e 5f 52 48 53 3a      case IN_RHS:
f9c0: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
f9d0: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
f9e0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
f9f0: 0a 20 20 20 20 20 20 20 20 72 70 20 3d 20 28 73  .        rp = (s
fa00: 74 72 75 63 74 20 72 75 6c 65 20 2a 29 6d 61 6c  truct rule *)mal
fa10: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
fa20: 63 74 20 72 75 6c 65 29 20 2b 20 0a 20 20 20 20  ct rule) + .    
fa30: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
fa40: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
fa50: 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69 7a 65  psp->nrhs + size
fa60: 6f 66 28 63 68 61 72 2a 29 2a 70 73 70 2d 3e 6e  of(char*)*psp->n
fa70: 72 68 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69  rhs );.        i
fa80: 66 28 20 72 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rp==0 ){.    
fa90: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
faa0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
fab0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
fac0: 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 27             "Can'
fad0: 74 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67  t allocate enoug
fae0: 68 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 69  h memory for thi
faf0: 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20  s rule.");.     
fb00: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
fb10: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
fb20: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20  psp->prevrule = 
fb30: 30 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20  0;..}else{.     
fb40: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
fb50: 20 20 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69        rp->ruleli
fb60: 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ne = psp->tokenl
fb70: 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  ineno;.         
fb80: 20 72 70 2d 3e 72 68 73 20 3d 20 28 73 74 72 75   rp->rhs = (stru
fb90: 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b  ct symbol**)&rp[
fba0: 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  1];.          rp
fbb0: 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20 28 63 68  ->rhsalias = (ch
fbc0: 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70  ar**)&(rp->rhs[p
fbd0: 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20  sp->nrhs]);.    
fbe0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
fbf0: 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  <psp->nrhs; i++)
fc00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70  {.            rp
fc10: 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e  ->rhs[i] = psp->
fc20: 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
fc30: 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
fc40: 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73  [i] = psp->alias
fc50: 5b 69 5d 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20  [i];..  }.      
fc60: 20 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73      rp->lhs = ps
fc70: 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20  p->lhs;.        
fc80: 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d    rp->lhsalias =
fc90: 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a   psp->lhsalias;.
fca0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72            rp->nr
fcb0: 68 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a  hs = psp->nrhs;.
fcc0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f            rp->co
fcd0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
fce0: 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20    rp->precsym = 
fcf0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  0;.          rp-
fd00: 3e 69 6e 64 65 78 20 3d 20 70 73 70 2d 3e 67 70  >index = psp->gp
fd10: 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20 20 20  ->nrule++;.     
fd20: 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 6c 68 73       rp->nextlhs
fd30: 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65   = rp->lhs->rule
fd40: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
fd50: 6c 68 73 2d 3e 72 75 6c 65 20 3d 20 72 70 3b 0a  lhs->rule = rp;.
fd60: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 65            rp->ne
fd70: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
fd80: 20 20 69 66 28 20 70 73 70 2d 3e 66 69 72 73 74    if( psp->first
fd90: 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
fda0: 20 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73         psp->firs
fdb0: 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73  trule = psp->las
fdc0: 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d  trule = rp;..  }
fdd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
fde0: 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d    psp->lastrule-
fdf0: 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20  >next = rp;.    
fe00: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73          psp->las
fe10: 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d  trule = rp;..  }
fe20: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fe30: 70 72 65 76 72 75 6c 65 20 3d 20 72 70 3b 0a 09  prevrule = rp;..
fe40: 7d 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  }.        psp->s
fe50: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
fe60: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
fe70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
fe80: 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29   isalpha(x[0]) )
fe90: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  {.        if( ps
fea0: 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20  p->nrhs>=MAXRHS 
feb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
fec0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
fed0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
fee0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
fef0: 20 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62    "Too many symb
ff00: 6f 6c 73 20 6f 6e 20 52 48 53 20 6f 72 20 72 75  ols on RHS or ru
ff10: 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  le beginning at 
ff20: 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20  \"%s\".",.      
ff30: 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20        x);.      
ff40: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
ff50: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
ff60: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
ff70: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
ff80: 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20  ROR;..}else{.   
ff90: 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b         psp->rhs[
ffa0: 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53 79 6d  psp->nrhs] = Sym
ffb0: 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
ffc0: 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73        psp->alias
ffd0: 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 30 3b  [psp->nrhs] = 0;
ffe0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fff0: 6e 72 68 73 2b 2b 3b 0a 09 7d 0a 20 20 20 20 20  nrhs++;..}.     
10000 20 7d 65 6c 73 65 20 69 66 28 20 28 78 5b 30 5d   }else if( (x[0]
10010 3d 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27  =='|' || x[0]=='
10020 2f 27 29 20 26 26 20 70 73 70 2d 3e 6e 72 68 73  /') && psp->nrhs
10030 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  >0 ){.        st
10040 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70  ruct symbol *msp
10050 20 3d 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d   = psp->rhs[psp-
10060 3e 6e 72 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20  >nrhs-1];.      
10070 20 20 69 66 28 20 6d 73 70 2d 3e 74 79 70 65 21    if( msp->type!
10080 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
10090 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
100a0 63 74 20 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73  ct symbol *origs
100b0 70 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20  p = msp;.       
100c0 20 20 20 6d 73 70 20 3d 20 6d 61 6c 6c 6f 63 28     msp = malloc(
100d0 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20  sizeof(*msp));. 
100e0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
100f0 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  msp, 0, sizeof(*
10100 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20  msp));.         
10110 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c   msp->type = MUL
10120 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20  TITERMINAL;.    
10130 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73        msp->nsubs
10140 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ym = 1;.        
10150 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20    msp->subsym = 
10160 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 73 74  malloc(sizeof(st
10170 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 29 3b 0a  ruct symbol*));.
10180 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73            msp->s
10190 75 62 73 79 6d 5b 30 5d 20 3d 20 6f 72 69 67 73  ubsym[0] = origs
101a0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70  p;.          msp
101b0 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69 67 73 70 2d  ->name = origsp-
101c0 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  >name;.         
101d0 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e   psp->rhs[psp->n
101e0 72 68 73 2d 31 5d 20 3d 20 6d 73 70 3b 0a 20 20  rhs-1] = msp;.  
101f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10200 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b 0a  msp->nsubsym++;.
10210 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62          msp->sub
10220 73 79 6d 20 3d 20 72 65 61 6c 6c 6f 63 28 6d 73  sym = realloc(ms
10230 70 2d 3e 73 75 62 73 79 6d 2c 20 73 69 7a 65 6f  p->subsym, sizeo
10240 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
10250 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b  )*msp->nsubsym);
10260 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75  .        msp->su
10270 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79  bsym[msp->nsubsy
10280 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  m-1] = Symbol_ne
10290 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20  w(&x[1]);.      
102a0 20 20 69 66 28 20 69 73 6c 6f 77 65 72 28 78 5b    if( islower(x[
102b0 31 5d 29 20 7c 7c 20 69 73 6c 6f 77 65 72 28 6d  1]) || islower(m
102c0 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e  sp->subsym[0]->n
102d0 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  ame[0]) ){.     
102e0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
102f0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10300 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
10310 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f            "Canno
10320 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f 75 6e  t form a compoun
10330 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e  d containing a n
10340 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b 0a 20  on-terminal");. 
10350 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
10360 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
10370 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
10380 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26  if( x[0]=='(' &&
10390 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a   psp->nrhs>0 ){.
103a0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
103b0 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31  te = RHS_ALIAS_1
103c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
103d0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
103e0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
103f0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
10400 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67            "Illeg
10410 61 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20  al character on 
10420 52 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25  RHS of rule: \"%
10430 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
10440 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10450 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
10460 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
10470 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
10480 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10490 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
104a0 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20  HS_ALIAS_1:.    
104b0 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b    if( isalpha(x[
104c0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
104d0 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e  sp->alias[psp->n
104e0 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20  rhs-1] = x;.    
104f0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10500 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20   RHS_ALIAS_2;.  
10510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10520 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
10530 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
10540 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
10550 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73        "\"%s\" is
10560 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69   not a valid ali
10570 61 73 20 66 6f 72 20 74 68 65 20 52 48 53 20 73  as for the RHS s
10580 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c  ymbol \"%s\"\n",
10590 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70  .          x,psp
105a0 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d  ->rhs[psp->nrhs-
105b0 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  1]->name);.     
105c0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
105d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
105e0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
105f0 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
10600 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10610 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
10620 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20  RHS_ALIAS_2:.   
10630 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27     if( x[0]==')'
10640 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
10650 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
10660 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10670 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10680 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10690 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
106a0 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
106b0 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e  g \")\" followin
106c0 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65  g LHS alias name
106d0 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c   \"%s\".",psp->l
106e0 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  hsalias);.      
106f0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10700 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
10710 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
10720 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
10730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
10740 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
10750 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
10760 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69  KEYWORD:.      i
10770 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
10780 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
10790 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78  >declkeyword = x
107a0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
107b0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a  eclargslot = 0;.
107c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
107d0 6c 6c 6e 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20  llnslot = 0;.   
107e0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
107f0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
10800 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20  CL_ARG;.        
10810 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61  if( strcmp(x,"na
10820 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  me")==0 ){.     
10830 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10840 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10850 70 2d 3e 6e 61 6d 65 29 3b 0a 09 7d 65 6c 73 65  p->name);..}else
10860 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69   if( strcmp(x,"i
10870 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20  nclude")==0 ){. 
10880 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10890 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
108a0 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b  p->gp->include);
108b0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
108c0 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73  decllnslot = &ps
108d0 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 6c 6e  p->gp->includeln
108e0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
108f0 63 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d 30  cmp(x,"code")==0
10900 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10910 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10920 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72   &(psp->gp->extr
10930 61 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20  acode);.        
10940 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f    psp->decllnslo
10950 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 65 78  t = &psp->gp->ex
10960 74 72 61 63 6f 64 65 6c 6e 3b 0a 09 7d 65 6c 73  tracodeln;..}els
10970 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10980 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72  token_destructor
10990 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
109a0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
109b0 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
109c0 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20  tokendest;.     
109d0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
109e0 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
109f0 3e 74 6f 6b 65 6e 64 65 73 74 6c 6e 3b 0a 09 7d  >tokendestln;..}
10a00 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10a10 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72  x,"default_destr
10a20 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20  uctor")==0 ){.  
10a30 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10a40 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d  largslot = &psp-
10a50 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20  >gp->vardest;.  
10a60 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10a70 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  llnslot = &psp->
10a80 67 70 2d 3e 76 61 72 64 65 73 74 6c 6e 3b 0a 09  gp->vardestln;..
10a90 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10aa0 28 78 2c 22 74 6f 6b 65 6e 5f 70 72 65 66 69 78  (x,"token_prefix
10ab0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10ac0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10ad0 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
10ae0 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 09 7d 65  tokenprefix;..}e
10af0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
10b00 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29  ,"syntax_error")
10b10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10b20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10b30 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
10b40 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20  rror);.         
10b50 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74   psp->decllnslot
10b60 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 65 72 72   = &psp->gp->err
10b70 6f 72 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28  orln;..}else if(
10b80 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65   strcmp(x,"parse
10b90 5f 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a  _accept")==0 ){.
10ba0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10bb0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
10bc0 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b  sp->gp->accept);
10bd0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10be0 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73  decllnslot = &ps
10bf0 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 6c 6e 3b  p->gp->acceptln;
10c00 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
10c10 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c  mp(x,"parse_fail
10c20 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ure")==0 ){.    
10c30 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
10c40 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
10c50 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20  gp->failure);.  
10c60 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10c70 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  llnslot = &psp->
10c80 67 70 2d 3e 66 61 69 6c 75 72 65 6c 6e 3b 0a 09  gp->failureln;..
10c90 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10ca0 28 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c  (x,"stack_overfl
10cb0 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ow")==0 ){.     
10cc0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10cd0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10ce0 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  p->overflow);.  
10cf0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10d00 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  llnslot = &psp->
10d10 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 3b 0a  gp->overflowln;.
10d20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10d30 28 20 73 74 72 63 6d 70 28 78 2c 22 65 78 74 72  ( strcmp(x,"extr
10d40 61 5f 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20  a_argument")==0 
10d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10d60 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10d70 26 28 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b  &(psp->gp->arg);
10d80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10d90 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b  f( strcmp(x,"tok
10da0 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a  en_type")==0 ){.
10db0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10dc0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
10dd0 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70  sp->gp->tokentyp
10de0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
10df0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10e00 64 65 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d  default_type")==
10e10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10e20 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10e30 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72  = &(psp->gp->var
10e40 74 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  type);.        }
10e50 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10e60 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d  x,"stack_size")=
10e70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10e80 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10e90 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74   = &(psp->gp->st
10ea0 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  acksize);.      
10eb0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10ec0 6d 70 28 78 2c 22 73 74 61 72 74 5f 73 79 6d 62  mp(x,"start_symb
10ed0 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ol")==0 ){.     
10ee0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10ef0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10f00 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 20  p->start);.     
10f10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10f20 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30  cmp(x,"left")==0
10f30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10f40 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b  p->preccounter++
10f50 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10f60 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46  >declassoc = LEF
10f70 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  T;.          psp
10f80 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
10f90 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
10fa0 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
10fb0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
10fc0 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d 30 20  p(x,"right")==0 
10fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10fe0 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b  ->preccounter++;
10ff0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11000 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49 47 48  declassoc = RIGH
11010 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  T;.          psp
11020 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11030 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
11040 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
11050 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11060 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d  p(x,"nonassoc")=
11070 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11080 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
11090 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
110a0 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e  p->declassoc = N
110b0 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ONE;.          p
110c0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
110d0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
110e0 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73  CE_SYMBOL;..}els
110f0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11100 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
11110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11120 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11130 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52  G_FOR_DESTRUCTOR
11140 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20  _SYMBOL;..}else 
11150 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 79  if( strcmp(x,"ty
11160 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
11170 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11180 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41  = WAITING_FOR_DA
11190 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20  TATYPE_SYMBOL;. 
111a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
111b0 20 73 74 72 63 6d 70 28 78 2c 22 66 61 6c 6c 62   strcmp(x,"fallb
111c0 61 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ack")==0 ){.    
111d0 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62        psp->fallb
111e0 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ack = 0;.       
111f0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11200 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c  WAITING_FOR_FALL
11210 42 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20 20 20  BACK_ID;.       
11220 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11230 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22 29 3d  p(x,"wildcard")=
11240 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11250 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
11260 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52  TING_FOR_WILDCAR
11270 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65  D_ID;.        }e
11280 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45  lse{.          E
11290 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
112a0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
112b0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
112c0 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63      "Unknown dec
112d0 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64  laration keyword
112e0 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b  : \"%%%s\".",x);
112f0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11300 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11310 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11320 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
11330 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20  DECL_ERROR;..}. 
11340 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11350 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
11360 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
11370 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11380 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20         "Illegal 
11390 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77  declaration keyw
113a0 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29  ord: \"%s\".",x)
113b0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
113c0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
113d0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
113e0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
113f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
11400 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11410 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
11420 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59  OR_DESTRUCTOR_SY
11430 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20  MBOL:.      if( 
11440 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29  !isalpha(x[0]) )
11450 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11460 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11470 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11480 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79  o,.          "Sy
11490 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e  mbol name missin
114a0 67 20 61 66 74 65 72 20 25 64 65 73 74 72 75 63  g after %destruc
114b0 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20  tor keyword");. 
114c0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
114d0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
114e0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
114f0 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
11500 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
11510 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
11520 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
11530 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
11540 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11550 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65  rgslot = &sp->de
11560 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20 20 20  structor;.      
11570 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f    psp->decllnslo
11580 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63  t = &sp->destruc
11590 74 6f 72 6c 6e 3b 0a 20 20 20 20 20 20 20 20 70  torln;.        p
115a0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
115b0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
115c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
115d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
115e0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
115f0 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20  TYPE_SYMBOL:.   
11600 20 20 20 69 66 28 20 21 69 73 61 6c 70 68 61 28     if( !isalpha(
11610 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
11620 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11630 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11640 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11650 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65      "Symbol name
11660 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20 25   missing after %
11670 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f  destructor keywo
11680 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  rd");.        ps
11690 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
116a0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
116b0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
116c0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
116d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
116e0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
116f0 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
11700 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  (x);.        psp
11710 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
11720 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20  &sp->datatype;. 
11730 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11740 6c 6e 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20  lnslot = 0;.    
11750 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11760 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
11770 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20  L_ARG;.      }. 
11780 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11790 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
117a0 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
117b0 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  OL:.      if( x[
117c0 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]=='.' ){.     
117d0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
117e0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
117f0 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20  _OR_RULE;.      
11800 7d 65 6c 73 65 20 69 66 28 20 69 73 75 70 70 65  }else if( isuppe
11810 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  r(x[0]) ){.     
11820 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
11830 20 2a 73 70 3b 0a 20 20 20 20 20 20 20 20 73 70   *sp;.        sp
11840 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
11850 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70  ;.        if( sp
11860 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20  ->prec>=0 ){.   
11870 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11880 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11890 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
118a0 20 20 20 20 20 20 20 20 20 20 20 20 22 53 79 6d              "Sym
118b0 62 6f 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 61  bol \"%s\" has a
118c0 6c 72 65 61 64 79 20 62 65 20 67 69 76 65 6e 20  lready be given 
118d0 61 20 70 72 65 63 65 64 65 6e 63 65 2e 22 2c 78  a precedence.",x
118e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
118f0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d  ->errorcnt++;..}
11900 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11910 73 70 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d 3e  sp->prec = psp->
11920 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20 20  preccounter;.   
11930 20 20 20 20 20 20 20 73 70 2d 3e 61 73 73 6f 63         sp->assoc
11940 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f   = psp->declasso
11950 63 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73  c;..}.      }els
11960 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
11970 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11980 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11990 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  no,.          "C
119a0 61 6e 27 74 20 61 73 73 69 67 6e 20 61 20 70 72  an't assign a pr
119b0 65 63 65 64 65 6e 63 65 20 74 6f 20 5c 22 25 73  ecedence to \"%s
119c0 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
119d0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
119e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
119f0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
11a00 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
11a10 5f 41 52 47 3a 0a 20 20 20 20 20 20 69 66 28 20  _ARG:.      if( 
11a20 28 78 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78 5b  (x[0]=='{' || x[
11a30 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 69 73 61 6c  0]=='\"' || isal
11a40 6e 75 6d 28 78 5b 30 5d 29 29 20 29 7b 0a 20 20  num(x[0])) ){.  
11a50 20 20 20 20 20 20 69 66 28 20 2a 28 70 73 70 2d        if( *(psp-
11a60 3e 64 65 63 6c 61 72 67 73 6c 6f 74 29 21 3d 30  >declargslot)!=0
11a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
11a80 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11a90 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
11aa0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11ab0 20 20 20 22 54 68 65 20 61 72 67 75 6d 65 6e 74     "The argument
11ac0 20 5c 22 25 73 5c 22 20 74 6f 20 64 65 63 6c 61   \"%s\" to decla
11ad0 72 61 74 69 6f 6e 20 5c 22 25 25 25 73 5c 22 20  ration \"%%%s\" 
11ae0 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  is not the first
11af0 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .",.            
11b00 78 5b 30 5d 3d 3d 27 5c 22 27 20 3f 20 26 78 5b  x[0]=='\"' ? &x[
11b10 31 5d 20 3a 20 78 2c 70 73 70 2d 3e 64 65 63 6c  1] : x,psp->decl
11b20 6b 65 79 77 6f 72 64 29 3b 0a 20 20 20 20 20 20  keyword);.      
11b30 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
11b40 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
11b50 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11b60 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
11b70 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20  ROR;..}else{.   
11b80 20 20 20 20 20 20 20 2a 28 70 73 70 2d 3e 64 65         *(psp->de
11b90 63 6c 61 72 67 73 6c 6f 74 29 20 3d 20 28 78 5b  clargslot) = (x[
11ba0 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 78 5b 30 5d  0]=='\"' || x[0]
11bb0 3d 3d 27 7b 27 29 20 3f 20 26 78 5b 31 5d 20 3a  =='{') ? &x[1] :
11bc0 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   x;.          if
11bd0 28 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f  ( psp->decllnslo
11be0 74 20 29 20 2a 70 73 70 2d 3e 64 65 63 6c 6c 6e  t ) *psp->declln
11bf0 73 6c 6f 74 20 3d 20 70 73 70 2d 3e 74 6f 6b 65  slot = psp->toke
11c00 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20  nlineno;.       
11c10 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11c20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
11c30 5f 4f 52 5f 52 55 4c 45 3b 0a 09 7d 0a 20 20 20  _OR_RULE;..}.   
11c40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11c50 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11c60 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11c70 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11c80 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72       "Illegal ar
11c90 67 75 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20  gument to %%%s: 
11ca0 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79  %s",psp->declkey
11cb0 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20  word,x);.       
11cc0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11cd0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11ce0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
11cf0 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
11d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11d10 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
11d20 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41  ITING_FOR_FALLBA
11d30 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28  CK_ID:.      if(
11d40 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20   x[0]=='.' ){.  
11d50 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11d60 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
11d70 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
11d80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73     }else if( !is
11d90 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  upper(x[0]) ){. 
11da0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11db0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70  psp->filename, p
11dc0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11dd0 0a 20 20 20 20 20 20 20 20 20 20 22 25 25 66 61  .          "%%fa
11de0 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20  llback argument 
11df0 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65  \"%s\" should be
11e00 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20   a token", x);. 
11e10 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11e20 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
11e30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
11e40 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
11e50 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
11e60 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
11e70 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a  >fallback==0 ){.
11e80 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66            psp->f
11e90 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20  allback = sp;.  
11ea0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11eb0 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  sp->fallback ){.
11ec0 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
11ed0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11ee0 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  , psp->tokenline
11ef0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11f00 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66  "More than one f
11f10 61 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e 65 64  allback assigned
11f20 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78   to token %s", x
11f30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11f40 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11f50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11f60 20 20 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62         sp->fallb
11f70 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62  ack = psp->fallb
11f80 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ack;.          p
11f90 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c  sp->gp->has_fall
11fa0 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  back = 1;.      
11fb0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11fc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11fd0 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49  e WAITING_FOR_WI
11fe0 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20 20  LDCARD_ID:.     
11ff0 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
12000 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
12010 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
12020 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
12030 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
12040 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20   !isupper(x[0]) 
12050 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
12060 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
12070 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
12080 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
12090 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75 6d  %%wildcard argum
120a0 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c  ent \"%s\" shoul
120b0 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78  d be a token", x
120c0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
120d0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
120e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
120f0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
12100 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
12110 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
12120 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72  psp->gp->wildcar
12130 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  d==0 ){.        
12140 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63    psp->gp->wildc
12150 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20 20  ard = sp;.      
12160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12170 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12180 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e  >filename, psp->
12190 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
121a0 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61 20           "Extra 
121b0 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b 65  wildcard to toke
121c0 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20  n: %s", x);.    
121d0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
121e0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
121f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12200 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
12210 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
12220 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20  _ERROR:./*      
12230 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20  if( x[0]=='.' ) 
12240 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
12250 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
12260 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62  _RULE;.**      b
12270 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73  reak; */.    cas
12280 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  e RESYNC_AFTER_D
12290 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20  ECL_ERROR:.     
122a0 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
122b0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
122c0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
122d0 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69 66  R_RULE;.      if
122e0 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73  ( x[0]=='%' ) ps
122f0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
12300 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
12310 4f 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ORD;.      break
12320 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20  ;.  }.}../* Run 
12330 74 68 65 20 70 72 6f 70 72 6f 63 65 73 73 6f 72  the proprocessor
12340 20 6f 76 65 72 20 74 68 65 20 69 6e 70 75 74 20   over the input 
12350 66 69 6c 65 20 74 65 78 74 2e 20 20 54 68 65 20  file text.  The 
12360 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
12370 0a 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d 20  .** azDefine[0] 
12380 74 68 72 6f 75 67 68 20 61 7a 44 65 66 69 6e 65  through azDefine
12390 5b 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e 74  [nDefine-1] cont
123a0 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
123b0 66 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a 2a  f all defined.**
123c0 20 6d 61 63 72 6f 73 2e 20 20 54 68 69 73 20 72   macros.  This r
123d0 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72  outine looks for
123e0 20 22 25 69 66 64 65 66 22 20 61 6e 64 20 22 25   "%ifdef" and "%
123f0 69 66 6e 64 65 66 22 20 61 6e 64 20 22 25 65 6e  ifndef" and "%en
12400 64 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d  dif" and.** comm
12410 65 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e 20 20  ents them out.  
12420 54 65 78 74 20 69 6e 20 62 65 74 77 65 65 6e 20  Text in between 
12430 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65  is also commente
12440 64 20 6f 75 74 20 61 73 20 61 70 70 72 6f 70 72  d out as appropr
12450 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
12460 76 6f 69 64 20 70 72 65 70 72 6f 63 65 73 73 5f  void preprocess_
12470 69 6e 70 75 74 28 63 68 61 72 20 2a 7a 29 7b 0a  input(char *z){.
12480 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e    int i, j, k, n
12490 3b 0a 20 20 69 6e 74 20 65 78 63 6c 75 64 65 20  ;.  int exclude 
124a0 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  = 0;.  int start
124b0 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d  ;.  int lineno =
124c0 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 5f   1;.  int start_
124d0 6c 69 6e 65 6e 6f 3b 0a 20 20 66 6f 72 28 69 3d  lineno;.  for(i=
124e0 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
124f0 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
12500 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
12510 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 25 27 20    if( z[i]!='%' 
12520 7c 7c 20 28 69 3e 30 20 26 26 20 7a 5b 69 2d 31  || (i>0 && z[i-1
12530 5d 21 3d 27 5c 6e 27 29 20 29 20 63 6f 6e 74 69  ]!='\n') ) conti
12540 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 72  nue;.    if( str
12550 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 65 6e 64  ncmp(&z[i],"%end
12560 69 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73 73  if",6)==0 && iss
12570 70 61 63 65 28 7a 5b 69 2b 36 5d 29 20 29 7b 0a  pace(z[i+6]) ){.
12580 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
12590 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63  e ){.        exc
125a0 6c 75 64 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20  lude--;.        
125b0 69 66 28 20 65 78 63 6c 75 64 65 3d 3d 30 20 29  if( exclude==0 )
125c0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
125d0 6a 3d 73 74 61 72 74 3b 20 6a 3c 69 3b 20 6a 2b  j=start; j<i; j+
125e0 2b 29 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c 6e  +) if( z[j]!='\n
125f0 27 20 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a  ' ) z[j] = ' ';.
12600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12610 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b  }.      for(j=i;
12620 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27   z[j] && z[j]!='
12630 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d  \n'; j++) z[j] =
12640 20 27 20 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20   ' ';.    }else 
12650 69 66 28 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b  if( (strncmp(&z[
12660 69 5d 2c 22 25 69 66 64 65 66 22 2c 36 29 3d 3d  i],"%ifdef",6)==
12670 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
12680 2b 36 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20  +6])).          
12690 7c 7c 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69  || (strncmp(&z[i
126a0 5d 2c 22 25 69 66 6e 64 65 66 22 2c 37 29 3d 3d  ],"%ifndef",7)==
126b0 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
126c0 2b 37 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 69  +7])) ){.      i
126d0 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20  f( exclude ){.  
126e0 20 20 20 20 20 20 65 78 63 6c 75 64 65 2b 2b 3b        exclude++;
126f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12700 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 37 3b        for(j=i+7;
12710 20 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20   isspace(z[j]); 
12720 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 66  j++){}.        f
12730 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20 26  or(n=0; z[j+n] &
12740 26 20 21 69 73 73 70 61 63 65 28 7a 5b 6a 2b 6e  & !isspace(z[j+n
12750 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); n++){}.     
12760 20 20 20 65 78 63 6c 75 64 65 20 3d 20 31 3b 0a     exclude = 1;.
12770 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
12780 20 6b 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b 29   k<nDefine; k++)
12790 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
127a0 73 74 72 6e 63 6d 70 28 61 7a 44 65 66 69 6e 65  strncmp(azDefine
127b0 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20  [k],&z[j],n)==0 
127c0 26 26 20 73 74 72 6c 65 6e 28 61 7a 44 65 66 69  && strlen(azDefi
127d0 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20  ne[k])==n ){.   
127e0 20 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65           exclude
127f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
12800 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
12820 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 33         if( z[i+3
12830 5d 3d 3d 27 6e 27 20 29 20 65 78 63 6c 75 64 65  ]=='n' ) exclude
12840 20 3d 20 21 65 78 63 6c 75 64 65 3b 0a 20 20 20   = !exclude;.   
12850 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65       if( exclude
12860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
12870 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  art = i;.       
12880 20 20 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20     start_lineno 
12890 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  = lineno;.      
128a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
128b0 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20    for(j=i; z[j] 
128c0 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a  && z[j]!='\n'; j
128d0 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a  ++) z[j] = ' ';.
128e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
128f0 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 66  exclude ){.    f
12900 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 75  printf(stderr,"u
12910 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 25 69 66  nterminated %%if
12920 64 65 66 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  def starting on 
12930 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 73 74 61 72  line %d\n", star
12940 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 65  t_lineno);.    e
12950 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  xit(1);.  }.}../
12960 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74  * In spite of it
12970 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e  s name, this fun
12980 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20  ction is really 
12990 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72  a scanner.  It r
129a0 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e  ead.** in the en
129b0 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20  tire input file 
129c0 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68  (all at once) th
129d0 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e  en tokenizes it.
129e0 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20    Each.** token 
129f0 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  is passed to the
12a00 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65   function "parse
12a10 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20  onetoken" which 
12a20 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68  builds all.** th
12a30 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61  e appropriate da
12a40 74 61 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ta structures in
12a50 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74   the global stat
12a60 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a  e vector "gp"..*
12a70 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 67 70 29  /.void Parse(gp)
12a80 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67  .struct lemon *g
12a90 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 73  p;.{.  struct ps
12aa0 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c 45 20  tate ps;.  FILE 
12ab0 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c  *fp;.  char *fil
12ac0 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c 65  ebuf;.  int file
12ad0 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65  size;.  int line
12ae0 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63  no;.  int c;.  c
12af0 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70  har *cp, *nextcp
12b00 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e  ;.  int startlin
12b10 65 20 3d 20 30 3b 0a 0a 20 20 70 73 2e 67 70 20  e = 0;..  ps.gp 
12b20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e  = gp;.  ps.filen
12b30 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61  ame = gp->filena
12b40 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e  me;.  ps.errorcn
12b50 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74  t = 0;.  ps.stat
12b60 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a  e = INITIALIZE;.
12b70 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72  .  /* Begin by r
12b80 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74  eading the input
12b90 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20   file */.  fp = 
12ba0 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d  fopen(ps.filenam
12bb0 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66  e,"rb");.  if( f
12bc0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f  p==0 ){.    Erro
12bd0 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65  rMsg(ps.filename
12be0 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  ,0,"Can't open t
12bf0 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61  his file for rea
12c00 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d  ding.");.    gp-
12c10 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12c20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
12c30 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20  seek(fp,0,2);.  
12c40 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c  filesize = ftell
12c50 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66  (fp);.  rewind(f
12c60 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20  p);.  filebuf = 
12c70 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20  (char *)malloc( 
12c80 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20  filesize+1 );.  
12c90 69 66 28 20 66 69 6c 65 62 75 66 3d 3d 30 20 29  if( filebuf==0 )
12ca0 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70  {.    ErrorMsg(p
12cb0 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61  s.filename,0,"Ca
12cc0 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 25 64 20  n't allocate %d 
12cd0 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  of memory to hol
12ce0 64 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20  d this file.",. 
12cf0 20 20 20 20 20 66 69 6c 65 73 69 7a 65 2b 31 29       filesize+1)
12d00 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63  ;.    gp->errorc
12d10 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
12d20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 61  ;.  }.  if( frea
12d30 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65  d(filebuf,1,file
12d40 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73 69  size,fp)!=filesi
12d50 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d  ze ){.    ErrorM
12d60 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30  sg(ps.filename,0
12d70 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e 20  ,"Can't read in 
12d80 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66 20  all %d bytes of 
12d90 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20  this file.",.   
12da0 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20     filesize);.  
12db0 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b    free(filebuf);
12dc0 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e  .    gp->errorcn
12dd0 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t++;.    return;
12de0 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70  .  }.  fclose(fp
12df0 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69 6c  );.  filebuf[fil
12e00 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f  esize] = 0;..  /
12e10 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74 69 61  * Make an initia
12e20 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74  l pass through t
12e30 68 65 20 66 69 6c 65 20 74 6f 20 68 61 6e 64 6c  he file to handl
12e40 65 20 25 69 66 64 65 66 20 61 6e 64 20 25 69 66  e %ifdef and %if
12e50 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65 70 72 6f  ndef */.  prepro
12e60 63 65 73 73 5f 69 6e 70 75 74 28 66 69 6c 65 62  cess_input(fileb
12e70 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73  uf);..  /* Now s
12e80 63 61 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20  can the text of 
12e90 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
12ea0 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  /.  lineno = 1;.
12eb0 20 20 66 6f 72 28 63 70 3d 66 69 6c 65 62 75 66    for(cp=filebuf
12ec0 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20 29  ; (c= *cp)!=0; )
12ed0 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e  {.    if( c=='\n
12ee0 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20  ' ) lineno++;   
12ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
12f00 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
12f10 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  line number */. 
12f20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63     if( isspace(c
12f30 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74 69  ) ){ cp++; conti
12f40 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70 20  nue; }  /* Skip 
12f50 61 6c 6c 20 77 68 69 74 65 20 73 70 61 63 65 20  all white space 
12f60 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f  */.    if( c=='/
12f70 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20  ' && cp[1]=='/' 
12f80 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ){          /* S
12f90 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f  kip C++ style co
12fa0 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  mments */.      
12fb0 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69  cp+=2;.      whi
12fc0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
12fd0 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b  && c!='\n' ) cp+
12fe0 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  +;.      continu
12ff0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
13000 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
13010 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20 20 20 20  =='*' ){        
13020 20 20 2f 2a 20 53 6b 69 70 20 43 20 73 74 79 6c    /* Skip C styl
13030 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20  e comments */.  
13040 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20      cp+=2;.     
13050 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
13060 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c  !=0 && (c!='/' |
13070 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20 29  | cp[-1]!='*') )
13080 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
13090 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
130a0 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a  ;.        cp++;.
130b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
130c0 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  ( c ) cp++;.    
130d0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
130e0 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73 74  }.    ps.tokenst
130f0 61 72 74 20 3d 20 63 70 3b 20 20 20 20 20 20 20  art = cp;       
13100 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b           /* Mark
13110 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
13120 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20  f the token */. 
13130 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e     ps.tokenlinen
13140 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20  o = lineno;     
13150 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d        /* Linenum
13160 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74 6f 6b  ber on which tok
13170 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20 20  en begins */.   
13180 20 69 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b 20   if( c=='\"' ){ 
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 69      /* String li
131b0 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20  terals */.      
131c0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c  cp++;.      whil
131d0 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
131e0 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20 20  & c!='\"' ){.   
131f0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
13200 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
13210 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
13220 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
13230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  0 ){.        Err
13240 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
13250 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53 74  e,startline,."St
13260 72 69 6e 67 20 73 74 61 72 74 69 6e 67 20 6f 6e  ring starting on
13270 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
13280 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66  t terminated bef
13290 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ore the end of t
132a0 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20  he file.");.    
132b0 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b      ps.errorcnt+
132c0 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  +;.        nextc
132d0 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65  p = cp;.      }e
132e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  lse{.        nex
132f0 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20  tcp = cp+1;.    
13300 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
13310 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20 20  ( c=='{' ){     
13320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62            /* A b
13330 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65 20 2a  lock of C code *
13340 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 76 65  /.      int leve
13350 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  l;.      cp++;. 
13360 20 20 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d 31       for(level=1
13370 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ; (c= *cp)!=0 &&
13380 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21 3d   (level>1 || c!=
13390 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20  '}'); cp++){.   
133a0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
133b0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
133c0 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
133d0 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a  ='{' ) level++;.
133e0 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
133f0 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c 2d   c=='}' ) level-
13400 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  -;.        else 
13410 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
13420 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a 20  [1]=='*' ){  /* 
13430 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f  Skip comments */
13440 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 70  .          int p
13450 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20  revc;.          
13460 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20  cp = &cp[2];.   
13470 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 30         prevc = 0
13480 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
13490 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
134a0 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72 65  & (c!='/' || pre
134b0 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20  vc!='*') ){.    
134c0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
134d0 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
134e0 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76              prev
134f0 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  c = c;.         
13500 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d 0a 09 7d     cp++;..  }..}
13510 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20  else if( c=='/' 
13520 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b  && cp[1]=='/' ){
13530 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74    /* Skip C++ st
13540 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 6f  yle comments too
13550 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 70   */.          cp
13560 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20   = &cp[2];.     
13570 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
13580 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  *cp)!=0 && c!='\
13590 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20  n' ) cp++;.     
135a0 20 20 20 20 20 69 66 28 20 63 20 29 20 6c 69 6e       if( c ) lin
135b0 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66  eno++;..}else if
135c0 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d  ( c=='\'' || c==
135d0 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53 74  '\"' ){    /* St
135e0 72 69 6e 67 20 61 20 63 68 61 72 61 63 74 65 72  ring a character
135f0 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20   literals */.   
13600 20 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74         int start
13610 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20 20  char, prevc;.   
13620 20 20 20 20 20 20 20 73 74 61 72 74 63 68 61 72         startchar
13630 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
13640 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20  prevc = 0;.     
13650 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28       for(cp++; (
13660 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63  c= *cp)!=0 && (c
13670 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20 70  !=startchar || p
13680 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b  revc=='\\'); cp+
13690 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
136a0 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
136b0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
136c0 20 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d 27      if( prevc=='
136d0 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30 3b  \\' ) prevc = 0;
136e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
136f0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  e              p
13700 72 65 76 63 20 3d 20 63 3b 0a 09 20 20 7d 0a 09  revc = c;..  }..
13710 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
13720 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
13730 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
13740 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65  filename,ps.toke
13750 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65  nlineno,."C code
13760 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69   starting on thi
13770 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65  s line is not te
13780 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20  rminated before 
13790 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
137a0 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ile.");.        
137b0 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  ps.errorcnt++;. 
137c0 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
137d0 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  cp;.      }else{
137e0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
137f0 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  = cp+1;.      }.
13800 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
13810 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20 20 20 20  alnum(c) ){     
13820 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66 69       /* Identifi
13830 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68 69  ers */.      whi
13840 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
13850 26 26 20 28 69 73 61 6c 6e 75 6d 28 63 29 20 7c  && (isalnum(c) |
13860 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b  | c=='_') ) cp++
13870 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
13880 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   cp;.    }else i
13890 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b  f( c==':' && cp[
138a0 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d  1]==':' && cp[2]
138b0 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20  =='=' ){ /* The 
138c0 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a  operator "::=" *
138d0 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33 3b  /.      cp += 3;
138e0 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
138f0 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  cp;.    }else if
13900 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d  ( (c=='/' || c==
13910 27 7c 27 29 20 26 26 20 69 73 61 6c 70 68 61 28  '|') && isalpha(
13920 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  cp[1]) ){.      
13930 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77  cp += 2;.      w
13940 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29 21  hile( (c = *cp)!
13950 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63  =0 && (isalnum(c
13960 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63  ) || c=='_') ) c
13970 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
13980 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
13990 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e{              
139a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
139b0 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63 68  ll other (one ch
139c0 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74 6f  aracter) operato
139d0 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b  rs */.      cp++
139e0 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
139f0 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   cp;.    }.    c
13a00 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20   = *cp;.    *cp 
13a10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13a30 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ull terminate th
13a40 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70  e token */.    p
13a50 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73  arseonetoken(&ps
13a60 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
13a70 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b 65  * Parse the toke
13a80 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20 63  n */.    *cp = c
13a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
13ab0 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 2a  ore the buffer *
13ac0 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74 63  /.    cp = nextc
13ad0 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66 69  p;.  }.  free(fi
13ae0 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20 20  lebuf);         
13af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13b00 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65 72  lease the buffer
13b10 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20 2a   after parsing *
13b20 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70  /.  gp->rule = p
13b30 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20 67  s.firstrule;.  g
13b40 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70 73  p->errorcnt = ps
13b50 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a  .errorcnt;.}./**
13b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
13b80 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63  he file "plink.c
13b90 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
13ba0 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52  *******/./*.** R
13bb0 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69  outines processi
13bc0 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ng configuration
13bd0 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70   follow-set prop
13be0 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a  agation links.**
13bf0 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
13c00 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
13c10 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
13c20 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72   plink *plink_fr
13c30 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20  eelist = 0;../* 
13c40 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
13c50 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70  link */.struct p
13c60 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28  link *Plink_new(
13c70 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  ){.  struct plin
13c80 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28 20 70  k *new;..  if( p
13c90 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30  link_freelist==0
13ca0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
13cb0 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30     int amt = 100
13cc0 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65  ;.    plink_free
13cd0 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 70  list = (struct p
13ce0 6c 69 6e 6b 20 2a 29 6d 61 6c 6c 6f 63 28 20 73  link *)malloc( s
13cf0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70 6c 69  izeof(struct pli
13d00 6e 6b 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69  nk)*amt );.    i
13d10 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  f( plink_freelis
13d20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
13d30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
13d40 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 61      "Unable to a
13d50 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
13d60 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d  or a new follow-
13d70 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  set propagation 
13d80 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  link.\n");.     
13d90 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
13da0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
13db0 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b  mt-1; i++) plink
13dc0 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78  _freelist[i].nex
13dd0 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65 65 6c  t = &plink_freel
13de0 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 70 6c  ist[i+1];.    pl
13df0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61 6d 74  ink_freelist[amt
13e00 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  -1].next = 0;.  
13e10 7d 0a 20 20 6e 65 77 20 3d 20 70 6c 69 6e 6b 5f  }.  new = plink_
13e20 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e  freelist;.  plin
13e30 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 69  k_freelist = pli
13e40 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78  nk_freelist->nex
13e50 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b  t;.  return new;
13e60 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69  .}../* Add a pli
13e70 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69  nk to a plink li
13e80 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b  st */.void Plink
13e90 5f 61 64 64 28 70 6c 70 70 2c 63 66 70 29 0a 73  _add(plpp,cfp).s
13ea0 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c  truct plink **pl
13eb0 70 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  pp;.struct confi
13ec0 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75  g *cfp;.{.  stru
13ed0 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 20  ct plink *new;. 
13ee0 20 6e 65 77 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77   new = Plink_new
13ef0 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78 74 20  ();.  new->next 
13f00 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70  = *plpp;.  *plpp
13f10 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e 63   = new;.  new->c
13f20 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20  fp = cfp;.}../* 
13f30 54 72 61 6e 73 66 65 72 20 65 76 65 72 79 20 70  Transfer every p
13f40 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74  link on the list
13f50 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65 20 6c   "from" to the l
13f60 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f 69 64  ist "to" */.void
13f70 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 74 6f 2c 66   Plink_copy(to,f
13f80 72 6f 6d 29 0a 73 74 72 75 63 74 20 70 6c 69 6e  rom).struct plin
13f90 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75 63 74 20 70  k **to;.struct p
13fa0 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a 20 20  link *from;.{.  
13fb0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
13fc0 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66  xtpl;.  while( f
13fd0 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  rom ){.    nextp
13fe0 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a  l = from->next;.
13ff0 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d      from->next =
14000 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20   *to;.    *to = 
14010 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d  from;.    from =
14020 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a   nextpl;.  }.}..
14030 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20  /* Delete every 
14040 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73  plink on the lis
14050 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  t */.void Plink_
14060 64 65 6c 65 74 65 28 70 6c 70 29 0a 73 74 72 75  delete(plp).stru
14070 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 7b  ct plink *plp;.{
14080 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
14090 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c  *nextpl;..  whil
140a0 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65  e( plp ){.    ne
140b0 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74  xtpl = plp->next
140c0 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20  ;.    plp->next 
140d0 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  = plink_freelist
140e0 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65  ;.    plink_free
140f0 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20  list = plp;.    
14100 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20  plp = nextpl;.  
14110 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
14120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
14130 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70 6f  m the file "repo
14140 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rt.c" **********
14150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14160 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72  /./*.** Procedur
14170 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e  es for generatin
14180 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20 74 61  g reports and ta
14190 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
141a0 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
141b0 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72  or..*/../* Gener
141c0 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65 20 77  ate a filename w
141d0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73 75  ith the given su
141e0 66 66 69 78 2e 20 20 53 70 61 63 65 20 74 6f 20  ffix.  Space to 
141f0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  hold the.** name
14200 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c   comes from mall
14210 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
14220 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
14230 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
14240 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  n..*/.PRIVATE ch
14250 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d  ar *file_makenam
14260 65 28 6c 65 6d 70 2c 73 75 66 66 69 78 29 0a 73  e(lemp,suffix).s
14270 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
14280 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69 78 3b  p;.char *suffix;
14290 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b  .{.  char *name;
142a0 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20  .  char *cp;..  
142b0 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 73  name = malloc( s
142c0 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65  trlen(lemp->file
142d0 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65 6e 28 73  name) + strlen(s
142e0 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20  uffix) + 5 );.  
142f0 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  if( name==0 ){. 
14300 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
14310 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74  r,"Can't allocat
14320 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66 69  e space for a fi
14330 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20  lename.\n");.   
14340 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
14350 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70  strcpy(name,lemp
14360 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63  ->filename);.  c
14370 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61 6d 65  p = strrchr(name
14380 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20  ,'.');.  if( cp 
14390 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74 72  ) *cp = 0;.  str
143a0 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29  cat(name,suffix)
143b0 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b  ;.  return name;
143c0 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69  .}../* Open a fi
143d0 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62  le with a name b
143e0 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65  ased on the name
143f0 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
14400 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20  le,.** but with 
14410 61 20 64 69 66 66 65 72 65 6e 74 20 28 73 70 65  a different (spe
14420 63 69 66 69 65 64 29 20 73 75 66 66 69 78 2c 20  cified) suffix, 
14430 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
14440 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73  nter.** to the s
14450 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45  tream */.PRIVATE
14460 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e   FILE *file_open
14470 28 6c 65 6d 70 2c 73 75 66 66 69 78 2c 6d 6f 64  (lemp,suffix,mod
14480 65 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  e).struct lemon 
14490 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66  *lemp;.char *suf
144a0 66 69 78 3b 0a 63 68 61 72 20 2a 6d 6f 64 65 3b  fix;.char *mode;
144b0 0a 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a  .{.  FILE *fp;..
144c0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e    if( lemp->outn
144d0 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d  ame ) free(lemp-
144e0 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d  >outname);.  lem
144f0 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c  p->outname = fil
14500 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
14510 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d   suffix);.  fp =
14520 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74   fopen(lemp->out
14530 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66  name,mode);.  if
14540 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65  ( fp==0 && *mode
14550 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72  =='w' ){.    fpr
14560 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
14570 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25  't open file \"%
14580 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75  s\".\n",lemp->ou
14590 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70  tname);.    lemp
145a0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
145b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
145c0 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a    return fp;.}..
145d0 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65  /* Duplicate the
145e0 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68   input file with
145f0 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64  out comments and
14600 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73   without actions
14610 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f   .** on rules */
14620 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 6c 65  .void Reprint(le
14630 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
14640 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
14650 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73  ct rule *rp;.  s
14660 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
14670 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61  ;.  int i, j, ma
14680 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75  xlen, len, ncolu
14690 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69  mns, skip;.  pri
146a0 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e 74 20  ntf("// Reprint 
146b0 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 5c 22  of input file \"
146c0 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c  %s\".\n// Symbol
146d0 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65  s:\n",lemp->file
146e0 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20  name);.  maxlen 
146f0 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = 10;.  for(i=0;
14700 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
14710 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d  ; i++){.    sp =
14720 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
14730 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  ];.    len = str
14740 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  len(sp->name);. 
14750 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65     if( len>maxle
14760 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e  n ) maxlen = len
14770 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73  ;.  }.  ncolumns
14780 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29   = 76/(maxlen+5)
14790 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73  ;.  if( ncolumns
147a0 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20  <1 ) ncolumns = 
147b0 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d  1;.  skip = (lem
147c0 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f  p->nsymbol + nco
147d0 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75  lumns - 1)/ncolu
147e0 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  mns;.  for(i=0; 
147f0 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<skip; i++){.  
14800 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a    printf("//");.
14810 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c      for(j=i; j<l
14820 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b  emp->nsymbol; j+
14830 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70  =skip){.      sp
14840 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
14850 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [j];.      asser
14860 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20  t( sp->index==j 
14870 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  );.      printf(
14880 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c  " %3d %-*.*s",j,
14890 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70  maxlen,maxlen,sp
148a0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  ->name);.    }. 
148b0 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
148c0 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
148d0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
148e0 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
148f0 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e  printf("%s",rp->
14900 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  lhs->name);.    
14910 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68  /*    if( rp->lh
14920 73 61 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28  salias ) printf(
14930 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c  "(%s)",rp->lhsal
14940 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69  ias); */.    pri
14950 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20  ntf(" ::=");.   
14960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
14970 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
14980 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69    sp = rp->rhs[i
14990 5d 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28  ];.      printf(
149a0 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29  " %s", sp->name)
149b0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e  ;.      if( sp->
149c0 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
149d0 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 66  NAL ){.        f
149e0 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73  or(j=1; j<sp->ns
149f0 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ubsym; j++){.   
14a00 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 7c         printf("|
14a10 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b  %s", sp->subsym[
14a20 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  j]->name);.     
14a30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14a40 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e 72 68     /* if( rp->rh
14a50 73 61 6c 69 61 73 5b 69 5d 20 29 20 70 72 69 6e  salias[i] ) prin
14a60 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 72 68  tf("(%s)",rp->rh
14a70 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20  salias[i]); */. 
14a80 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28     }.    printf(
14a90 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20 72 70  ".");.    if( rp
14aa0 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72 69 6e  ->precsym ) prin
14ab0 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e 70  tf(" [%s]",rp->p
14ac0 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20  recsym->name);. 
14ad0 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e 63 6f     /* if( rp->co
14ae0 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 20  de ) printf("\n 
14af0 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29     %s",rp->code)
14b00 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28  ; */.    printf(
14b10 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f  "\n");.  }.}..vo
14b20 69 64 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66  id ConfigPrint(f
14b30 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a 66 70 3b  p,cfp).FILE *fp;
14b40 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
14b50 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  cfp;.{.  struct 
14b60 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75  rule *rp;.  stru
14b70 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
14b80 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 72 70 20   int i, j;.  rp 
14b90 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 66 70 72  = cfp->rp;.  fpr
14ba0 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d 22  intf(fp,"%s ::="
14bb0 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  ,rp->lhs->name);
14bc0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 72  .  for(i=0; i<=r
14bd0 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
14be0 20 20 20 69 66 28 20 69 3d 3d 63 66 70 2d 3e 64     if( i==cfp->d
14bf0 6f 74 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c  ot ) fprintf(fp,
14c00 22 20 2a 22 29 3b 0a 20 20 20 20 69 66 28 20 69  " *");.    if( i
14c10 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62 72 65  ==rp->nrhs ) bre
14c20 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d  ak;.    sp = rp-
14c30 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72  >rhs[i];.    fpr
14c40 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20 73  intf(fp," %s", s
14c50 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  p->name);.    if
14c60 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( sp->type==MULT
14c70 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
14c80 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70     for(j=1; j<sp
14c90 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b  ->nsubsym; j++){
14ca0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
14cb0 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75  (fp,"|%s",sp->su
14cc0 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a  bsym[j]->name);.
14cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14ce0 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20  }.}../* #define 
14cf0 54 45 53 54 20 2a 2f 0a 23 69 66 20 30 0a 2f 2a  TEST */.#if 0./*
14d00 20 50 72 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a   Print a set */.
14d10 50 52 49 56 41 54 45 20 76 6f 69 64 20 53 65 74  PRIVATE void Set
14d20 50 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65  Print(out,set,le
14d30 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63  mp).FILE *out;.c
14d40 68 61 72 20 2a 73 65 74 3b 0a 73 74 72 75 63 74  har *set;.struct
14d50 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
14d60 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
14d70 2a 73 70 61 63 65 72 3b 0a 20 20 73 70 61 63 65  *spacer;.  space
14d80 72 20 3d 20 22 22 3b 0a 20 20 66 70 72 69 6e 74  r = "";.  fprint
14d90 66 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c 22 22  f(out,"%12s[",""
14da0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
14db0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
14dc0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
14dd0 65 74 46 69 6e 64 28 73 65 74 2c 69 29 20 29 7b  etFind(set,i) ){
14de0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
14df0 75 74 2c 22 25 73 25 73 22 2c 73 70 61 63 65 72  ut,"%s%s",spacer
14e00 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
14e10 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
14e20 73 70 61 63 65 72 20 3d 20 22 20 22 3b 0a 20 20  spacer = " ";.  
14e30 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
14e40 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a  f(out,"]\n");.}.
14e50 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c 69 6e  ./* Print a plin
14e60 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41  k chain */.PRIVA
14e70 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69  TE void PlinkPri
14e80 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a  nt(out,plp,tag).
14e90 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63  FILE *out;.struc
14ea0 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68  t plink *plp;.ch
14eb0 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69  ar *tag;.{.  whi
14ec0 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 66  le( plp ){.    f
14ed0 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73  printf(out,"%12s
14ee0 25 73 20 28 73 74 61 74 65 20 25 32 64 29 20 22  %s (state %2d) "
14ef0 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70  ,"",tag,plp->cfp
14f00 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29  ->stp->statenum)
14f10 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e  ;.    ConfigPrin
14f20 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70 29 3b  t(out,plp->cfp);
14f30 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
14f40 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c 70 20  ,"\n");.    plp 
14f50 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d  = plp->next;.  }
14f60 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 50 72  .}.#endif../* Pr
14f70 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f  int an action to
14f80 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
14f90 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74  descriptor.  Ret
14fa0 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a 2a 20  urn FALSE if.** 
14fb0 6e 6f 74 68 69 6e 67 20 77 61 73 20 61 63 74 75  nothing was actu
14fc0 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a 2a 2f  ally printed..*/
14fd0 0a 69 6e 74 20 50 72 69 6e 74 41 63 74 69 6f 6e  .int PrintAction
14fe0 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
14ff0 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20 69 6e  ap, FILE *fp, in
15000 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69 6e 74  t indent){.  int
15010 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20 73   result = 1;.  s
15020 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20  witch( ap->type 
15030 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46  ){.    case SHIF
15040 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
15050 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20  (fp,"%*s shift  
15060 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  %d",indent,ap->s
15070 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74  p->name,ap->x.st
15080 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20  p->statenum);.  
15090 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
150a0 61 73 65 20 52 45 44 55 43 45 3a 0a 20 20 20 20  ase REDUCE:.    
150b0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
150c0 73 20 72 65 64 75 63 65 20 25 64 22 2c 69 6e 64  s reduce %d",ind
150d0 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
150e0 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78  ,ap->x.rp->index
150f0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15100 20 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a      case ACCEPT:
15110 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
15120 70 2c 22 25 2a 73 20 61 63 63 65 70 74 22 2c 69  p,"%*s accept",i
15130 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
15140 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
15150 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52  ;.    case ERROR
15160 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
15170 66 70 2c 22 25 2a 73 20 65 72 72 6f 72 22 2c 69  fp,"%*s error",i
15180 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
15190 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
151a0 3b 0a 20 20 20 20 63 61 73 65 20 43 4f 4e 46 4c  ;.    case CONFL
151b0 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  ICT:.      fprin
151c0 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63  tf(fp,"%*s reduc
151d0 65 20 25 2d 33 64 20 2a 2a 20 50 61 72 73 69 6e  e %-3d ** Parsin
151e0 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c 0a  g conflict **",.
151f0 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c 61          indent,a
15200 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e  p->sp->name,ap->
15210 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  x.rp->index);.  
15220 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
15230 61 73 65 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a  ase SH_RESOLVED:
15240 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52 45 53  .    case RD_RES
15250 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20  OLVED:.    case 
15260 4e 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20 20  NOT_USED:.      
15270 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  result = 0;.    
15280 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
15290 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a  eturn result;.}.
152a0 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  ./* Generate the
152b0 20 22 79 2e 6f 75 74 70 75 74 22 20 6c 6f 67 20   "y.output" log 
152c0 66 69 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65 70  file */.void Rep
152d0 6f 72 74 4f 75 74 70 75 74 28 6c 65 6d 70 29 0a  ortOutput(lemp).
152e0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
152f0 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
15300 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
15310 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  tp;.  struct con
15320 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75  fig *cfp;.  stru
15330 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20  ct action *ap;. 
15340 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66 70   FILE *fp;..  fp
15350 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d   = file_open(lem
15360 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b 0a  p,".out","wb");.
15370 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72 65    if( fp==0 ) re
15380 74 75 72 6e 3b 0a 20 20 66 70 72 69 6e 74 66 28  turn;.  fprintf(
15390 66 70 2c 22 20 5c 62 22 29 3b 0a 20 20 66 6f 72  fp," \b");.  for
153a0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
153b0 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
153c0 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
153d0 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e  ed[i];.    fprin
153e0 74 66 28 66 70 2c 22 53 74 61 74 65 20 25 64 3a  tf(fp,"State %d:
153f0 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75  \n",stp->statenu
15400 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70  m);.    if( lemp
15410 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66  ->basisflag ) cf
15420 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65  p=stp->bp;.    e
15430 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
15440 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e 63 66       cfp=stp->cf
15450 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 66  p;.    while( cf
15460 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  p ){.      char 
15470 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69  buf[20];.      i
15480 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70  f( cfp->dot==cfp
15490 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20  ->rp->nrhs ){.  
154a0 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 62 75        sprintf(bu
154b0 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e 72 70  f,"(%d)",cfp->rp
154c0 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
154d0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20    fprintf(fp,"  
154e0 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a 20 20    %5s ",buf);.  
154f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15500 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
15510 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20 20 20           ");.   
15520 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66 69     }.      Confi
15530 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29 3b 0a  gPrint(fp,cfp);.
15540 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
15550 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a 20 20  ,"\n");.#if 0.  
15560 20 20 20 20 53 65 74 50 72 69 6e 74 28 66 70 2c      SetPrint(fp,
15570 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a  cfp->fws,lemp);.
15580 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74        PlinkPrint
15590 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22 54  (fp,cfp->fplp,"T
155a0 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50 6c 69  o  ");.      Pli
155b0 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e  nkPrint(fp,cfp->
155c0 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23 65  bplp,"From");.#e
155d0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6c  ndif.      if( l
155e0 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
155f0 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20 20   cfp=cfp->bp;.  
15600 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
15610 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 63 66            cfp=cf
15620 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  p->next;.    }. 
15630 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c     fprintf(fp,"\
15640 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  n");.    for(ap=
15650 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
15660 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
15670 20 69 66 28 20 50 72 69 6e 74 41 63 74 69 6f 6e   if( PrintAction
15680 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66 70 72  (ap,fp,30) ) fpr
15690 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
156a0 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
156b0 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  (fp,"\n");.  }. 
156c0 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 72   fclose(fp);.  r
156d0 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61  eturn;.}../* Sea
156e0 72 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65  rch for the file
156f0 20 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69 73   "name" which is
15700 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
15710 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65  ectory as.** the
15720 20 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a 50   exacutable */.P
15730 52 49 56 41 54 45 20 63 68 61 72 20 2a 70 61 74  RIVATE char *pat
15740 68 73 65 61 72 63 68 28 61 72 67 76 30 2c 6e 61  hsearch(argv0,na
15750 6d 65 2c 6d 6f 64 65 6d 61 73 6b 29 0a 63 68 61  me,modemask).cha
15760 72 20 2a 61 72 67 76 30 3b 0a 63 68 61 72 20 2a  r *argv0;.char *
15770 6e 61 6d 65 3b 0a 69 6e 74 20 6d 6f 64 65 6d 61  name;.int modema
15780 73 6b 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 70 61  sk;.{.  char *pa
15790 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a  thlist;.  char *
157a0 70 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72  path,*cp;.  char
157b0 20 63 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74   c;.  extern int
157c0 20 61 63 63 65 73 73 28 29 3b 0a 0a 23 69 66 64   access();..#ifd
157d0 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63  ef __WIN32__.  c
157e0 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76  p = strrchr(argv
157f0 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20  0,'\\');.#else. 
15800 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72   cp = strrchr(ar
15810 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66  gv0,'/');.#endif
15820 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20  .  if( cp ){.   
15830 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
15840 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20  p = 0;.    path 
15850 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
15860 28 20 73 74 72 6c 65 6e 28 61 72 67 76 30 29 20  ( strlen(argv0) 
15870 2b 20 73 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b  + strlen(name) +
15880 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61   2 );.    if( pa
15890 74 68 20 29 20 73 70 72 69 6e 74 66 28 70 61 74  th ) sprintf(pat
158a0 68 2c 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c  h,"%s/%s",argv0,
158b0 6e 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d  name);.    *cp =
158c0 20 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   c;.  }else{.   
158d0 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a 67 65   extern char *ge
158e0 74 65 6e 76 28 29 3b 0a 20 20 20 20 70 61 74 68  tenv();.    path
158f0 6c 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50  list = getenv("P
15900 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70  ATH");.    if( p
15910 61 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74  athlist==0 ) pat
15920 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a  hlist = ".:/bin:
15930 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70  /usr/bin";.    p
15940 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  ath = (char *)ma
15950 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 70 61 74  lloc( strlen(pat
15960 68 6c 69 73 74 29 2b 73 74 72 6c 65 6e 28 6e 61  hlist)+strlen(na
15970 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69 66 28  me)+2 );.    if(
15980 20 70 61 74 68 21 3d 30 20 29 7b 0a 20 20 20 20   path!=0 ){.    
15990 20 20 77 68 69 6c 65 28 20 2a 70 61 74 68 6c 69    while( *pathli
159a0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70  st ){.        cp
159b0 20 3d 20 73 74 72 63 68 72 28 70 61 74 68 6c 69   = strchr(pathli
159c0 73 74 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20 20  st,':');.       
159d0 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20   if( cp==0 ) cp 
159e0 3d 20 26 70 61 74 68 6c 69 73 74 5b 73 74 72 6c  = &pathlist[strl
159f0 65 6e 28 70 61 74 68 6c 69 73 74 29 5d 3b 0a 20  en(pathlist)];. 
15a00 20 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a         c = *cp;.
15a10 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30 3b          *cp = 0;
15a20 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
15a30 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61  (path,"%s/%s",pa
15a40 74 68 6c 69 73 74 2c 6e 61 6d 65 29 3b 0a 20 20  thlist,name);.  
15a50 20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20        *cp = c;. 
15a60 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20         if( c==0 
15a70 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22 22 3b  ) pathlist = "";
15a80 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 70 61  .        else pa
15a90 74 68 6c 69 73 74 20 3d 20 26 63 70 5b 31 5d 3b  thlist = &cp[1];
15aa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63 63  .        if( acc
15ab0 65 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73  ess(path,modemas
15ac0 6b 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  k)==0 ) break;. 
15ad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15ae0 0a 20 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a  .  return path;.
15af0 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61  }../* Given an a
15b00 63 74 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74  ction, compute t
15b10 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
15b20 20 66 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e   for that action
15b30 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20  .** which is to 
15b40 62 65 20 70 75 74 20 69 6e 20 74 68 65 20 61 63  be put in the ac
15b50 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68  tion table of th
15b60 65 20 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68  e generated mach
15b70 69 6e 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ine..** Return n
15b80 65 67 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63  egative if no ac
15b90 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67  tion should be g
15ba0 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49  enerated..*/.PRI
15bb0 56 41 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65  VATE int compute
15bc0 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29  _action(lemp,ap)
15bd0 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
15be0 65 6d 70 3b 0a 73 74 72 75 63 74 20 61 63 74 69  emp;.struct acti
15bf0 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20 69 6e 74 20  on *ap;.{.  int 
15c00 61 63 74 3b 0a 20 20 73 77 69 74 63 68 28 20 61  act;.  switch( a
15c10 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63  p->type ){.    c
15c20 61 73 65 20 53 48 49 46 54 3a 20 20 61 63 74 20  ase SHIFT:  act 
15c30 3d 20 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61  = ap->x.stp->sta
15c40 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  tenum;          
15c50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
15c60 65 20 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20  e REDUCE: act = 
15c70 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  ap->x.rp->index 
15c80 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  + lemp->nstate; 
15c90 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
15ca0 45 52 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65  ERROR:  act = le
15cb0 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d  mp->nstate + lem
15cc0 70 2d 3e 6e 72 75 6c 65 3b 20 20 20 20 20 62 72  p->nrule;     br
15cd0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43  eak;.    case AC
15ce0 43 45 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70  CEPT: act = lemp
15cf0 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
15d00 3e 6e 72 75 6c 65 20 2b 20 31 3b 20 62 72 65 61  >nrule + 1; brea
15d10 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
15d20 20 20 20 20 61 63 74 20 3d 20 2d 31 3b 20 62 72      act = -1; br
15d30 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
15d40 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e  n act;.}..#defin
15d50 65 20 4c 49 4e 45 53 49 5a 45 20 31 30 30 30 0a  e LINESIZE 1000.
15d60 2f 2a 20 54 68 65 20 6e 65 78 74 20 63 6c 75 73  /* The next clus
15d70 74 65 72 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  ter of routines 
15d80 61 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  are for reading 
15d90 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
15da0 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e 67  e.** and writing
15db0 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
15dc0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61  the generated pa
15dd0 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66  rser */./* The f
15de0 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 72  irst function tr
15df0 61 6e 73 66 65 72 73 20 64 61 74 61 20 66 72 6f  ansfers data fro
15e00 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75 74 22 20  m "in" to "out" 
15e10 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20  until.** a line 
15e20 69 73 20 73 65 65 6e 20 77 68 69 63 68 20 62 65  is seen which be
15e30 67 69 6e 73 20 77 69 74 68 20 22 25 25 22 2e 20  gins with "%%". 
15e40 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   The line number
15e50 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a   is.** tracked..
15e60 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30  **.** if name!=0
15e70 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f 72 64 20  , then any word 
15e80 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
15e90 22 50 61 72 73 65 22 20 69 73 20 63 68 61 6e 67  "Parse" is chang
15ea0 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77  ed to.** begin w
15eb0 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61  ith *name instea
15ec0 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  d..*/.PRIVATE vo
15ed0 69 64 20 74 70 6c 74 5f 78 66 65 72 28 6e 61 6d  id tplt_xfer(nam
15ee0 65 2c 69 6e 2c 6f 75 74 2c 6c 69 6e 65 6e 6f 29  e,in,out,lineno)
15ef0 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 46 49 4c  .char *name;.FIL
15f00 45 20 2a 69 6e 3b 0a 46 49 4c 45 20 2a 6f 75 74  E *in;.FILE *out
15f10 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
15f20 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74  .  int i, iStart
15f30 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
15f40 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c 65  NESIZE];.  while
15f50 28 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e  ( fgets(line,LIN
15f60 45 53 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c 69  ESIZE,in) && (li
15f70 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c 69  ne[0]!='%' || li
15f80 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a 20  ne[1]!='%') ){. 
15f90 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a     (*lineno)++;.
15fa0 20 20 20 20 69 53 74 61 72 74 20 3d 20 30 3b 0a      iStart = 0;.
15fb0 20 20 20 20 69 66 28 20 6e 61 6d 65 20 29 7b 0a      if( name ){.
15fc0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6c        for(i=0; l
15fd0 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ine[i]; i++){.  
15fe0 20 20 20 20 20 20 69 66 28 20 6c 69 6e 65 5b 69        if( line[i
15ff0 5d 3d 3d 27 50 27 20 26 26 20 73 74 72 6e 63 6d  ]=='P' && strncm
16000 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72 73  p(&line[i],"Pars
16010 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20 20  e",5)==0.       
16020 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 21     && (i==0 || !
16030 69 73 61 6c 70 68 61 28 6c 69 6e 65 5b 69 2d 31  isalpha(line[i-1
16040 5d 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ])).        ){. 
16050 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 69           if( i>i
16060 53 74 61 72 74 20 29 20 66 70 72 69 6e 74 66 28  Start ) fprintf(
16070 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53 74  out,"%.*s",i-iSt
16080 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74  art,&line[iStart
16090 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70  ]);.          fp
160a0 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 6e  rintf(out,"%s",n
160b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
160c0 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
160d0 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a    iStart = i+1;.
160e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
160f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  }.    }.    fpri
16100 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c 69  ntf(out,"%s",&li
16110 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 7d  ne[iStart]);.  }
16120 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20  .}../* The next 
16130 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
16140 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
16150 20 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20 72   and opens it, r
16160 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f  eturning.** a po
16170 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 70 65  inter to the ope
16180 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49  ned file. */.PRI
16190 56 41 54 45 20 46 49 4c 45 20 2a 74 70 6c 74 5f  VATE FILE *tplt_
161a0 6f 70 65 6e 28 6c 65 6d 70 29 0a 73 74 72 75 63  open(lemp).struc
161b0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
161c0 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 74  .  static char t
161d0 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20  emplatename[] = 
161e0 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68  "lempar.c";.  ch
161f0 61 72 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20  ar buf[1000];.  
16200 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72  FILE *in;.  char
16210 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68   *tpltname;.  ch
16220 61 72 20 2a 63 70 3b 0a 0a 20 20 63 70 20 3d 20  ar *cp;..  cp = 
16230 73 74 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66 69  strrchr(lemp->fi
16240 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69  lename,'.');.  i
16250 66 28 20 63 70 20 29 7b 0a 20 20 20 20 73 70 72  f( cp ){.    spr
16260 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e 6c  intf(buf,"%.*s.l
16270 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d 70  t",(int)(cp-lemp
16280 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70  ->filename),lemp
16290 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  ->filename);.  }
162a0 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74  else{.    sprint
162b0 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65  f(buf,"%s.lt",le
162c0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
162d0 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28   }.  if( access(
162e0 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20  buf,004)==0 ){. 
162f0 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75     tpltname = bu
16300 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  f;.  }else if( a
16310 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61  ccess(templatena
16320 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  me,004)==0 ){.  
16330 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d    tpltname = tem
16340 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c  platename;.  }el
16350 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65  se{.    tpltname
16360 20 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65   = pathsearch(le
16370 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61  mp->argv0,templa
16380 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20  tename,0);.  }. 
16390 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30   if( tpltname==0
163a0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
163b0 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69  stderr,"Can't fi
163c0 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72  nd the parser dr
163d0 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69  iver template fi
163e0 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20  le \"%s\".\n",. 
163f0 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29     templatename)
16400 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
16410 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
16420 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  rn 0;.  }.  in =
16430 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c   fopen(tpltname,
16440 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
16450 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
16460 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
16470 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  open the templat
16480 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  e file \"%s\".\n
16490 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  ",templatename);
164a0 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
164b0 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
164c0 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
164d0 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  n in;.}../* Prin
164e0 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65 63 74  t a #line direct
164f0 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20  ive line to the 
16500 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a  output file. */.
16510 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
16520 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 6c 69  t_linedir(out,li
16530 6e 65 6e 6f 2c 66 69 6c 65 6e 61 6d 65 29 0a 46  neno,filename).F
16540 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 6c 69  ILE *out;.int li
16550 6e 65 6e 6f 3b 0a 63 68 61 72 20 2a 66 69 6c 65  neno;.char *file
16560 6e 61 6d 65 3b 0a 7b 0a 20 20 66 70 72 69 6e 74  name;.{.  fprint
16570 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20  f(out,"#line %d 
16580 5c 22 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 77  \"",lineno);.  w
16590 68 69 6c 65 28 20 2a 66 69 6c 65 6e 61 6d 65 20  hile( *filename 
165a0 29 7b 0a 20 20 20 20 69 66 28 20 2a 66 69 6c 65  ){.    if( *file
165b0 6e 61 6d 65 20 3d 3d 20 27 5c 5c 27 20 29 20 70  name == '\\' ) p
165c0 75 74 63 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a 20  utc('\\',out);. 
165d0 20 20 20 70 75 74 63 28 2a 66 69 6c 65 6e 61 6d     putc(*filenam
165e0 65 2c 6f 75 74 29 3b 0a 20 20 20 20 66 69 6c 65  e,out);.    file
165f0 6e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70  name++;.  }.  fp
16600 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22  rintf(out,"\"\n"
16610 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  );.}../* Print a
16620 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 66   string to the f
16630 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74 68 65  ile and keep the
16640 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70 20 74   linenumber up t
16650 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56 41 54  o date */.PRIVAT
16660 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e  E void tplt_prin
16670 74 28 6f 75 74 2c 6c 65 6d 70 2c 73 74 72 2c 73  t(out,lemp,str,s
16680 74 72 6c 6e 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c  trln,lineno).FIL
16690 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 6c  E *out;.struct l
166a0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72  emon *lemp;.char
166b0 20 2a 73 74 72 3b 0a 69 6e 74 20 73 74 72 6c 6e   *str;.int strln
166c0 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
166d0 0a 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29 20  .  if( str==0 ) 
166e0 72 65 74 75 72 6e 3b 0a 20 20 74 70 6c 74 5f 6c  return;.  tplt_l
166f0 69 6e 65 64 69 72 28 6f 75 74 2c 73 74 72 6c 6e  inedir(out,strln
16700 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
16710 3b 0a 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ;.  (*lineno)++;
16720 0a 20 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29  .  while( *str )
16730 7b 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d  {.    if( *str==
16740 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29  '\n' ) (*lineno)
16750 2b 2b 3b 0a 20 20 20 20 70 75 74 63 28 2a 73 74  ++;.    putc(*st
16760 72 2c 6f 75 74 29 3b 0a 20 20 20 20 73 74 72 2b  r,out);.    str+
16770 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  +;.  }.  if( str
16780 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  [-1]!='\n' ){.  
16790 20 20 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29    putc('\n',out)
167a0 3b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ;.    (*lineno)+
167b0 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 6c 69  +;.  }.  tplt_li
167c0 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e  nedir(out,*linen
167d0 6f 2b 32 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  o+2,lemp->outnam
167e0 65 29 3b 20 0a 20 20 28 2a 6c 69 6e 65 6e 6f 29  e); .  (*lineno)
167f0 2b 3d 32 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  +=2;.  return;.}
16800 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
16810 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d  owing routine em
16820 69 74 73 20 63 6f 64 65 20 66 6f 72 20 74 68 65  its code for the
16830 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
16840 74 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70  the.** symbol sp
16850 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65  .*/.void emit_de
16860 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
16870 74 2c 73 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f  t,sp,lemp,lineno
16880 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
16890 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
168a0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
168b0 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b  mp;.int *lineno;
168c0 0a 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30  .{. char *cp = 0
168d0 3b 0a 0a 20 69 6e 74 20 6c 69 6e 65 63 6e 74 20  ;.. int linecnt 
168e0 3d 20 30 3b 0a 20 69 66 28 20 73 70 2d 3e 74 79  = 0;. if( sp->ty
168f0 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
16900 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f     cp = lemp->to
16910 6b 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28 20  kendest;.   if( 
16920 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
16930 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28     tplt_linedir(
16940 6f 75 74 2c 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64  out,lemp->tokend
16950 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65  estln,lemp->file
16960 6e 61 6d 65 29 3b 0a 20 20 20 66 70 72 69 6e 74  name);.   fprint
16970 66 28 6f 75 74 2c 22 7b 22 29 3b 0a 20 7d 65 6c  f(out,"{");. }el
16980 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72  se if( sp->destr
16990 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d  uctor ){.   cp =
169a0 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b   sp->destructor;
169b0 0a 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  .   tplt_linedir
169c0 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 72 75 63  (out,sp->destruc
169d0 74 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65  torln,lemp->file
169e0 6e 61 6d 65 29 3b 0a 20 20 20 66 70 72 69 6e 74  name);.   fprint
169f0 66 28 6f 75 74 2c 22 7b 22 29 3b 0a 20 7d 65 6c  f(out,"{");. }el
16a00 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  se if( lemp->var
16a10 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20  dest ){.   cp = 
16a20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20  lemp->vardest;. 
16a30 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65    if( cp==0 ) re
16a40 74 75 72 6e 3b 0a 20 20 20 74 70 6c 74 5f 6c 69  turn;.   tplt_li
16a50 6e 65 64 69 72 28 6f 75 74 2c 6c 65 6d 70 2d 3e  nedir(out,lemp->
16a60 76 61 72 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e  vardestln,lemp->
16a70 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 66 70  filename);.   fp
16a80 72 69 6e 74 66 28 6f 75 74 2c 22 7b 22 29 3b 0a  rintf(out,"{");.
16a90 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73 73 65 72   }else{.   asser
16aa0 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  t( 0 );  /* Cann
16ab0 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 7d 0a  ot happen */. }.
16ac0 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70 2b 2b   for(; *cp; cp++
16ad0 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27  ){.   if( *cp=='
16ae0 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 24 27  $' && cp[1]=='$'
16af0 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e 74 66   ){.     fprintf
16b00 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f 72 2d  (out,"(yypminor-
16b10 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74 6e 75  >yy%d)",sp->dtnu
16b20 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b 0a 20  m);.     cp++;. 
16b30 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
16b40 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27   }.   if( *cp=='
16b50 5c 6e 27 20 29 20 6c 69 6e 65 63 6e 74 2b 2b 3b  \n' ) linecnt++;
16b60 0a 20 20 20 66 70 75 74 63 28 2a 63 70 2c 6f 75  .   fputc(*cp,ou
16b70 74 29 3b 0a 20 7d 0a 20 28 2a 6c 69 6e 65 6e 6f  t);. }. (*lineno
16b80 29 20 2b 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74  ) += 3 + linecnt
16b90 3b 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ;. fprintf(out,"
16ba0 7d 5c 6e 22 29 3b 0a 20 74 70 6c 74 5f 6c 69 6e  }\n");. tplt_lin
16bb0 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f  edir(out,*lineno
16bc0 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  ,lemp->outname);
16bd0 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  . return;.}../*.
16be0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  ** Return TRUE (
16bf0 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65  non-zero) if the
16c00 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61   given symbol ha
16c10 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e 0a  s a destructor..
16c20 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73 74 72  */.int has_destr
16c30 75 63 74 6f 72 28 73 70 2c 20 6c 65 6d 70 29 0a  uctor(sp, lemp).
16c40 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
16c50 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p;.struct lemon 
16c60 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 72  *lemp;.{.  int r
16c70 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79  et;.  if( sp->ty
16c80 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
16c90 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e      ret = lemp->
16ca0 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20  tokendest!=0;.  
16cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d  }else{.    ret =
16cc0 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d   lemp->vardest!=
16cd0 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  0 || sp->destruc
16ce0 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65  tor!=0;.  }.  re
16cf0 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
16d00 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20 74  ** Append text t
16d10 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  o a dynamically 
16d20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67  allocated string
16d30 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73 20 30  .  If zText is 0
16d40 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74   then.** reset t
16d50 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20  he string to be 
16d60 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c  empty again.  Al
16d70 77 61 79 73 20 72 65 74 75 72 6e 20 74 68 65 20  ways return the 
16d80 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a  complete text.**
16d90 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 28   of the string (
16da0 77 68 69 63 68 20 69 73 20 6f 76 65 72 77 72 69  which is overwri
16db0 74 74 65 6e 20 77 69 74 68 20 65 61 63 68 20 63  tten with each c
16dc0 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79  all)..**.** n by
16dd0 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65  tes of zText are
16de0 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d   stored.  If n==
16df0 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54  0 then all of zT
16e00 65 78 74 20 75 70 20 74 6f 20 74 68 65 20 66 69  ext up to the fi
16e10 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d  rst.** \000 term
16e20 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64  inator is stored
16e30 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e  .  zText can con
16e40 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69  tain up to two i
16e50 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25  nstances of.** %
16e60 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f  d.  The values o
16e70 66 20 70 31 20 61 6e 64 20 70 32 20 61 72 65 20  f p1 and p2 are 
16e80 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16e90 20 66 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e   first and secon
16ea0 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49  d.** %d..**.** I
16eb0 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68  f n==-1, then th
16ec0 65 20 70 72 65 76 69 6f 75 73 20 63 68 61 72 61  e previous chara
16ed0 63 74 65 72 20 69 73 20 6f 76 65 72 77 72 69 74  cter is overwrit
16ee0 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ten..*/.PRIVATE 
16ef0 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72  char *append_str
16f00 28 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e  (char *zText, in
16f10 74 20 6e 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74  t n, int p1, int
16f20 20 70 32 29 7b 0a 20 20 73 74 61 74 69 63 20 63   p2){.  static c
16f30 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 74  har *z = 0;.  st
16f40 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 65 64  atic int alloced
16f50 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
16f60 6e 74 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 69  nt used = 0;.  i
16f70 6e 74 20 63 3b 0a 20 20 63 68 61 72 20 7a 49 6e  nt c;.  char zIn
16f80 74 5b 34 30 5d 3b 0a 0a 20 20 69 66 28 20 7a 54  t[40];..  if( zT
16f90 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 75 73  ext==0 ){.    us
16fa0 65 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ed = 0;.    retu
16fb0 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn z;.  }.  if( 
16fc0 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  n<=0 ){.    if( 
16fd0 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 73 65  n<0 ){.      use
16fe0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 61 73  d += n;.      as
16ff0 73 65 72 74 28 20 75 73 65 64 3e 3d 30 20 29 3b  sert( used>=0 );
17000 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 73  .    }.    n = s
17010 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20  trlen(zText);.  
17020 7d 0a 20 20 69 66 28 20 6e 2b 73 69 7a 65 6f 66  }.  if( n+sizeof
17030 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64 20 3e 3d  (zInt)*2+used >=
17040 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20   alloced ){.    
17050 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b 20 73 69  alloced = n + si
17060 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20 2b 20 75  zeof(zInt)*2 + u
17070 73 65 64 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a  sed + 200;.    z
17080 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20 61   = realloc(z,  a
17090 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20 69  lloced);.  }.  i
170a0 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
170b0 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d   "";.  while( n-
170c0 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63 20 3d  - > 0 ){.    c =
170d0 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20 20 20   *(zText++);.   
170e0 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26 20 6e   if( c=='%' && n
170f0 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d 3d 3d  >0 && zText[0]==
17100 27 64 27 20 29 7b 0a 20 20 20 20 20 20 73 70 72  'd' ){.      spr
17110 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64 22 2c  intf(zInt, "%d",
17120 20 70 31 29 3b 0a 20 20 20 20 20 20 70 31 20 3d   p1);.      p1 =
17130 20 70 32 3b 0a 20 20 20 20 20 20 73 74 72 63 70   p2;.      strcp
17140 79 28 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74  y(&z[used], zInt
17150 29 3b 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d  );.      used +=
17160 20 73 74 72 6c 65 6e 28 26 7a 5b 75 73 65 64 5d   strlen(&z[used]
17170 29 3b 0a 20 20 20 20 20 20 7a 54 65 78 74 2b 2b  );.      zText++
17180 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  ;.      n--;.   
17190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b   }else{.      z[
171a0 75 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  used++] = c;.   
171b0 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64 5d   }.  }.  z[used]
171c0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
171d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 43 6f 64 65  ;.}../*.** zCode
171e0 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61   is a string tha
171f0 74 20 69 73 20 74 68 65 20 61 63 74 69 6f 6e 20  t is the action 
17200 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
17210 61 20 72 75 6c 65 2e 20 20 45 78 70 61 6e 64 0a  a rule.  Expand.
17220 2a 2a 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69  ** the symbols i
17230 6e 20 74 68 69 73 20 73 74 72 69 6e 67 20 73 6f  n this string so
17240 20 74 68 61 74 20 74 68 65 20 72 65 66 65 72 20   that the refer 
17250 74 6f 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  to elements of t
17260 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 73 74 61  he parser.** sta
17270 63 6b 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  ck..*/.PRIVATE v
17280 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f  oid translate_co
17290 64 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  de(struct lemon 
172a0 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 72 75  *lemp, struct ru
172b0 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68 61 72 20  le *rp){.  char 
172c0 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20  *cp, *xp;.  int 
172d0 69 3b 0a 20 20 63 68 61 72 20 6c 68 73 75 73 65  i;.  char lhsuse
172e0 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72 75  d = 0;    /* Tru
172f0 65 20 69 66 20 74 68 65 20 4c 48 53 20 65 6c 65  e if the LHS ele
17300 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 20 75 73  ment has been us
17310 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 75 73 65  ed */.  char use
17320 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20 2f 2a 20  d[MAXRHS];   /* 
17330 54 72 75 65 20 66 6f 72 20 65 61 63 68 20 52 48  True for each RH
17340 53 20 65 6c 65 6d 65 6e 74 20 77 68 69 63 68 20  S element which 
17350 69 73 20 75 73 65 64 20 2a 2f 0a 0a 20 20 66 6f  is used */..  fo
17360 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
17370 73 3b 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20  s; i++) used[i] 
17380 3d 20 30 3b 0a 20 20 6c 68 73 75 73 65 64 20 3d  = 0;.  lhsused =
17390 20 30 3b 0a 0a 20 20 61 70 70 65 6e 64 5f 73 74   0;..  append_st
173a0 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 66 6f  r(0,0,0,0);.  fo
173b0 72 28 63 70 3d 28 72 70 2d 3e 63 6f 64 65 3f 72  r(cp=(rp->code?r
173c0 70 2d 3e 63 6f 64 65 3a 22 22 29 3b 20 2a 63 70  p->code:""); *cp
173d0 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; cp++){.    if(
173e0 20 69 73 61 6c 70 68 61 28 2a 63 70 29 20 26 26   isalpha(*cp) &&
173f0 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c   (cp==rp->code |
17400 7c 20 28 21 69 73 61 6c 6e 75 6d 28 63 70 5b 2d  | (!isalnum(cp[-
17410 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27  1]) && cp[-1]!='
17420 5f 27 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68  _')) ){.      ch
17430 61 72 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  ar saved;.      
17440 66 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20  for(xp= &cp[1]; 
17450 69 73 61 6c 6e 75 6d 28 2a 78 70 29 20 7c 7c 20  isalnum(*xp) || 
17460 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b  *xp=='_'; xp++);
17470 0a 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a  .      saved = *
17480 78 70 3b 0a 20 20 20 20 20 20 2a 78 70 20 3d 20  xp;.      *xp = 
17490 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  0;.      if( rp-
174a0 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74 72  >lhsalias && str
174b0 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68 73 61 6c  cmp(cp,rp->lhsal
174c0 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ias)==0 ){.     
174d0 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79     append_str("y
174e0 79 67 6f 74 6f 6d 69 6e 6f 72 2e 79 79 25 64 22  ygotominor.yy%d"
174f0 2c 30 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75  ,0,rp->lhs->dtnu
17500 6d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 63 70  m,0);.        cp
17510 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20 6c   = xp;.        l
17520 68 73 75 73 65 64 20 3d 20 31 3b 0a 20 20 20 20  hsused = 1;.    
17530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17540 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
17550 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
17560 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68        if( rp->rh
17570 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 73 74 72  salias[i] && str
17580 63 6d 70 28 63 70 2c 72 70 2d 3e 72 68 73 61 6c  cmp(cp,rp->rhsal
17590 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20  ias[i])==0 ){.  
175a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 70            if( cp
175b0 21 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20 63 70  !=rp->code && cp
175c0 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b 0a 20 20 20  [-1]=='@' ){.   
175d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
175e0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   the argument is
175f0 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 40 58 20   of the form @X 
17600 74 68 65 6e 20 73 75 62 73 74 69 74 75 74 65 64  then substituted
17610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
17620 2a 20 74 68 65 20 74 6f 6b 65 6e 20 6e 75 6d 62  * the token numb
17630 65 72 20 6f 66 20 58 2c 20 6e 6f 74 20 74 68 65  er of X, not the
17640 20 76 61 6c 75 65 20 6f 66 20 58 20 2a 2f 0a 20   value of X */. 
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
17660 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25  end_str("yymsp[%
17670 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72  d].major",-1,i-r
17680 70 2d 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a 20 20  p->nrhs+1,0);.  
17690 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
176a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
176b0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
176c0 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
176e0 20 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20   dtnum;.        
176f0 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79        if( sp->ty
17700 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
17710 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
17720 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d       dtnum = sp-
17730 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 64 74 6e 75  >subsym[0]->dtnu
17740 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
17750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17760 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20          dtnum = 
17770 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20  sp->dtnum;.     
17780 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17790 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f           append_
177a0 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d  str("yymsp[%d].m
177b0 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 69 2d 72  inor.yy%d",0,i-r
177c0 70 2d 3e 6e 72 68 73 2b 31 2c 20 64 74 6e 75 6d  p->nrhs+1, dtnum
177d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
177e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70 20  .            cp 
177f0 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = xp;.          
17800 20 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20    used[i] = 1;. 
17810 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
17820 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17840 20 20 20 20 20 20 2a 78 70 20 3d 20 73 61 76 65        *xp = save
17850 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 70 70  d;.    }.    app
17860 65 6e 64 5f 73 74 72 28 63 70 2c 20 31 2c 20 30  end_str(cp, 1, 0
17870 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a 20 45 6e 64  , 0);.  } /* End
17880 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a 20 43   loop */..  /* C
17890 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
178a0 65 20 74 68 65 20 4c 48 53 20 68 61 73 20 62 65  e the LHS has be
178b0 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 69 66 28  en used */.  if(
178c0 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26   rp->lhsalias &&
178d0 20 21 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20   !lhsused ){.   
178e0 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
178f0 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
17900 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 22 4c 61  eline,.      "La
17910 62 65 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c  bel \"%s\" for \
17920 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76  "%s(%s)\" is nev
17930 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20  er used.",.     
17940 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c     rp->lhsalias,
17950 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70  rp->lhs->name,rp
17960 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
17970 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
17980 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  +;.  }..  /* Gen
17990 65 72 61 74 65 20 64 65 73 74 72 75 63 74 6f 72  erate destructor
179a0 20 63 6f 64 65 20 66 6f 72 20 52 48 53 20 73 79   code for RHS sy
179b0 6d 62 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20  mbols which are 
179c0 6e 6f 74 20 75 73 65 64 20 69 6e 20 74 68 65 0a  not used in the.
179d0 20 20 2a 2a 20 72 65 64 75 63 65 20 63 6f 64 65    ** reduce code
179e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
179f0 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
17a00 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73  .    if( rp->rhs
17a10 61 6c 69 61 73 5b 69 5d 20 26 26 20 21 75 73 65  alias[i] && !use
17a20 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 45 72  d[i] ){.      Er
17a30 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
17a40 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
17a50 6e 65 2c 0a 20 20 20 20 20 20 20 20 22 4c 61 62  ne,.        "Lab
17a60 65 6c 20 25 73 20 66 6f 72 20 5c 22 25 73 28 25  el %s for \"%s(%
17a70 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73  s)\" is never us
17a80 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70  ed.",.        rp
17a90 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70  ->rhsalias[i],rp
17aa0 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72  ->rhs[i]->name,r
17ab0 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b  p->rhsalias[i]);
17ac0 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  .      lemp->err
17ad0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c  orcnt++;.    }el
17ae0 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c  se if( rp->rhsal
17af0 69 61 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  ias[i]==0 ){.   
17b00 20 20 20 69 66 28 20 68 61 73 5f 64 65 73 74 72     if( has_destr
17b10 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d  uctor(rp->rhs[i]
17b20 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20  ,lemp) ){.      
17b30 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20    append_str("  
17b40 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28 25 64  yy_destructor(%d
17b50 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f  ,&yymsp[%d].mino
17b60 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20  r);\n", 0,.     
17b70 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
17b80 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72  ->index,i-rp->nr
17b90 68 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c  hs+1);.      }el
17ba0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  se{.        /* N
17bb0 6f 20 64 65 73 74 72 75 63 74 6f 72 20 64 65 66  o destructor def
17bc0 69 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74 65  ined for this te
17bd0 72 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  rm */.      }.  
17be0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 70    }.  }.  if( rp
17bf0 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 70  ->code ){.    cp
17c00 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c   = append_str(0,
17c10 30 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d 3e  0,0,0);.    rp->
17c20 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28 63  code = Strsafe(c
17c30 70 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d 0a  p?cp:"");.  }.}.
17c40 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ./* .** Generate
17c50 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
17c60 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72 75  utes when the ru
17c70 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75 63  le "rp" is reduc
17c80 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68  ed.  Write.** th
17c90 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e  e code to "out".
17ca0 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65    Make sure line
17cb0 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64  no stays up-to-d
17cc0 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ate..*/.PRIVATE 
17cd0 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 6f  void emit_code(o
17ce0 75 74 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e  ut,rp,lemp,linen
17cf0 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74  o).FILE *out;.st
17d00 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 73  ruct rule *rp;.s
17d10 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
17d20 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a  p;.int *lineno;.
17d30 7b 0a 20 63 68 61 72 20 2a 63 70 3b 0a 20 69 6e  {. char *cp;. in
17d40 74 20 6c 69 6e 65 63 6e 74 20 3d 20 30 3b 0a 0a  t linecnt = 0;..
17d50 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
17d60 65 20 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75  e to do the redu
17d70 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66  ce action */. if
17d80 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20  ( rp->code ){.  
17d90 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
17da0 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d  t,rp->line,lemp-
17db0 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 66  >filename);.   f
17dc0 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73 22  printf(out,"{%s"
17dd0 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20 66  ,rp->code);.   f
17de0 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20  or(cp=rp->code; 
17df0 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  *cp; cp++){.    
17e00 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29   if( *cp=='\n' )
17e10 20 6c 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 7d   linecnt++;.   }
17e20 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a   /* End loop */.
17e30 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20     (*lineno) += 
17e40 33 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20 20 20  3 + linecnt;.   
17e50 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e  fprintf(out,"}\n
17e60 22 29 3b 0a 20 20 20 74 70 6c 74 5f 6c 69 6e 65  ");.   tplt_line
17e70 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c  dir(out,*lineno,
17e80 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a  lemp->outname);.
17e90 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 72 70   } /* End if( rp
17ea0 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 72 65  ->code ) */.. re
17eb0 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  turn;.}../*.** P
17ec0 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74  rint the definit
17ed0 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e  ion of the union
17ee0 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 61   used for the pa
17ef0 72 73 65 72 27 73 20 64 61 74 61 20 73 74 61 63  rser's data stac
17f00 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e  k..** This union
17f10 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73   contains fields
17f20 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69   for every possi
17f30 62 6c 65 20 64 61 74 61 20 74 79 70 65 20 66 6f  ble data type fo
17f40 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20  r tokens.** and 
17f50 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49  nonterminals.  I
17f60 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  n the process of
17f70 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70   computing and p
17f80 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20  rinting this.** 
17f90 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20  union, also set 
17fa0 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65  the ".dtnum" fie
17fb0 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d  ld of every term
17fc0 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d  inal and nonterm
17fd0 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a  inal.** symbol..
17fe0 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74  */.void print_st
17ff0 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65  ack_union(out,le
18000 6d 70 2c 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61  mp,plineno,mhfla
18010 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20  g).FILE *out;   
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18030 2a 20 54 68 65 20 6f 75 74 70 75 74 20 73 74 72  * The output str
18040 65 61 6d 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65  eam */.struct le
18050 6d 6f 6e 20 2a 6c 65 6d 70 3b 20 20 20 20 20 20  mon *lemp;      
18060 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69     /* The main i
18070 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f  nfo structure fo
18080 72 20 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f  r this parser */
18090 0a 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20  .int *plineno;  
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
180b0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  Pointer to the l
180c0 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 69 6e  ine number */.in
180d0 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 20 20  t mhflag;       
180e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
180f0 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20  e if generating 
18100 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70  makeheaders outp
18110 75 74 20 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c 69  ut */.{.  int li
18120 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b  neno = *plineno;
18130 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20      /* The line 
18140 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f 75  number of the ou
18150 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tput */.  char *
18160 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20 20 20  *types;         
18170 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74 61      /* A hash ta
18180 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73  ble of datatypes
18190 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79 73   */.  int arrays
181a0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
181b0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 22  /* Size of the "
181c0 74 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f 0a  types" array */.
181d0 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74    int maxdtlengt
181e0 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  h;          /* M
181f0 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66  aximum length of
18200 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65 22   any ".datatype"
18210 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61   field. */.  cha
18220 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20 20  r *stddt;       
18230 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64 61         /* Standa
18240 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20  rdized name for 
18250 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20 20  a datatype */.  
18260 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20 20  int i,j;        
18270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
18280 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
18290 69 6e 74 20 68 61 73 68 3b 20 20 20 20 20 20 20  int hash;       
182a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
182b0 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61 6d   hashing the nam
182c0 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a 20  e of a type */. 
182d0 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20   char *name;    
182e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
182f0 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  me of the parser
18300 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
18310 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
18320 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c  e types[] and al
18330 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20 2a  locate stddt[] *
18340 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d 20  /.  arraysize = 
18350 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20  lemp->nsymbol * 
18360 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63 68  2;.  types = (ch
18370 61 72 2a 2a 29 6d 61 6c 6c 6f 63 28 20 61 72 72  ar**)malloc( arr
18380 61 79 73 69 7a 65 20 2a 20 73 69 7a 65 6f 66 28  aysize * sizeof(
18390 63 68 61 72 2a 29 20 29 3b 0a 20 20 66 6f 72 28  char*) );.  for(
183a0 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65  i=0; i<arraysize
183b0 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20  ; i++) types[i] 
183c0 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67  = 0;.  maxdtleng
183d0 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65  th = 0;.  if( le
183e0 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b 0a 20  mp->vartype ){. 
183f0 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d     maxdtlength =
18400 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61   strlen(lemp->va
18410 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  rtype);.  }.  fo
18420 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
18430 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
18440 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73    int len;.    s
18450 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
18460 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
18470 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  [i];.    if( sp-
18480 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20 63  >datatype==0 ) c
18490 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e  ontinue;.    len
184a0 20 3d 20 73 74 72 6c 65 6e 28 73 70 2d 3e 64 61   = strlen(sp->da
184b0 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  tatype);.    if(
184c0 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68   len>maxdtlength
184d0 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d   ) maxdtlength =
184e0 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64   len;.  }.  stdd
184f0 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  t = (char*)mallo
18500 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32  c( maxdtlength*2
18510 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 74 79   + 1 );.  if( ty
18520 70 65 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d  pes==0 || stddt=
18530 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
18540 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66  f(stderr,"Out of
18550 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20   memory.\n");.  
18560 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a    exit(1);.  }..
18570 20 20 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73    /* Build a has
18580 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74  h table of datat
18590 79 70 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75  ypes. The ".dtnu
185a0 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68  m" field of each
185b0 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20   symbol.  ** is 
185c0 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74  filled in with t
185d0 68 65 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c  he hash index pl
185e0 75 73 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d  us 1.  A ".dtnum
185f0 22 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a  " value of 0 is.
18600 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65    ** used for te
18610 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20  rminal symbols. 
18620 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
18630 25 64 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65  %default_type de
18640 66 69 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20  fined then.  ** 
18650 30 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61  0 is also used a
18660 73 20 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c  s the .dtnum val
18670 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e  ue for nontermin
18680 61 6c 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74  als which do not
18690 20 73 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20   specify.  ** a 
186a0 64 61 74 61 74 79 70 65 20 75 73 69 6e 67 20 74  datatype using t
186b0 68 65 20 25 74 79 70 65 20 64 69 72 65 63 74 69  he %type directi
186c0 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ve..  */.  for(i
186d0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
186e0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
186f0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
18700 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
18710 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  [i];.    char *c
18720 70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c  p;.    if( sp==l
18730 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20  emp->errsym ){. 
18740 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
18750 20 61 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20   arraysize+1;.  
18760 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
18770 20 20 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e    }.    if( sp->
18780 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type!=NONTERMINA
18790 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79  L || (sp->dataty
187a0 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76  pe==0 && lemp->v
187b0 61 72 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20  artype==0) ){.  
187c0 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
187d0 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
187e0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20  e;.    }.    cp 
187f0 3d 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a  = sp->datatype;.
18800 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20      if( cp==0 ) 
18810 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79  cp = lemp->varty
18820 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20  pe;.    j = 0;. 
18830 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
18840 65 28 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20  e(*cp) ) cp++;. 
18850 20 20 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20     while( *cp ) 
18860 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70  stddt[j++] = *cp
18870 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a  ++;.    while( j
18880 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 73 74  >0 && isspace(st
18890 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b  ddt[j-1]) ) j--;
188a0 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20  .    stddt[j] = 
188b0 30 3b 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b  0;.    hash = 0;
188c0 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74  .    for(j=0; st
188d0 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ddt[j]; j++){.  
188e0 20 20 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a      hash = hash*
188f0 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20  53 + stddt[j];. 
18900 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20     }.    hash = 
18910 28 68 61 73 68 20 26 20 30 78 37 66 66 66 66 66  (hash & 0x7fffff
18920 66 66 29 25 61 72 72 61 79 73 69 7a 65 3b 0a 20  ff)%arraysize;. 
18930 20 20 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b     while( types[
18940 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69  hash] ){.      i
18950 66 28 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b  f( strcmp(types[
18960 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20  hash],stddt)==0 
18970 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64  ){.        sp->d
18980 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b  tnum = hash + 1;
18990 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
189a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61        }.      ha
189b0 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  sh++;.      if( 
189c0 68 61 73 68 3e 3d 61 72 72 61 79 73 69 7a 65 20  hash>=arraysize 
189d0 29 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20  ) hash = 0;.    
189e0 7d 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b  }.    if( types[
189f0 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  hash]==0 ){.    
18a00 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61    sp->dtnum = ha
18a10 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 74 79  sh + 1;.      ty
18a20 70 65 73 5b 68 61 73 68 5d 20 3d 20 28 63 68 61  pes[hash] = (cha
18a30 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65  r*)malloc( strle
18a40 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20  n(stddt)+1 );.  
18a50 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61      if( types[ha
18a60 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sh]==0 ){.      
18a70 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
18a80 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
18a90 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78  \n");.        ex
18aa0 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  it(1);.      }. 
18ab0 20 20 20 20 20 73 74 72 63 70 79 28 74 79 70 65       strcpy(type
18ac0 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a  s[hash],stddt);.
18ad0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18ae0 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20 64 65  Print out the de
18af0 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f  finition of YYTO
18b00 4b 45 4e 54 59 50 45 20 61 6e 64 20 59 59 4d 49  KENTYPE and YYMI
18b10 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d  NORTYPE */.  nam
18b20 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f  e = lemp->name ?
18b30 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50   lemp->name : "P
18b40 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20  arse";.  lineno 
18b50 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66  = *plineno;.  if
18b60 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69  ( mhflag ){ fpri
18b70 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54  ntf(out,"#if INT
18b80 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65  ERFACE\n"); line
18b90 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74  no++; }.  fprint
18ba0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
18bb0 73 54 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22  sTOKENTYPE %s\n"
18bc0 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d  ,name,.    lemp-
18bd0 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d  >tokentype?lemp-
18be0 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64  >tokentype:"void
18bf0 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  *");  lineno++;.
18c00 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20    if( mhflag ){ 
18c10 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
18c20 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
18c30 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  +; }.  fprintf(o
18c40 75 74 2c 22 74 79 70 65 64 65 66 20 75 6e 69 6f  ut,"typedef unio
18c50 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  n {\n"); lineno+
18c60 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
18c70 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45 20  ,"  %sTOKENTYPE 
18c80 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  yy0;\n",name); l
18c90 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
18ca0 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b  =0; i<arraysize;
18cb0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74   i++){.    if( t
18cc0 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  ypes[i]==0 ) con
18cd0 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e  tinue;.    fprin
18ce0 74 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79 25  tf(out,"  %s yy%
18cf0 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69  d;\n",types[i],i
18d00 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  +1); lineno++;. 
18d10 20 20 20 66 72 65 65 28 74 79 70 65 73 5b 69 5d     free(types[i]
18d20 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  );.  }.  fprintf
18d30 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25 64  (out,"  int yy%d
18d40 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  ;\n",lemp->errsy
18d50 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e  m->dtnum); linen
18d60 6f 2b 2b 3b 0a 20 20 66 72 65 65 28 73 74 64 64  o++;.  free(stdd
18d70 74 29 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73  t);.  free(types
18d80 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
18d90 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b  ,"} YYMINORTYPE;
18da0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
18db0 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e    *plineno = lin
18dc0 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eno;.}../*.** Re
18dd0 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
18de0 20 61 20 43 20 64 61 74 61 74 79 70 65 20 61 62   a C datatype ab
18df0 6c 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  le to represent 
18e00 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 0a 2a  values between.*
18e10 2a 20 6c 77 72 20 61 6e 64 20 75 70 72 2c 20 69  * lwr and upr, i
18e20 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61  nclusive..*/.sta
18e30 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
18e40 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
18e50 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75  e(int lwr, int u
18e60 70 72 29 7b 0a 20 20 69 66 28 20 6c 77 72 3e 3d  pr){.  if( lwr>=
18e70 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75 70 72  0 ){.    if( upr
18e80 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20 20 20 72  <=255 ){.      r
18e90 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20  eturn "unsigned 
18ea0 63 68 61 72 22 3b 0a 20 20 20 20 7d 65 6c 73 65  char";.    }else
18eb0 20 69 66 28 20 75 70 72 3c 36 35 35 33 35 20 29   if( upr<65535 )
18ec0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  {.      return "
18ed0 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69  unsigned short i
18ee0 6e 74 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nt";.    }else{.
18ef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e        return "un
18f00 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20  signed int";.   
18f10 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c   }.  }else if( l
18f20 77 72 3e 3d 2d 31 32 37 20 26 26 20 75 70 72 3c  wr>=-127 && upr<
18f30 3d 31 32 37 20 29 7b 0a 20 20 20 20 72 65 74 75  =127 ){.    retu
18f40 72 6e 20 22 73 69 67 6e 65 64 20 63 68 61 72 22  rn "signed char"
18f50 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77  ;.  }else if( lw
18f60 72 3e 3d 2d 33 32 37 36 37 20 26 26 20 75 70 72  r>=-32767 && upr
18f70 3c 33 32 37 36 37 20 29 7b 0a 20 20 20 20 72 65  <32767 ){.    re
18f80 74 75 72 6e 20 22 73 68 6f 72 74 22 3b 0a 20 20  turn "short";.  
18f90 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
18fa0 6e 20 22 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a  n "int";.  }.}..
18fb0 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61 74 65  /*.** Each state
18fc0 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 74 20   contains a set 
18fd0 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63  of token transac
18fe0 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 74 20 6f  tion and a set o
18ff0 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  f.** nonterminal
19000 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20   transactions.  
19010 45 61 63 68 20 6f 66 20 74 68 65 73 65 20 73 65  Each of these se
19020 74 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74  ts makes an inst
19030 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ance.** of the f
19040 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
19050 72 65 2e 20 20 41 6e 20 61 72 72 61 79 20 6f 66  re.  An array of
19060 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
19070 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20  s is used.** to 
19080 6f 72 64 65 72 20 74 68 65 20 63 72 65 61 74 69  order the creati
19090 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  on of entries in
190a0 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
190b0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
190c0 74 20 61 78 73 65 74 20 7b 0a 20 20 73 74 72 75  t axset {.  stru
190d0 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
190e0 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f   /* A pointer to
190f0 20 61 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e   a state */.  in
19100 74 20 69 73 54 6b 6e 3b 20 20 20 20 20 20 20 20  t isTkn;        
19110 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
19120 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65  e tokens.  False
19130 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61   for non-termina
19140 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74  ls */.  int nAct
19150 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ion;         /* 
19160 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e  Number of action
19170 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
19180 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65 74 20  ompare to axset 
19190 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 73  structures for s
191a0 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a  orting purposes.
191b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 78  */.static int ax
191c0 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73  set_compare(cons
191d0 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74  t void *a, const
191e0 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72   void *b){.  str
191f0 75 63 74 20 61 78 73 65 74 20 2a 70 31 20 3d 20  uct axset *p1 = 
19200 28 73 74 72 75 63 74 20 61 78 73 65 74 2a 29 61  (struct axset*)a
19210 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74  ;.  struct axset
19220 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74 20 61   *p2 = (struct a
19230 78 73 65 74 2a 29 62 3b 0a 20 20 72 65 74 75 72  xset*)b;.  retur
19240 6e 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20  n p2->nAction - 
19250 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 7d 0a 0a  p1->nAction;.}..
19260 2f 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f  /* Generate C so
19270 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68  urce code for th
19280 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64  e parser */.void
19290 20 52 65 70 6f 72 74 54 61 62 6c 65 28 6c 65 6d   ReportTable(lem
192a0 70 2c 20 6d 68 66 6c 61 67 29 0a 73 74 72 75 63  p, mhflag).struc
192b0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69  t lemon *lemp;.i
192c0 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 2f  nt mhflag;     /
192d0 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65  * Output in make
192e0 68 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69  headers format i
192f0 66 20 74 72 75 65 20 2a 2f 0a 7b 0a 20 20 46 49  f true */.{.  FI
19300 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20  LE *out, *in;.  
19310 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49  char line[LINESI
19320 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65  ZE];.  int  line
19330 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  no;.  struct sta
19340 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
19350 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
19360 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
19370 0a 20 20 73 74 72 75 63 74 20 61 63 74 74 61 62  .  struct acttab
19380 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74   *pActtab;.  int
19390 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68 61 72   i, j, n;.  char
193a0 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e   *name;.  int mn
193b0 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66  TknOfst, mxTknOf
193c0 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66  st;.  int mnNtOf
193d0 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20  st, mxNtOfst;.  
193e0 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 61 78  struct axset *ax
193f0 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f  ;..  in = tplt_o
19400 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28  pen(lemp);.  if(
19410 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   in==0 ) return;
19420 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70  .  out = file_op
19430 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 62  en(lemp,".c","wb
19440 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30  ");.  if( out==0
19450 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69   ){.    fclose(i
19460 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  n);.    return;.
19470 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31    }.  lineno = 1
19480 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
19490 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
194a0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
194b0 47 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63  Generate the inc
194c0 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e  lude code, if an
194d0 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  y */.  tplt_prin
194e0 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
194f0 3e 69 6e 63 6c 75 64 65 2c 6c 65 6d 70 2d 3e 69  >include,lemp->i
19500 6e 63 6c 75 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f  ncludeln,&lineno
19510 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  );.  if( mhflag 
19520 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d  ){.    char *nam
19530 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d  e = file_makenam
19540 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20  e(lemp, ".h");. 
19550 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19560 23 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c  #include \"%s\"\
19570 6e 22 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  n", name); linen
19580 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e 61  o++;.    free(na
19590 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  me);.  }.  tplt_
195a0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
195b0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
195c0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
195d0 23 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c  #defines for all
195e0 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28   tokens */.  if(
195f0 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63   mhflag ){.    c
19600 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20  har *prefix;.   
19610 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
19620 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
19630 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69   lineno++;.    i
19640 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
19650 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
19660 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
19670 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  x;.    else     
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19690 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20  refix = "";.    
196a0 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
196b0 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
196c0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
196d0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
196e0 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
196f0 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
19700 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
19710 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
19720 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
19730 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b  out,"#endif\n");
19740 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
19750 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
19760 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
19770 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
19780 65 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65  erate the define
19790 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  s */.  fprintf(o
197a0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f  ut,"#define YYCO
197b0 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20  DETYPE %s\n",.  
197c0 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
197d0 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79  ype(0, lemp->nsy
197e0 6d 62 6f 6c 2b 35 29 29 3b 20 6c 69 6e 65 6e 6f  mbol+5)); lineno
197f0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
19800 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43  t,"#define YYNOC
19810 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  ODE %d\n",lemp->
19820 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e  nsymbol+1);  lin
19830 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
19840 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
19850 41 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22  ACTIONTYPE %s\n"
19860 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69  ,.    minimum_si
19870 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d  ze_type(0, lemp-
19880 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72  >nstate+lemp->nr
19890 75 6c 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f  ule+5));  lineno
198a0 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
198b0 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20  wildcard ){.    
198c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
198d0 66 69 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20  fine YYWILDCARD 
198e0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65  %d\n",.       le
198f0 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e  mp->wildcard->in
19900 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
19910 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63    }.  print_stac
19920 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70  k_union(out,lemp
19930 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29  ,&lineno,mhflag)
19940 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  ;.  if( lemp->st
19950 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 69  acksize ){.    i
19960 66 28 20 61 74 6f 69 28 6c 65 6d 70 2d 3e 73 74  f( atoi(lemp->st
19970 61 63 6b 73 69 7a 65 29 3c 3d 30 20 29 7b 0a 20  acksize)<=0 ){. 
19980 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
19990 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
199a0 22 49 6c 6c 65 67 61 6c 20 73 74 61 63 6b 20 73  "Illegal stack s
199b0 69 7a 65 3a 20 5b 25 73 5d 2e 20 20 54 68 65 20  ize: [%s].  The 
199c0 73 74 61 63 6b 20 73 69 7a 65 20 73 68 6f 75 6c  stack size shoul
199d0 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
199e0 63 6f 6e 73 74 61 6e 74 2e 22 2c 0a 20 20 20 20  constant.",.    
199f0 20 20 20 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73      lemp->stacks
19a00 69 7a 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  ize);.      lemp
19a10 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
19a20 20 20 20 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73      lemp->stacks
19a30 69 7a 65 20 3d 20 22 31 30 30 22 3b 0a 20 20 20  ize = "100";.   
19a40 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
19a50 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54  ut,"#define YYST
19a60 41 43 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c  ACKDEPTH %s\n",l
19a70 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b  emp->stacksize);
19a80 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65    lineno++;.  }e
19a90 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
19aa0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
19ab0 53 54 41 43 4b 44 45 50 54 48 20 31 30 30 5c 6e  STACKDEPTH 100\n
19ac0 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ");  lineno++;. 
19ad0 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20   }.  if( mhflag 
19ae0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
19af0 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
19b00 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
19b10 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  .  }.  name = le
19b20 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
19b30 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
19b40 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67  .  if( lemp->arg
19b50 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d   && lemp->arg[0]
19b60 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
19b70 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 6c 65     i = strlen(le
19b80 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77 68  mp->arg);.    wh
19b90 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 69 73 73  ile( i>=1 && iss
19ba0 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b 69  pace(lemp->arg[i
19bb0 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20  -1]) ) i--;.    
19bc0 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28  while( i>=1 && (
19bd0 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72  isalnum(lemp->ar
19be0 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d  g[i-1]) || lemp-
19bf0 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20  >arg[i-1]=='_') 
19c00 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e  ) i--;.    fprin
19c10 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
19c20 25 73 41 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c  %sARG_SDECL %s;\
19c30 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72  n",name,lemp->ar
19c40 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  g);  lineno++;. 
19c50 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19c60 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44  #define %sARG_PD
19c70 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c  ECL ,%s\n",name,
19c80 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e  lemp->arg);  lin
19c90 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
19ca0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
19cb0 25 73 41 52 47 5f 46 45 54 43 48 20 25 73 20 3d  %sARG_FETCH %s =
19cc0 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 5c 6e   yypParser->%s\n
19cd0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19ce0 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61      name,lemp->a
19cf0 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  rg,&lemp->arg[i]
19d00 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
19d10 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
19d20 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f  define %sARG_STO
19d30 52 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73  RE yypParser->%s
19d40 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20   = %s\n",.      
19d50 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
19d60 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c  &lemp->arg[i],&l
19d70 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c  emp->arg[i]);  l
19d80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65  ineno++;.  }else
19d90 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
19da0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
19db0 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b  _SDECL\n",name);
19dc0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
19dd0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
19de0 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c  fine %sARG_PDECL
19df0 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65  \n",name);  line
19e00 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
19e10 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
19e20 73 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61  sARG_FETCH\n",na
19e30 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
19e40 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19e50 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54  #define %sARG_ST
19e60 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  ORE\n",name); li
19e70 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  neno++;.  }.  if
19e80 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
19e90 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
19ea0 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
19eb0 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
19ec0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
19ed0 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65 6d  NSTATE %d\n",lem
19ee0 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69 6e  p->nstate);  lin
19ef0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
19f00 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
19f10 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d 70  NRULE %d\n",lemp
19f20 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e  ->nrule);  linen
19f30 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
19f40 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52  ut,"#define YYER
19f50 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c  RORSYMBOL %d\n",
19f60 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e  lemp->errsym->in
19f70 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  dex);  lineno++;
19f80 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19f90 23 64 65 66 69 6e 65 20 59 59 45 52 52 53 59 4d  #define YYERRSYM
19fa0 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d  DT yy%d\n",lemp-
19fb0 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b  >errsym->dtnum);
19fc0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
19fd0 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c  ( lemp->has_fall
19fe0 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 70 72 69  back ){.    fpri
19ff0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1a000 20 59 59 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22   YYFALLBACK 1\n"
1a010 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1a020 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1a030 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1a040 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1a050 47 65 6e 65 72 61 74 65 20 74 68 65 20 61 63 74  Generate the act
1a060 69 6f 6e 20 74 61 62 6c 65 20 61 6e 64 20 69 74  ion table and it
1a070 73 20 61 73 73 6f 63 69 61 74 65 73 3a 0a 20 20  s associates:.  
1a080 2a 2a 0a 20 20 2a 2a 20 20 79 79 5f 61 63 74 69  **.  **  yy_acti
1a090 6f 6e 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69  on[]        A si
1a0a0 6e 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61  ngle table conta
1a0b0 69 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e  ining all action
1a0c0 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b  s..  **  yy_look
1a0d0 61 68 65 61 64 5b 5d 20 20 20 20 20 41 20 74 61  ahead[]     A ta
1a0e0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1a0f0 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72  he lookahead for
1a100 20 65 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 20   each entry in. 
1a110 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
1a120 20 20 20 20 20 20 20 20 79 79 5f 61 63 74 69 6f          yy_actio
1a130 6e 2e 20 20 55 73 65 64 20 74 6f 20 64 65 74 65  n.  Used to dete
1a140 63 74 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ct hash collisio
1a150 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69  ns..  **  yy_shi
1a160 66 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72  ft_ofst[]    For
1a170 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65   each state, the
1a180 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f   offset into yy_
1a190 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20  action for.  ** 
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1b0 20 20 20 20 73 68 69 66 74 69 6e 67 20 74 65 72      shifting ter
1a1c0 6d 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79  minals..  **  yy
1a1d0 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20  _reduce_ofst[]  
1a1e0 20 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c   For each state,
1a1f0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f   the offset into
1a200 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20   yy_action for. 
1a210 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
1a220 20 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67          shifting
1a230 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61   non-terminals a
1a240 66 74 65 72 20 61 20 72 65 64 75 63 65 2e 0a 20  fter a reduce.. 
1a250 20 2a 2a 20 20 79 79 5f 64 65 66 61 75 6c 74 5b   **  yy_default[
1a260 5d 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 20  ]       Default 
1a270 61 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  action for each 
1a280 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  state..  */..  /
1a290 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63  * Compute the ac
1a2a0 74 69 6f 6e 73 20 6f 6e 20 61 6c 6c 20 73 74 61  tions on all sta
1a2b0 74 65 73 20 61 6e 64 20 63 6f 75 6e 74 20 74 68  tes and count th
1a2c0 65 6d 20 75 70 20 2a 2f 0a 20 20 61 78 20 3d 20  em up */.  ax = 
1a2d0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61  malloc( sizeof(a
1a2e0 78 5b 30 5d 29 2a 6c 65 6d 70 2d 3e 6e 73 74 61  x[0])*lemp->nsta
1a2f0 74 65 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 78  te*2 );.  if( ax
1a300 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
1a310 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f  tf(stderr,"mallo
1a320 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20  c failed\n");.  
1a330 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
1a340 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1a350 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
1a360 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
1a370 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61  sorted[i];.    a
1a380 78 5b 69 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70  x[i*2].stp = stp
1a390 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73  ;.    ax[i*2].is
1a3a0 54 6b 6e 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b  Tkn = 1;.    ax[
1a3b0 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73  i*2].nAction = s
1a3c0 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20  tp->nTknAct;.   
1a3d0 20 61 78 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d   ax[i*2+1].stp =
1a3e0 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32   stp;.    ax[i*2
1a3f0 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20  +1].isTkn = 0;. 
1a400 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63     ax[i*2+1].nAc
1a410 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41  tion = stp->nNtA
1a420 63 74 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f  ct;.  }.  mxTknO
1a430 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20  fst = mnTknOfst 
1a440 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20  = 0;.  mxNtOfst 
1a450 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a  = mnNtOfst = 0;.
1a460 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1a470 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20  e action table. 
1a480 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 79   In order to try
1a490 20 74 6f 20 6b 65 65 70 20 74 68 65 20 73 69 7a   to keep the siz
1a4a0 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 61 63  e of the.  ** ac
1a4b0 74 69 6f 6e 20 74 61 62 6c 65 20 74 6f 20 61 20  tion table to a 
1a4c0 6d 69 6e 69 6d 75 6d 2c 20 74 68 65 20 68 65 75  minimum, the heu
1a4d0 72 69 73 74 69 63 20 6f 66 20 70 6c 61 63 69 6e  ristic of placin
1a4e0 67 20 74 68 65 20 6c 61 72 67 65 73 74 20 61 63  g the largest ac
1a4f0 74 69 6f 6e 0a 20 20 2a 2a 20 73 65 74 73 20 66  tion.  ** sets f
1a500 69 72 73 74 20 69 73 20 75 73 65 64 2e 0a 20 20  irst is used..  
1a510 2a 2f 0a 20 20 71 73 6f 72 74 28 61 78 2c 20 6c  */.  qsort(ax, l
1a520 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73  emp->nstate*2, s
1a530 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78  izeof(ax[0]), ax
1a540 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20  set_compare);.  
1a550 70 41 63 74 74 61 62 20 3d 20 61 63 74 74 61 62  pActtab = acttab
1a560 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28  _alloc();.  for(
1a570 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1a580 61 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e  ate*2 && ax[i].n
1a590 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a  Action>0; i++){.
1a5a0 20 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e      stp = ax[i].
1a5b0 73 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78 5b  stp;.    if( ax[
1a5c0 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20  i].isTkn ){.    
1a5d0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1a5e0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1a5f0 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
1a600 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  action;.        
1a610 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1a620 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  x>=lemp->ntermin
1a630 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  al ) continue;. 
1a640 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20         action = 
1a650 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
1a660 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20  emp, ap);.      
1a670 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29    if( action<0 )
1a680 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1a690 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e     acttab_action
1a6a0 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70  (pActtab, ap->sp
1a6b0 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29  ->index, action)
1a6c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a6d0 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20  stp->iTknOfst = 
1a6e0 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41  acttab_insert(pA
1a6f0 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66  cttab);.      if
1a700 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c  ( stp->iTknOfst<
1a710 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b  mnTknOfst ) mnTk
1a720 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b  nOfst = stp->iTk
1a730 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28  nOfst;.      if(
1a740 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d   stp->iTknOfst>m
1a750 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e  xTknOfst ) mxTkn
1a760 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  Ofst = stp->iTkn
1a770 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ofst;.    }else{
1a780 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74  .      for(ap=st
1a790 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
1a7a0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
1a7b0 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20   int action;.   
1a7c0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
1a7d0 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65  >index<lemp->nte
1a7e0 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75  rminal ) continu
1a7f0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  e;.        if( a
1a800 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65  p->sp->index==le
1a810 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f  mp->nsymbol ) co
1a820 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1a830 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65  action = compute
1a840 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70  _action(lemp, ap
1a850 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1a860 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e  ction<0 ) contin
1a870 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74  ue;.        actt
1a880 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61  ab_action(pActta
1a890 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  b, ap->sp->index
1a8a0 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  , action);.     
1a8b0 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e   }.      stp->iN
1a8c0 74 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69  tOfst = acttab_i
1a8d0 6e 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a  nsert(pActtab);.
1a8e0 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69        if( stp->i
1a8f0 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20  NtOfst<mnNtOfst 
1a900 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70  ) mnNtOfst = stp
1a910 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20  ->iNtOfst;.     
1a920 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73   if( stp->iNtOfs
1a930 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e  t>mxNtOfst ) mxN
1a940 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74  tOfst = stp->iNt
1a950 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Ofst;.    }.  }.
1a960 20 20 66 72 65 65 28 61 78 29 3b 0a 0a 20 20 2f    free(ax);..  /
1a970 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f  * Output the yy_
1a980 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a  action table */.
1a990 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73    fprintf(out,"s
1a9a0 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43  tatic const YYAC
1a9b0 54 49 4f 4e 54 59 50 45 20 79 79 5f 61 63 74 69  TIONTYPE yy_acti
1a9c0 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  on[] = {\n"); li
1a9d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 61 63  neno++;.  n = ac
1a9e0 74 74 61 62 5f 73 69 7a 65 28 70 41 63 74 74 61  ttab_size(pActta
1a9f0 62 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  b);.  for(i=j=0;
1aa00 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1aa10 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61 63 74  int action = act
1aa20 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 70 41 63  tab_yyaction(pAc
1aa30 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66  ttab, i);.    if
1aa40 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 61 63 74  ( action<0 ) act
1aa50 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  ion = lemp->nsta
1aa60 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
1aa70 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d   + 2;.    if( j=
1aa80 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1aa90 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1aaa0 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1aab0 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 61 63  out, " %4d,", ac
1aac0 74 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a  tion);.    if( j
1aad0 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1aae0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1aaf0 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1ab00 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1ab10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ab20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1ab30 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1ab40 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1ab50 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
1ab60 20 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61   the yy_lookahea
1ab70 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  d table */.  fpr
1ab80 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63  intf(out,"static
1ab90 20 63 6f 6e 73 74 20 59 59 43 4f 44 45 54 59 50   const YYCODETYP
1aba0 45 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d  E yy_lookahead[]
1abb0 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   = {\n"); lineno
1abc0 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ++;.  for(i=j=0;
1abd0 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1abe0 69 6e 74 20 6c 61 20 3d 20 61 63 74 74 61 62 5f  int la = acttab_
1abf0 79 79 6c 6f 6f 6b 61 68 65 61 64 28 70 41 63 74  yylookahead(pAct
1ac00 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  tab, i);.    if(
1ac10 20 6c 61 3c 30 20 29 20 6c 61 20 3d 20 6c 65 6d   la<0 ) la = lem
1ac20 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20 20  p->nsymbol;.    
1ac30 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
1ac40 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
1ac50 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
1ac60 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
1ac70 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20 69 66 28  ,", la);.    if(
1ac80 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20   j==9 || i==n-1 
1ac90 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1aca0 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e  (out, "\n"); lin
1acb0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d  eno++;.      j =
1acc0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1acd0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
1ace0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1acf0 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65  t, "};\n"); line
1ad00 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  no++;..  /* Outp
1ad10 75 74 20 74 68 65 20 79 79 5f 73 68 69 66 74 5f  ut the yy_shift_
1ad20 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a  ofst[] table */.
1ad30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1ad40 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54  #define YY_SHIFT
1ad50 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e  _USE_DFLT (%d)\n
1ad60 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29 3b  ", mnTknOfst-1);
1ad70 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d   lineno++;.  n =
1ad80 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20   lemp->nstate;. 
1ad90 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c   while( n>0 && l
1ada0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d  emp->sorted[n-1]
1adb0 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f  ->iTknOfst==NO_O
1adc0 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66  FFSET ) n--;.  f
1add0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1ade0 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41  fine YY_SHIFT_MA
1adf0 58 20 25 64 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c  X %d\n", n-1); l
1ae00 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1ae10 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20  tf(out, "static 
1ae20 63 6f 6e 73 74 20 25 73 20 79 79 5f 73 68 69 66  const %s yy_shif
1ae30 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c  t_ofst[] = {\n",
1ae40 20 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69   .          mini
1ae50 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e  mum_size_type(mn
1ae60 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e  TknOfst-1, mxTkn
1ae70 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  Ofst)); lineno++
1ae80 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
1ae90 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
1aea0 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20  t ofst;.    stp 
1aeb0 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1aec0 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74  ];.    ofst = st
1aed0 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20  p->iTknOfst;.   
1aee0 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46   if( ofst==NO_OF
1aef0 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e  FSET ) ofst = mn
1af00 54 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20  TknOfst - 1;.   
1af10 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1af20 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1af30 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1af40 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1af50 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  d,", ofst);.    
1af60 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
1af70 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
1af80 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
1af90 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1afa0 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
1afb0 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1afc0 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
1afd0 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
1afe0 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
1aff0 75 74 70 75 74 20 74 68 65 20 79 79 5f 72 65 64  utput the yy_red
1b000 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65  uce_ofst[] table
1b010 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1b020 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52  t, "#define YY_R
1b030 45 44 55 43 45 5f 55 53 45 5f 44 46 4c 54 20 28  EDUCE_USE_DFLT (
1b040 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74  %d)\n", mnNtOfst
1b050 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  -1); lineno++;. 
1b060 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74   n = lemp->nstat
1b070 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  e;.  while( n>0 
1b080 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  && lemp->sorted[
1b090 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e  n-1]->iNtOfst==N
1b0a0 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a  O_OFFSET ) n--;.
1b0b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b0c0 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
1b0d0 45 5f 4d 41 58 20 25 64 5c 6e 22 2c 20 6e 2d 31  E_MAX %d\n", n-1
1b0e0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1b0f0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1b100 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f  tic const %s yy_
1b110 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20  reduce_ofst[] = 
1b120 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  {\n", .         
1b130 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
1b140 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d  pe(mnNtOfst-1, m
1b150 78 4e 74 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e  xNtOfst)); linen
1b160 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  o++;.  for(i=j=0
1b170 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1b180 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73   int ofst;.    s
1b190 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1b1a0 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d  d[i];.    ofst =
1b1b0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20   stp->iNtOfst;. 
1b1c0 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f     if( ofst==NO_
1b1d0 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20  OFFSET ) ofst = 
1b1e0 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20  mnNtOfst - 1;.  
1b1f0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1b200 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1b210 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1b220 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1b230 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20  4d,", ofst);.   
1b240 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
1b250 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
1b260 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
1b270 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1b280 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
1b290 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
1b2a0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
1b2b0 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
1b2c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
1b2d0 4f 75 74 70 75 74 20 74 68 65 20 64 65 66 61 75  Output the defau
1b2e0 6c 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  lt action table 
1b2f0 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1b300 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  , "static const 
1b310 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f  YYACTIONTYPE yy_
1b320 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22  default[] = {\n"
1b330 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e  ); lineno++;.  n
1b340 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   = lemp->nstate;
1b350 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1b360 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  n; i++){.    stp
1b370 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
1b380 69 5d 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30  i];.    if( j==0
1b390 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1b3a0 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
1b3b0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1b3c0 74 2c 20 22 20 25 34 64 2c 22 2c 20 73 74 70 2d  t, " %4d,", stp-
1b3d0 3e 69 44 66 6c 74 29 3b 0a 20 20 20 20 69 66 28  >iDflt);.    if(
1b3e0 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20   j==9 || i==n-1 
1b3f0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1b400 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e  (out, "\n"); lin
1b410 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d  eno++;.      j =
1b420 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1b430 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
1b440 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1b450 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65  t, "};\n"); line
1b460 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65  no++;.  tplt_xfe
1b470 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1b480 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1b490 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
1b4a0 20 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61   table of fallba
1b4b0 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a  ck tokens..  */.
1b4c0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f    if( lemp->has_
1b4d0 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  fallback ){.    
1b4e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1b4f0 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
1b500 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1b510 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d  ymbol *p = lemp-
1b520 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1b530 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61     if( p->fallba
1b540 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
1b550 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1b560 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d     0,  /* %10s =
1b570 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c  > nothing */\n",
1b580 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20   p->name);.     
1b590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b5a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
1b5b0 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e  %3d,  /* %10s =>
1b5c0 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61   %s */\n", p->fa
1b5d0 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20  llback->index,. 
1b5e0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65           p->name
1b5f0 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e  , p->fallback->n
1b600 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1b610 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
1b620 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78    }.  }.  tplt_x
1b630 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20  fer(lemp->name, 
1b640 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f  in, out, &lineno
1b650 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1b660 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
1b670 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 69  ning the symboli
1b680 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72 79 20  c name of every 
1b690 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f  symbol.  */.  fo
1b6a0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1b6b0 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
1b6c0 20 20 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22    sprintf(line,"
1b6d0 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73  \"%s\",",lemp->s
1b6e0 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29  ymbols[i]->name)
1b6f0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1b700 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65  t,"  %-15s",line
1b710 29 3b 0a 20 20 20 20 69 66 28 20 28 69 26 33 29  );.    if( (i&3)
1b720 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  ==3 ){ fprintf(o
1b730 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ut,"\n"); lineno
1b740 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20  ++; }.  }.  if( 
1b750 28 69 26 33 29 21 3d 30 20 29 7b 20 66 70 72 69  (i&3)!=0 ){ fpri
1b760 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c  ntf(out,"\n"); l
1b770 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c  ineno++; }.  tpl
1b780 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1b790 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1b7a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1b7b0 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
1b7c0 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74 72 69  ning a text stri
1b7d0 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
1b7e0 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c  s every.  ** rul
1b7f0 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73 65  e in the rule se
1b800 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 65 72  t of the grammer
1b810 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
1b820 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  ion is used.  **
1b830 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52 45   when tracing RE
1b840 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20  DUCE actions..  
1b850 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70  */.  for(i=0, rp
1b860 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
1b870 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b   rp=rp->next, i+
1b880 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1b890 72 70 2d 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a  rp->index==i );.
1b8a0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b8b0 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 25 73  " /* %3d */ \"%s
1b8c0 20 3a 3a 3d 22 2c 20 69 2c 20 72 70 2d 3e 6c 68   ::=", i, rp->lh
1b8d0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  s->name);.    fo
1b8e0 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68  r(j=0; j<rp->nrh
1b8f0 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  s; j++){.      s
1b900 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1b910 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20   = rp->rhs[j];. 
1b920 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1b930 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65  ," %s", sp->name
1b940 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  );.      if( sp-
1b950 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
1b960 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
1b970 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66  int k;.        f
1b980 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73  or(k=1; k<sp->ns
1b990 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ubsym; k++){.   
1b9a0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1b9b0 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62  ut,"|%s",sp->sub
1b9c0 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  sym[k]->name);. 
1b9d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b9e0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
1b9f0 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22 29 3b  tf(out,"\",\n");
1ba00 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1ba10 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1ba20 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1ba30 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1ba40 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1ba50 20 65 78 65 63 75 74 65 73 20 65 76 65 72 79 20   executes every 
1ba60 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20 69 73  time a symbol is
1ba70 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20 20 2a   popped from.  *
1ba80 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68 69 6c  * the stack whil
1ba90 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65 72 72  e processing err
1baa0 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64 65 73  ors or while des
1bab0 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61 72 73  troying the pars
1bac0 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20 6f 74  er. .  ** (In ot
1bad0 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e 65 72  her words, gener
1bae0 61 74 65 20 74 68 65 20 25 64 65 73 74 72 75 63  ate the %destruc
1baf0 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20 20 2a  tor actions).  *
1bb00 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f  /.  if( lemp->to
1bb10 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20 20 66  kendest ){.    f
1bb20 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1bb30 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1bb40 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1bb50 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1bb60 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
1bb70 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1bb80 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
1bb90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1bba0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1bbb0 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c      case %d:\n",
1bbc0 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65  sp->index); line
1bbd0 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no++;.    }.    
1bbe0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1bbf0 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70  >nsymbol && lemp
1bc00 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79  ->symbols[i]->ty
1bc10 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b  pe!=TERMINAL; i+
1bc20 2b 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c 65  +);.    if( i<le
1bc30 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20  mp->nsymbol ){. 
1bc40 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75       emit_destru
1bc50 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65  ctor_code(out,le
1bc60 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c  mp->symbols[i],l
1bc70 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
1bc80 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1bc90 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
1bca0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1bcb0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d   }.  }.  if( lem
1bcc0 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20  p->vardest ){.  
1bcd0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1bce0 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20  *dflt_sp = 0;.  
1bcf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1bd00 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1bd10 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1bd20 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
1bd30 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
1bd40 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
1bd50 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
1bd60 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  NAL ||.         
1bd70 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c   sp->index<=0 ||
1bd80 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21   sp->destructor!
1bd90 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1bda0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1bdb0 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e  ,"    case %d:\n
1bdc0 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69  ",sp->index); li
1bdd0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66  neno++;.      df
1bde0 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20  lt_sp = sp;.    
1bdf0 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73  }.    if( dflt_s
1be00 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d  p!=0 ){.      em
1be10 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
1be20 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c  de(out,dflt_sp,l
1be30 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
1be40 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1be50 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
1be60 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1be70 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30   }.  }.  for(i=0
1be80 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
1be90 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  l; i++){.    str
1bea0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1beb0 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1bec0 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30  ];.    if( sp==0
1bed0 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45   || sp->type==TE
1bee0 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65  RMINAL || sp->de
1bef0 73 74 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f  structor==0 ) co
1bf00 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69  ntinue;.    fpri
1bf10 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
1bf20 65 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64  e %d:\n",sp->ind
1bf30 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  ex); lineno++;..
1bf40 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64      /* Combine d
1bf50 75 70 6c 69 63 61 74 65 20 64 65 73 74 72 75 63  uplicate destruc
1bf60 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  tors into a sing
1bf70 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 66  le case */.    f
1bf80 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70  or(j=i+1; j<lemp
1bf90 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b  ->nsymbol; j++){
1bfa0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
1bfb0 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70  mbol *sp2 = lemp
1bfc0 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20  ->symbols[j];.  
1bfd0 20 20 20 20 69 66 28 20 73 70 32 20 26 26 20 73      if( sp2 && s
1bfe0 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  p2->type!=TERMIN
1bff0 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73 74 72  AL && sp2->destr
1c000 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20 20 20  uctor.          
1c010 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73  && sp2->dtnum==s
1c020 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20 20  p->dtnum.       
1c030 20 20 20 26 26 20 73 74 72 63 6d 70 28 73 70 2d     && strcmp(sp-
1c040 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70 32 2d  >destructor,sp2-
1c050 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d 30 20  >destructor)==0 
1c060 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72 69  ){.         fpri
1c070 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
1c080 65 20 25 64 3a 5c 6e 22 2c 73 70 32 2d 3e 69 6e  e %d:\n",sp2->in
1c090 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1c0a0 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 64 65           sp2->de
1c0b0 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20  structor = 0;.  
1c0c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1c0d0 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
1c0e0 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e  _code(out,lemp->
1c0f0 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c  symbols[i],lemp,
1c100 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70  &lineno);.    fp
1c110 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1c120 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1c130 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1c140 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1c150 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1c160 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1c170 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1c180 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74  cutes whenever t
1c190 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
1c1a0 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74  overflows */.  t
1c1b0 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1c1c0 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f  mp,lemp->overflo
1c1d0 77 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77  w,lemp->overflow
1c1e0 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  ln,&lineno);.  t
1c1f0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1c200 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1c210 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1c220 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66  ate the table of
1c230 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   rule informatio
1c240 6e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  n .  **.  ** Not
1c250 65 3a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  e: This code dep
1c260 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
1c270 20 74 68 61 74 20 72 75 6c 65 73 20 61 72 65 20   that rules are 
1c280 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71 75  number.  ** sequ
1c290 65 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69  entually beginni
1c2a0 6e 67 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a  ng with 0..  */.
1c2b0 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
1c2c0 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
1c2d0 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e  next){.    fprin
1c2e0 74 66 28 6f 75 74 2c 22 20 20 7b 20 25 64 2c 20  tf(out,"  { %d, 
1c2f0 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73  %d },\n",rp->lhs
1c300 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e 72 68 73  ->index,rp->nrhs
1c310 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1c320 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1c330 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1c340 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1c350 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1c360 63 68 20 65 78 65 63 75 74 69 6f 6e 20 64 75 72  ch execution dur
1c370 69 6e 67 20 65 61 63 68 20 52 45 44 55 43 45 20  ing each REDUCE 
1c380 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  action */.  for(
1c390 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
1c3a0 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
1c3b0 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 5f 63  .    translate_c
1c3c0 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a 20  ode(lemp, rp);. 
1c3d0 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
1c3e0 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
1c3f0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74  p->next){.    st
1c400 72 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 0a  ruct rule *rp2;.
1c410 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65      if( rp->code
1c420 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1c430 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1c440 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 5c  "      case %d:\
1c450 6e 22 2c 72 70 2d 3e 69 6e 64 65 78 29 3b 20 6c  n",rp->index); l
1c460 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72  ineno++;.    for
1c470 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72  (rp2=rp->next; r
1c480 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78  p2; rp2=rp2->nex
1c490 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70  t){.      if( rp
1c4a0 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64  2->code==rp->cod
1c4b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  e ){.        fpr
1c4c0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1c4d0 63 61 73 65 20 25 64 3a 5c 6e 22 2c 72 70 32 2d  case %d:\n",rp2-
1c4e0 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
1c4f0 2b 3b 0a 20 20 20 20 20 20 20 20 72 70 32 2d 3e  +;.        rp2->
1c500 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  code = 0;.      
1c510 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6d 69 74  }.    }.    emit
1c520 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d  _code(out,rp,lem
1c530 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
1c540 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1c550 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
1c560 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1c570 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1c580 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1c590 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1c5a0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1c5b0 20 65 78 65 63 75 74 65 73 20 69 66 20 61 20 70   executes if a p
1c5c0 61 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20  arse fails */.  
1c5d0 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1c5e0 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72  emp,lemp->failur
1c5f0 65 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 6c  e,lemp->failurel
1c600 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70  n,&lineno);.  tp
1c610 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1c620 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1c630 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1c640 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1c650 65 63 75 74 65 73 20 77 68 65 6e 20 61 20 73 79  ecutes when a sy
1c660 6e 74 61 78 20 65 72 72 6f 72 20 6f 63 63 75 72  ntax error occur
1c670 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
1c680 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
1c690 3e 65 72 72 6f 72 2c 6c 65 6d 70 2d 3e 65 72 72  >error,lemp->err
1c6a0 6f 72 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  orln,&lineno);. 
1c6b0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1c6c0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1c6d0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1c6e0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1c6f0 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74   executes when t
1c700 68 65 20 70 61 72 73 65 72 20 61 63 63 65 70 74  he parser accept
1c710 73 20 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20  s its input */. 
1c720 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1c730 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70  lemp,lemp->accep
1c740 74 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 6c 6e  t,lemp->acceptln
1c750 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
1c760 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1c770 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1c780 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20  );..  /* Append 
1c790 61 6e 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64  any addition cod
1c7a0 65 20 74 68 65 20 75 73 65 72 20 64 65 73 69 72  e the user desir
1c7b0 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  es */.  tplt_pri
1c7c0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1c7d0 2d 3e 65 78 74 72 61 63 6f 64 65 2c 6c 65 6d 70  ->extracode,lemp
1c7e0 2d 3e 65 78 74 72 61 63 6f 64 65 6c 6e 2c 26 6c  ->extracodeln,&l
1c7f0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73  ineno);..  fclos
1c800 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28  e(in);.  fclose(
1c810 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  out);.  return;.
1c820 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  }../* Generate a
1c830 20 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72   header file for
1c840 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76   the parser */.v
1c850 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64 65 72  oid ReportHeader
1c860 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
1c870 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 46  mon *lemp;.{.  F
1c880 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20  ILE *out, *in;. 
1c890 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20   char *prefix;. 
1c8a0 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
1c8b0 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74  IZE];.  char pat
1c8c0 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  tern[LINESIZE];.
1c8d0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
1c8e0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1c8f0 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d  x ) prefix = lem
1c900 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
1c910 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
1c920 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
1c930 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69   = "";.  in = fi
1c940 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
1c950 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  ","rb");.  if( i
1c960 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  n ){.    for(i=1
1c970 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
1c980 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c 69 6e  nal && fgets(lin
1c990 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20  e,LINESIZE,in); 
1c9a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70 72 69  i++){.      spri
1c9b0 6e 74 66 28 70 61 74 74 65 72 6e 2c 22 23 64 65  ntf(pattern,"#de
1c9c0 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64  fine %s%-30s %2d
1c9d0 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d  \n",prefix,lemp-
1c9e0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
1c9f0 65 2c 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e,i);.      if( 
1ca00 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74  strcmp(line,patt
1ca10 65 72 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ern) ) break;.  
1ca20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69    }.    fclose(i
1ca30 6e 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c  n);.    if( i==l
1ca40 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
1ca50 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68  {.      /* No ch
1ca60 61 6e 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  ange in the file
1ca70 2e 20 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65  .  Don't rewrite
1ca80 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65   it. */.      re
1ca90 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
1caa0 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65    out = file_ope
1cab0 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22  n(lemp,".h","wb"
1cac0 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
1cad0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c      for(i=1; i<l
1cae0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
1caf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69  i++){.      fpri
1cb00 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1cb10 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c   %s%-30s %2d\n",
1cb20 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d  prefix,lemp->sym
1cb30 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29  bols[i]->name,i)
1cb40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f  ;.    }.    fclo
1cb50 73 65 28 6f 75 74 29 3b 20 20 0a 20 20 7d 0a 20  se(out);  .  }. 
1cb60 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
1cb70 65 64 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f  educe the size o
1cb80 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  f the action tab
1cb90 6c 65 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  les, if possible
1cba0 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a  , by making use.
1cbb0 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a  ** of defaults..
1cbc0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  **.** In this ve
1cbd0 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74  rsion, we take t
1cbe0 68 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74  he most frequent
1cbf0 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61   REDUCE action a
1cc00 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68  nd make.** it th
1cc10 65 20 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65  e default.  Exce
1cc20 70 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  pt, there is no 
1cc30 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 77  default if the w
1cc40 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a  ildcard token.**
1cc50 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c   is a possible l
1cc60 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f  ook-ahead..*/.vo
1cc70 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65  id CompressTable
1cc80 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
1cc90 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
1cca0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
1ccb0 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
1ccc0 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 3b 0a 20 20  on *ap, *ap2;.  
1ccd0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
1cce0 20 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20   *rp2, *rbest;. 
1ccf0 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20   int nbest, n;. 
1cd00 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 75 73   int i;.  int us
1cd10 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20 20 66  esWildcard;..  f
1cd20 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1cd30 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
1cd40 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
1cd50 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65  rted[i];.    nbe
1cd60 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 65 73  st = 0;.    rbes
1cd70 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65 73 57  t = 0;.    usesW
1cd80 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a 20 20  ildcard = 0;..  
1cd90 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1cda0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1cdb0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
1cdc0 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26  ->type==SHIFT &&
1cdd0 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77   ap->sp==lemp->w
1cde0 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 20  ildcard ){.     
1cdf0 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20     usesWildcard 
1ce00 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1ce10 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21     if( ap->type!
1ce20 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e  =REDUCE ) contin
1ce30 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d 20 61  ue;.      rp = a
1ce40 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 69  p->x.rp;.      i
1ce50 66 28 20 72 70 3d 3d 72 62 65 73 74 20 29 20 63  f( rp==rbest ) c
1ce60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e  ontinue;.      n
1ce70 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 1;.      for(
1ce80 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  ap2=ap->next; ap
1ce90 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74  2; ap2=ap2->next
1cea0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
1ceb0 70 32 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  p2->type!=REDUCE
1cec0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ced0 20 20 20 20 20 72 70 32 20 3d 20 61 70 32 2d 3e       rp2 = ap2->
1cee0 78 2e 72 70 3b 0a 20 20 20 20 20 20 20 20 69 66  x.rp;.        if
1cef0 28 20 72 70 32 3d 3d 72 62 65 73 74 20 29 20 63  ( rp2==rbest ) c
1cf00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1cf10 20 69 66 28 20 72 70 32 3d 3d 72 70 20 29 20 6e   if( rp2==rp ) n
1cf20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1cf30 20 20 69 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b    if( n>nbest ){
1cf40 0a 20 20 20 20 20 20 20 20 6e 62 65 73 74 20 3d  .        nbest =
1cf50 20 6e 3b 0a 20 20 20 20 20 20 20 20 72 62 65 73   n;.        rbes
1cf60 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a  t = rp;.      }.
1cf70 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44      }. .    /* D
1cf80 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65 66  o not make a def
1cf90 61 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d 62  ault if the numb
1cfa0 65 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20 64  er of rules to d
1cfb0 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73  efault.    ** is
1cfc0 20 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 31 20   not at least 1 
1cfd0 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  or if the wildca
1cfe0 72 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f  rd token is a po
1cff0 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f  ssible.    ** lo
1d000 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a  okahead..    */.
1d010 20 20 20 20 69 66 28 20 6e 62 65 73 74 3c 31 20      if( nbest<1 
1d020 7c 7c 20 75 73 65 73 57 69 6c 64 63 61 72 64 20  || usesWildcard 
1d030 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20  ) continue;...  
1d040 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74    /* Combine mat
1d050 63 68 69 6e 67 20 52 45 44 55 43 45 20 61 63 74  ching REDUCE act
1d060 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ions into a sing
1d070 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20  le default */.  
1d080 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1d090 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1d0a0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
1d0b0 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
1d0c0 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73  & ap->x.rp==rbes
1d0d0 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
1d0e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20  .    assert( ap 
1d0f0 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20  );.    ap->sp = 
1d100 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66  Symbol_new("{def
1d110 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72  ault}");.    for
1d120 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  (ap=ap->next; ap
1d130 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1d140 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1d150 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
1d160 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
1d170 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55  ap->type = NOT_U
1d180 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  SED;.    }.    s
1d190 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f  tp->ap = Action_
1d1a0 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20  sort(stp->ap);. 
1d1b0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   }.}.../*.** Com
1d1c0 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20  pare two states 
1d1d0 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
1d1e0 6f 73 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c  oses.  The small
1d1f0 65 72 20 73 74 61 74 65 20 69 73 20 74 68 65 0a  er state is the.
1d200 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  ** one with the 
1d210 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  most non-termina
1d220 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74  l actions.  If t
1d230 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
1d240 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e  e number.** of n
1d250 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69  on-terminal acti
1d260 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d  ons, then the sm
1d270 61 6c 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65  aller is the one
1d280 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a   with the most.*
1d290 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e  * token actions.
1d2a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1d2b0 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72  tateResortCompar
1d2c0 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c  e(const void *a,
1d2d0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b   const void *b){
1d2e0 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
1d2f0 73 74 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f  state *pA = *(co
1d300 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
1d310 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74  **)a;.  const st
1d320 72 75 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d  ruct state *pB =
1d330 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20   *(const struct 
1d340 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74  state**)b;.  int
1d350 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e   n;..  n = pB->n
1d360 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41  NtAct - pA->nNtA
1d370 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29  ct;.  if( n==0 )
1d380 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54  {.    n = pB->nT
1d390 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e  knAct - pA->nTkn
1d3a0 41 63 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Act;.  }.  retur
1d3b0 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  n n;.}.../*.** R
1d3c0 65 6e 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f  enumber and reso
1d3d0 72 74 20 73 74 61 74 65 73 20 73 6f 20 74 68 61  rt states so tha
1d3e0 74 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65  t states with fe
1d3f0 77 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f  wer choices.** o
1d400 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e  ccur at the end.
1d410 20 20 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73    Except, keep s
1d420 74 61 74 65 20 30 20 61 73 20 74 68 65 20 66 69  tate 0 as the fi
1d430 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f  rst state..*/.vo
1d440 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
1d450 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
1d460 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
1d470 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
1d480 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
1d490 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a  ct action *ap;..
1d4a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1d4b0 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
1d4c0 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1d4d0 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1d4e0 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73  stp->nTknAct = s
1d4f0 74 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a  tp->nNtAct = 0;.
1d500 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d      stp->iDflt =
1d510 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
1d520 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20  lemp->nrule;.   
1d530 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d   stp->iTknOfst =
1d540 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20   NO_OFFSET;.    
1d550 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e  stp->iNtOfst = N
1d560 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f  O_OFFSET;.    fo
1d570 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1d580 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1d590 20 20 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74        if( comput
1d5a0 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70  e_action(lemp,ap
1d5b0 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
1d5c0 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1d5d0 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
1d5e0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
1d5f0 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20  tp->nTknAct++;. 
1d600 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1d610 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c   ap->sp->index<l
1d620 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a  emp->nsymbol ){.
1d630 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e            stp->n
1d640 4e 74 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20  NtAct++;.       
1d650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d660 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63    stp->iDflt = c
1d670 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1d680 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
1d690 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1d6a0 0a 20 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65  .  }.  qsort(&le
1d6b0 6d 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c  mp->sorted[1], l
1d6c0 65 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73  emp->nstate-1, s
1d6d0 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74  izeof(lemp->sort
1d6e0 65 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20  ed[0]),.        
1d6f0 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61  stateResortCompa
1d700 72 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  re);.  for(i=0; 
1d710 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
1d720 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e  i++){.    lemp->
1d730 73 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65  sorted[i]->state
1d740 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a  num = i;.  }.}..
1d750 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1d760 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1d770 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  e "set.c" ******
1d780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1d7a0 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75  /*.** Set manipu
1d7b0 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  lation routines 
1d7c0 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
1d7d0 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
1d7e0 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
1d7f0 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74  ize = 0;../* Set
1d800 20 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f   the set size */
1d810 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28 6e 29  .void SetSize(n)
1d820 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69 7a 65  .int n;.{.  size
1d830 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c   = n+1;.}../* Al
1d840 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 74  locate a new set
1d850 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77   */.char *SetNew
1d860 28 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20  (){.  char *s;. 
1d870 20 69 6e 74 20 69 3b 0a 20 20 73 20 3d 20 28 63   int i;.  s = (c
1d880 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  har*)malloc( siz
1d890 65 20 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20  e );.  if( s==0 
1d8a0 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f  ){.    extern vo
1d8b0 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
1d8c0 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72  );.    memory_er
1d8d0 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  ror();.  }.  for
1d8e0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
1d8f0 2b 29 20 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  +) s[i] = 0;.  r
1d900 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44  eturn s;.}../* D
1d910 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20  eallocate a set 
1d920 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65 65 28  */.void SetFree(
1d930 73 29 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20 20  s).char *s;.{.  
1d940 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41  free(s);.}../* A
1d950 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
1d960 20 74 6f 20 74 68 65 20 73 65 74 2e 20 20 52 65   to the set.  Re
1d970 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1d980 20 65 6c 65 6d 65 6e 74 20 77 61 73 20 61 64 64   element was add
1d990 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20  ed.** and FALSE 
1d9a0 69 66 20 69 74 20 77 61 73 20 61 6c 72 65 61 64  if it was alread
1d9b0 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20  y there. */.int 
1d9c0 53 65 74 41 64 64 28 73 2c 65 29 0a 63 68 61 72  SetAdd(s,e).char
1d9d0 20 2a 73 3b 0a 69 6e 74 20 65 3b 0a 7b 0a 20 20   *s;.int e;.{.  
1d9e0 69 6e 74 20 72 76 3b 0a 20 20 72 76 20 3d 20 73  int rv;.  rv = s
1d9f0 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b  [e];.  s[e] = 1;
1da00 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d  .  return !rv;.}
1da10 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20 65  ../* Add every e
1da20 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f 20  lement of s2 to 
1da30 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  s1.  Return TRUE
1da40 20 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e 20   if s1 changes. 
1da50 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28  */.int SetUnion(
1da60 73 31 2c 73 32 29 0a 63 68 61 72 20 2a 73 31 3b  s1,s2).char *s1;
1da70 0a 63 68 61 72 20 2a 73 32 3b 0a 7b 0a 20 20 69  .char *s2;.{.  i
1da80 6e 74 20 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a  nt i, progress;.
1da90 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a    progress = 0;.
1daa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1dab0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  e; i++){.    if(
1dac0 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74   s2[i]==0 ) cont
1dad0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 31  inue;.    if( s1
1dae0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
1daf0 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  progress = 1;.  
1db00 20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20      s1[i] = 1;. 
1db10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1db20 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a  n progress;.}./*
1db30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db40 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1db50 69 6c 65 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a  ile "table.c" **
1db60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
1db80 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68  * All code in th
1db90 69 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  is file has been
1dba0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67   automatically g
1dbb0 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d  enerated.** from
1dbc0 20 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e   a specification
1dbd0 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   in the file.** 
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61               "ta
1dbf0 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65  ble.q".** by the
1dc00 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1dc10 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67  ay code building
1dc20 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22   program "aagen"
1dc30 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74  ..** Do not edit
1dc40 20 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73   this file!  Ins
1dc50 74 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73  tead, edit the s
1dc60 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20  pecification.** 
1dc70 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e  file, then rerun
1dc80 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a   aagen..*/./*.**
1dc90 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73   Code for proces
1dca0 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74  sing tables in t
1dcb0 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
1dcc0 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50  generator..*/..P
1dcd0 52 49 56 41 54 45 20 69 6e 74 20 73 74 72 68 61  RIVATE int strha
1dce0 73 68 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b  sh(x).char *x;.{
1dcf0 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20  .  int h = 0;.  
1dd00 77 68 69 6c 65 28 20 2a 78 29 20 68 20 3d 20 68  while( *x) h = h
1dd10 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20  *13 + *(x++);.  
1dd20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
1dd30 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64 75  Works like strdu
1dd40 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61 76  p, sort of.  Sav
1dd50 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d 61  e a string in ma
1dd60 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62  lloced memory, b
1dd70 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e  ut.** keep strin
1dd80 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 6f  gs in a table so
1dd90 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73   that the same s
1dda0 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20  tring is not in 
1ddb0 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65  more.** than one
1ddc0 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 68 61 72 20   place..*/.char 
1ddd0 2a 53 74 72 73 61 66 65 28 79 29 0a 63 68 61 72  *Strsafe(y).char
1dde0 20 2a 79 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 7a   *y;.{.  char *z
1ddf0 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20  ;..  if( y==0 ) 
1de00 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20  return 0;.  z = 
1de10 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b  Strsafe_find(y);
1de20 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28  .  if( z==0 && (
1de30 7a 3d 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e  z=malloc( strlen
1de40 28 79 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20  (y)+1 ))!=0 ){. 
1de50 20 20 20 73 74 72 63 70 79 28 7a 2c 79 29 3b 0a     strcpy(z,y);.
1de60 20 20 20 20 53 74 72 73 61 66 65 5f 69 6e 73 65      Strsafe_inse
1de70 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d  rt(z);.  }.  Mem
1de80 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72  oryCheck(z);.  r
1de90 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54  eturn z;.}../* T
1dea0 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
1deb0 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1dec0 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1ded0 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f  for each.** asso
1dee0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
1def0 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73   type "x1"..*/.s
1df00 74 72 75 63 74 20 73 5f 78 31 20 7b 0a 20 20 69  truct s_x1 {.  i
1df10 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
1df20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
1df30 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1df40 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20  e slots. */.    
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df60 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20        /*   Must 
1df70 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
1df80 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1df90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dfb0 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a    equal to 1 */.
1dfc0 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20    int count;    
1dfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1dfe0 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79  ber of currently
1dff0 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f   slots filled */
1e000 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
1e010 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65  de *tbl;  /* The
1e020 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72   data stored her
1e030 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  e */.  struct s_
1e040 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a  x1node **ht;  /*
1e050 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   Hash table for 
1e060 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f  lookups */.};../
1e070 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
1e080 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
1e090 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76  structure for ev
1e0a0 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ery data element
1e0b0 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69  .** in an associ
1e0c0 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
1e0d0 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70  ype "x1"..*/.typ
1e0e0 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 31  edef struct s_x1
1e0f0 6e 6f 64 65 20 7b 0a 20 20 63 68 61 72 20 2a 64  node {.  char *d
1e100 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1e110 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1e120 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  a */.  struct s_
1e130 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x1node *next;   
1e140 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
1e150 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
1e160 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1e170 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  1node **from;  /
1e180 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
1e190 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x1node;../*
1e1a0 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
1e1b0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1e1c0 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
1e1d0 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
1e1e0 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
1e1f0 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a  t s_x1 *x1a;../*
1e200 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1e210 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1e220 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66  y */.void Strsaf
1e230 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
1e240 78 31 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x1a ) return;.  
1e250 78 31 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x1a = (struct s_
1e260 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x1*)malloc( size
1e270 6f 66 28 73 74 72 75 63 74 20 73 5f 78 31 29 20  of(struct s_x1) 
1e280 29 3b 0a 20 20 69 66 28 20 78 31 61 20 29 7b 0a  );.  if( x1a ){.
1e290 20 20 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20      x1a->size = 
1e2a0 31 30 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63  1024;.    x1a->c
1e2b0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 31  ount = 0;.    x1
1e2c0 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65  a->tbl = (x1node
1e2d0 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20  *)malloc( .     
1e2e0 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29   (sizeof(x1node)
1e2f0 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
1e300 2a 29 29 2a 31 30 32 34 20 29 3b 0a 20 20 20 20  *))*1024 );.    
1e310 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20  if( x1a->tbl==0 
1e320 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 31  ){.      free(x1
1e330 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20  a);.      x1a = 
1e340 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1e350 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1e360 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f   x1a->ht = (x1no
1e370 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b  de**)&(x1a->tbl[
1e380 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  1024]);.      fo
1e390 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69  r(i=0; i<1024; i
1e3a0 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x1a->ht[i] =
1e3b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
1e3c0 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
1e3d0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
1e3e0 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
1e3f0 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
1e400 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
1e410 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
1e420 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
1e430 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72  itten */.int Str
1e440 73 61 66 65 5f 69 6e 73 65 72 74 28 64 61 74 61  safe_insert(data
1e450 29 0a 63 68 61 72 20 2a 64 61 74 61 3b 0a 7b 0a  ).char *data;.{.
1e460 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x1node *np;.  
1e470 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b  int h;.  int ph;
1e480 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29  ..  if( x1a==0 )
1e490 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20   return 0;.  ph 
1e4a0 3d 20 73 74 72 68 61 73 68 28 64 61 74 61 29 3b  = strhash(data);
1e4b0 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61  .  h = ph & (x1a
1e4c0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
1e4d0 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x1a->ht[h];.  
1e4e0 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
1e4f0 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
1e500 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b  data,data)==0 ){
1e510 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
1e520 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
1e530 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
1e540 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
1e550 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
1e560 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
1e570 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
1e580 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1e590 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
1e5a0 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
1e5b0 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d  x1a->count>=x1a-
1e5c0 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
1e5d0 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
1e5e0 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
1e5f0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
1e600 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
1e610 20 73 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20   s_x1 array;.   
1e620 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
1e630 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32  ze = x1a->size*2
1e640 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
1e650 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x1a->count;.
1e660 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
1e670 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x1node*)malloc(
1e680 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
1e690 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
1e6a0 78 31 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x1node*))*size )
1e6b0 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
1e6c0 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
1e6d0 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
1e6e0 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
1e6f0 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
1e700 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28  t = (x1node**)&(
1e710 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
1e720 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1e730 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
1e740 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
1e750 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d   for(i=0; i<x1a-
1e760 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
1e770 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e      x1node *oldn
1e780 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
1e790 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e   oldnp = &(x1a->
1e7a0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
1e7b0 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
1e7c0 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d  ->data) & (size-
1e7d0 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20  1);.      newnp 
1e7e0 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d  = &(array.tbl[i]
1e7f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72  );.      if( arr
1e800 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79  ay.ht[h] ) array
1e810 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  .ht[h]->from = &
1e820 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  (newnp->next);. 
1e830 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74       newnp->next
1e840 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a   = array.ht[h];.
1e850 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
1e860 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
1e870 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
1e880 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
1e890 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
1e8a0 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
1e8b0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
1e8c0 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  1a->tbl);.    *x
1e8d0 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  1a = array;.  }.
1e8e0 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
1e8f0 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
1e900 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a  = ph & (x1a->siz
1e910 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
1e920 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75  1a->tbl[x1a->cou
1e930 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61  nt++]);.  np->da
1e940 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28  ta = data;.  if(
1e950 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31   x1a->ht[h] ) x1
1e960 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  a->ht[h]->from =
1e970 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20   &(np->next);.  
1e980 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e  np->next = x1a->
1e990 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74  ht[h];.  x1a->ht
1e9a0 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e  [h] = np;.  np->
1e9b0 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74  from = &(x1a->ht
1e9c0 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  [h]);.  return 1
1e9d0 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
1e9e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
1e9f0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
1ea00 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74   given key.  Ret
1ea10 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e  urn NULL.** if n
1ea20 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63  o such key. */.c
1ea30 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e  har *Strsafe_fin
1ea40 64 28 6b 65 79 29 0a 63 68 61 72 20 2a 6b 65 79  d(key).char *key
1ea50 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ;.{.  int h;.  x
1ea60 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  1node *np;..  if
1ea70 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
1ea80 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61  n 0;.  h = strha
1ea90 73 68 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e  sh(key) & (x1a->
1eaa0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
1eab0 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x1a->ht[h];.  wh
1eac0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
1ead0 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61  f( strcmp(np->da
1eae0 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  ta,key)==0 ) bre
1eaf0 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
1eb00 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
1eb10 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
1eb20 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  a : 0;.}../* Ret
1eb30 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1eb40 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f   the (terminal o
1eb50 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73  r nonterminal) s
1eb60 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72  ymbol "x"..** Cr
1eb70 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
1eb80 6c 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  l if this is the
1eb90 20 66 69 72 73 74 20 74 69 6d 65 20 22 78 22 20   first time "x" 
1eba0 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a  has been seen..*
1ebb0 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
1ebc0 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 0a 63  *Symbol_new(x).c
1ebd0 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 73 74 72 75  har *x;.{.  stru
1ebe0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a  ct symbol *sp;..
1ebf0 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69    sp = Symbol_fi
1ec00 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70 3d  nd(x);.  if( sp=
1ec10 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28  =0 ){.    sp = (
1ec20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
1ec30 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
1ec40 74 72 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b  truct symbol) );
1ec50 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b  .    MemoryCheck
1ec60 28 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61  (sp);.    sp->na
1ec70 6d 65 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b  me = Strsafe(x);
1ec80 0a 20 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20  .    sp->type = 
1ec90 69 73 75 70 70 65 72 28 2a 78 29 20 3f 20 54 45  isupper(*x) ? TE
1eca0 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d  RMINAL : NONTERM
1ecb0 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75  INAL;.    sp->ru
1ecc0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  le = 0;.    sp->
1ecd0 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  fallback = 0;.  
1ece0 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b    sp->prec = -1;
1ecf0 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d  .    sp->assoc =
1ed00 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69   UNK;.    sp->fi
1ed10 72 73 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  rstset = 0;.    
1ed20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 42 5f 46  sp->lambda = B_F
1ed30 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65  ALSE;.    sp->de
1ed40 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20  structor = 0;.  
1ed50 20 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d    sp->datatype =
1ed60 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69   0;.    Symbol_i
1ed70 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d  nsert(sp,sp->nam
1ed80 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1ed90 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61   sp;.}../* Compa
1eda0 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66  re two symbols f
1edb0 6f 72 20 77 6f 72 6b 69 6e 67 20 70 75 72 70 6f  or working purpo
1edc0 73 65 73 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c  ses.**.** Symbol
1edd0 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1ede0 68 20 75 70 70 65 72 20 63 61 73 65 20 6c 65 74  h upper case let
1edf0 74 65 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20  ters (terminals 
1ee00 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75  or tokens).** mu
1ee10 73 74 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73  st sort before s
1ee20 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69  ymbols that begi
1ee30 6e 20 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73  n with lower cas
1ee40 65 20 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f  e letters.** (no
1ee50 6e 2d 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 4f  n-terminals).  O
1ee60 74 68 65 72 20 74 68 61 6e 20 74 68 61 74 2c 20  ther than that, 
1ee70 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e  the order does n
1ee80 6f 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  ot matter..**.**
1ee90 20 57 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d   We find experim
1eea0 65 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61  entally that lea
1eeb0 76 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73  ving the symbols
1eec0 20 69 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e   in their origin
1eed0 61 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65  al.** order (the
1eee0 20 6f 72 64 65 72 20 74 68 65 79 20 61 70 70 65   order they appe
1eef0 61 72 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d  ared in the gram
1ef00 6d 61 72 20 66 69 6c 65 29 20 67 69 76 65 73 20  mar file) gives 
1ef10 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20  the.** smallest 
1ef20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e  parser tables in
1ef30 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20   SQLite..*/.int 
1ef40 53 79 6d 62 6f 6c 63 6d 70 70 28 73 74 72 75 63  Symbolcmpp(struc
1ef50 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 2c 20 73 74  t symbol **a, st
1ef60 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 62 29  ruct symbol **b)
1ef70 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 28 2a 2a  {.  int i1 = (**
1ef80 61 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30  a).index + 10000
1ef90 30 30 30 2a 28 28 2a 2a 61 29 2e 6e 61 6d 65 5b  000*((**a).name[
1efa0 30 5d 3e 27 5a 27 29 3b 0a 20 20 69 6e 74 20 69  0]>'Z');.  int i
1efb0 32 20 3d 20 28 2a 2a 62 29 2e 69 6e 64 65 78 20  2 = (**b).index 
1efc0 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a 62  + 10000000*((**b
1efd0 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a  ).name[0]>'Z');.
1efe0 20 20 72 65 74 75 72 6e 20 69 31 2d 69 32 3b 0a    return i1-i2;.
1eff0 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
1f000 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1f010 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1f020 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
1f030 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
1f040 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32  rray of type "x2
1f050 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
1f060 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  2 {.  int size; 
1f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f080 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
1f090 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
1f0a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f0c0 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
1f0d0 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
1f0e0 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
1f110 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
1f120 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1f130 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
1f140 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
1f150 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
1f160 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x2node *tbl; 
1f170 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
1f180 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
1f190 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a  ruct s_x2node **
1f1a0 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
1f1b0 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
1f1c0 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
1f1d0 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1f1e0 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1f1f0 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
1f200 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
1f210 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1f220 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e  ay of type "x2".
1f230 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1f240 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20  ct s_x2node {.  
1f250 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
1f260 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1f270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1f280 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6b 65 79  a */.  char *key
1f290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f2a0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
1f2b0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
1f2c0 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
1f2d0 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
1f2e0 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
1f2f0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
1f300 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
1f310 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
1f320 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x2node;../* Th
1f330 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
1f340 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1f350 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
1f360 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
1f370 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
1f380 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c  _x2 *x2a;../* Al
1f390 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
1f3a0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
1f3b0 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e  /.void Symbol_in
1f3c0 69 74 28 29 7b 0a 20 20 69 66 28 20 78 32 61 20  it(){.  if( x2a 
1f3d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20  ) return;.  x2a 
1f3e0 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29  = (struct s_x2*)
1f3f0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
1f400 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20  truct s_x2) );. 
1f410 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20   if( x2a ){.    
1f420 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x2a->size = 128;
1f430 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20  .    x2a->count 
1f440 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62  = 0;.    x2a->tb
1f450 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c  l = (x2node*)mal
1f460 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a  loc( .      (siz
1f470 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69  eof(x2node) + si
1f480 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 31  zeof(x2node*))*1
1f490 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 32  28 );.    if( x2
1f4a0 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
1f4b0 20 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20     free(x2a);.  
1f4c0 20 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20      x2a = 0;.   
1f4d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1f4e0 74 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e  t i;.      x2a->
1f4f0 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26  ht = (x2node**)&
1f500 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b  (x2a->tbl[128]);
1f510 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1f520 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d  i<128; i++) x2a-
1f530 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
1f540 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
1f550 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
1f560 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
1f570 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
1f580 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
1f590 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
1f5a0 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
1f5b0 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
1f5c0 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
1f5d0 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72  rt(data,key).str
1f5e0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
1f5f0 3b 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20  ;.char *key;.{. 
1f600 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x2node *np;.  i
1f610 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
1f620 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
1f630 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
1f640 20 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20   strhash(key);. 
1f650 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e   h = ph & (x2a->
1f660 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
1f670 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
1f680 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
1f690 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
1f6a0 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  y,key)==0 ){.   
1f6b0 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
1f6c0 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
1f6d0 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
1f6e0 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
1f6f0 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
1f700 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
1f710 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
1f720 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1f730 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
1f740 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d  ;.  }.  if( x2a-
1f750 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a  >count>=x2a->siz
1f760 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
1f770 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
1f780 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
1f790 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
1f7a0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
1f7b0 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  2 array;.    arr
1f7c0 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
1f7d0 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x2a->size*2;.  
1f7e0 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
1f7f0 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x2a->count;.    
1f800 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e  array.tbl = (x2n
1f810 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20  ode*)malloc(.   
1f820 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64     (sizeof(x2nod
1f830 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f  e) + sizeof(x2no
1f840 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20  de*))*size );.  
1f850 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
1f860 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1f870 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
1f880 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
1f890 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
1f8a0 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x2node**)&(arra
1f8b0 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20  y.tbl[size]);.  
1f8c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1f8d0 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
1f8e0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
1f8f0 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f 75  (i=0; i<x2a->cou
1f900 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
1f910 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x2node *oldnp, *
1f920 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
1f930 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b  np = &(x2a->tbl[
1f940 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73  i]);.      h = s
1f950 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65  trhash(oldnp->ke
1f960 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20  y) & (size-1);. 
1f970 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
1f980 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
1f990 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
1f9a0 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
1f9b0 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
1f9c0 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
1f9d0 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
1f9e0 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
1f9f0 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c   newnp->key = ol
1fa00 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20  dnp->key;.      
1fa10 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
1fa20 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
1fa30 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
1fa40 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
1fa50 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
1fa60 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
1fa70 20 20 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62      free(x2a->tb
1fa80 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61  l);.    *x2a = a
1fa90 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
1faa0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
1fab0 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
1fac0 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
1fad0 20 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62    np = &(x2a->tb
1fae0 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x2a->count++])
1faf0 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65  ;.  np->key = ke
1fb00 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  y;.  np->data = 
1fb10 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d  data;.  if( x2a-
1fb20 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74  >ht[h] ) x2a->ht
1fb30 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
1fb40 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
1fb50 65 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d  ext = x2a->ht[h]
1fb60 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x2a->ht[h] =
1fb70 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
1fb80 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x2a->ht[h]);
1fb90 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1fba0 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
1fbb0 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
1fbc0 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
1fbd0 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
1fbe0 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
1fbf0 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74  h key. */.struct
1fc00 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
1fc10 66 69 6e 64 28 6b 65 79 29 0a 63 68 61 72 20 2a  find(key).char *
1fc20 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key;.{.  int h;.
1fc30 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x2node *np;.. 
1fc40 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
1fc50 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74  turn 0;.  h = st
1fc60 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 32  rhash(key) & (x2
1fc70 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1fc80 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
1fc90 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
1fca0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
1fcb0 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62  >key,key)==0 ) b
1fcc0 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
1fcd0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
1fce0 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
1fcf0 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
1fd00 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20 64  eturn the n-th d
1fd10 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ata.  Return NUL
1fd20 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f 66  L if n is out of
1fd30 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63   range. */.struc
1fd40 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
1fd50 5f 4e 74 68 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  _Nth(n).int n;.{
1fd60 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1fd70 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32   *data;.  if( x2
1fd80 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78  a && n>0 && n<=x
1fd90 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20  2a->count ){.   
1fda0 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c   data = x2a->tbl
1fdb0 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65  [n-1].data;.  }e
1fdc0 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20  lse{.    data = 
1fdd0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1fde0 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  data;.}../* Retu
1fdf0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
1fe00 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20  he array */.int 
1fe10 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b  Symbol_count().{
1fe20 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f 20  .  return x2a ? 
1fe30 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a  x2a->count : 0;.
1fe40 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
1fe50 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
1fe60 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e  s to all data in
1fe70 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54   the table..** T
1fe80 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
1fe90 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
1fea0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1feb0 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
1fec0 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c  ion.** problems,
1fed0 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79   or if the array
1fee0 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74   is empty. */.st
1fef0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79  ruct symbol **Sy
1ff00 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b  mbol_arrayof().{
1ff10 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1ff20 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20   **array;.  int 
1ff30 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 32  i,size;.  if( x2
1ff40 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1ff50 0a 20 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 63  .  size = x2a->c
1ff60 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
1ff70 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
1ff80 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
1ff90 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
1ffa0 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  )*size );.  if( 
1ffb0 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72  array ){.    for
1ffc0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
1ffd0 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 32  +) array[i] = x2
1ffe0 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a  a->tbl[i].data;.
1fff0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72    }.  return arr
20000 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72  ay;.}../* Compar
20010 65 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61 74  e two configurat
20020 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66  ions */.int Conf
20030 69 67 63 6d 70 28 61 2c 62 29 0a 73 74 72 75 63  igcmp(a,b).struc
20040 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72  t config *a;.str
20050 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b  uct config *b;.{
20060 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20  .  int x;.  x = 
20070 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62  a->rp->index - b
20080 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69  ->rp->index;.  i
20090 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d  f( x==0 ) x = a-
200a0 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20  >dot - b->dot;. 
200b0 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a   return x;.}../*
200c0 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61   Compare two sta
200d0 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20 69  tes */.PRIVATE i
200e0 6e 74 20 73 74 61 74 65 63 6d 70 28 61 2c 62 29  nt statecmp(a,b)
200f0 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
20100 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a;.struct config
20110 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 72 63 3b   *b;.{.  int rc;
20120 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d  .  for(rc=0; rc=
20130 3d 30 20 26 26 20 61 20 26 26 20 62 3b 20 20 61  =0 && a && b;  a
20140 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29  =a->bp, b=b->bp)
20150 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70  {.    rc = a->rp
20160 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d  ->index - b->rp-
20170 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  >index;.    if( 
20180 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e  rc==0 ) rc = a->
20190 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20  dot - b->dot;.  
201a0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
201b0 0a 20 20 20 20 69 66 28 20 61 20 29 20 72 63 20  .    if( a ) rc 
201c0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29  = 1;.    if( b )
201d0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20   rc = -1;.  }.  
201e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
201f0 20 48 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f   Hash a state */
20200 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61  .PRIVATE int sta
20210 74 65 68 61 73 68 28 61 29 0a 73 74 72 75 63 74  tehash(a).struct
20220 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20   config *a;.{.  
20230 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65  int h=0;.  while
20240 28 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68  ( a ){.    h = h
20250 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e  *571 + a->rp->in
20260 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b  dex*37 + a->dot;
20270 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a  .    a = a->bp;.
20280 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a    }.  return h;.
20290 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  }../* Allocate a
202a0 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63   new state struc
202b0 74 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73  ture */.struct s
202c0 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28  tate *State_new(
202d0 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ).{.  struct sta
202e0 74 65 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d  te *new;.  new =
202f0 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
20300 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
20310 73 74 72 75 63 74 20 73 74 61 74 65 29 20 29 3b  struct state) );
20320 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e  .  MemoryCheck(n
20330 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ew);.  return ne
20340 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  w;.}../* There i
20350 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
20360 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
20370 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
20380 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
20390 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
203a0 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x3"..*/.struct 
203b0 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x3 {.  int siz
203c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
203d0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
203e0 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
203f0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20410 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
20420 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
20430 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20450 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
20460 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
20470 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
20480 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20490 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
204a0 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
204b0 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74 62  uct s_x3node *tb
204c0 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
204d0 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
204e0 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
204f0 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
20500 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
20510 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
20520 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
20530 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
20540 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
20550 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
20560 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
20570 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
20580 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  3"..*/.typedef s
20590 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 7b  truct s_x3node {
205a0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
205b0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
205c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
205d0 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
205e0 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20 20  config *key;    
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20600 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73  * The key */.  s
20610 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
20620 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
20630 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
20640 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
20650 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a  ruct s_x3node **
20660 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
20670 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e  us link */.} x3n
20680 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
20690 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
206a0 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
206b0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
206c0 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
206d0 69 63 20 73 74 72 75 63 74 20 73 5f 78 33 20 2a  ic struct s_x3 *
206e0 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x3a;../* Allocat
206f0 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
20700 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
20710 64 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b 0a  d State_init(){.
20720 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74 75    if( x3a ) retu
20730 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74 72  rn;.  x3a = (str
20740 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63  uct s_x3*)malloc
20750 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
20760 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x3) );.  if( x
20770 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73  3a ){.    x3a->s
20780 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78  ize = 128;.    x
20790 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  3a->count = 0;. 
207a0 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78     x3a->tbl = (x
207b0 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a  3node*)malloc( .
207c0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 33        (sizeof(x3
207d0 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
207e0 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a  3node*))*128 );.
207f0 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c      if( x3a->tbl
20800 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
20810 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33  e(x3a);.      x3
20820 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
20830 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
20840 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28       x3a->ht = (
20850 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e  x3node**)&(x3a->
20860 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20  tbl[128]);.     
20870 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b   for(i=0; i<128;
20880 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d   i++) x3a->ht[i]
20890 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
208a0 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
208b0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
208c0 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
208d0 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
208e0 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
208f0 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
20900 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
20910 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
20920 74 61 74 65 5f 69 6e 73 65 72 74 28 64 61 74 61  tate_insert(data
20930 2c 6b 65 79 29 0a 73 74 72 75 63 74 20 73 74 61  ,key).struct sta
20940 74 65 20 2a 64 61 74 61 3b 0a 73 74 72 75 63 74  te *data;.struct
20950 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a   config *key;.{.
20960 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x3node *np;.  
20970 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b  int h;.  int ph;
20980 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29  ..  if( x3a==0 )
20990 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20   return 0;.  ph 
209a0 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29  = statehash(key)
209b0 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33  ;.  h = ph & (x3
209c0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
209d0 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
209e0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
209f0 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e    if( statecmp(n
20a00 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
20a10 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
20a20 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
20a30 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
20a40 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
20a50 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
20a60 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
20a70 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
20a80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
20a90 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
20aa0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
20ab0 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61   x3a->count>=x3a
20ac0 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
20ad0 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
20ae0 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
20af0 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
20b00 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  ,size;.    struc
20b10 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20 20  t s_x3 array;.  
20b20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73    array.size = s
20b30 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a 65 2a  ize = x3a->size*
20b40 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
20b50 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b  nt = x3a->count;
20b60 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
20b70 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x3node*)malloc
20b80 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28  (.      (sizeof(
20b90 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x3node) + sizeof
20ba0 28 78 33 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20  (x3node*))*size 
20bb0 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
20bc0 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
20bd0 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
20be0 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
20bf0 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
20c00 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26  ht = (x3node**)&
20c10 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d  (array.tbl[size]
20c20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
20c30 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  i<size; i++) arr
20c40 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
20c50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 33 61    for(i=0; i<x3a
20c60 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
20c70 20 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f 6c 64       x3node *old
20c80 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
20c90 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33 61 2d    oldnp = &(x3a-
20ca0 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
20cb0 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6f 6c  h = statehash(ol
20cc0 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a  dnp->key) & (siz
20cd0 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
20ce0 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
20cf0 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
20d00 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
20d10 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
20d20 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
20d30 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
20d40 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
20d50 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
20d60 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
20d70 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
20d80 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
20d90 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
20da0 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
20db0 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
20dc0 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
20dd0 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
20de0 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x3a->tbl);.    *
20df0 78 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x3a = array;.  }
20e00 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
20e10 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
20e20 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69   = ph & (x3a->si
20e30 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
20e40 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f  x3a->tbl[x3a->co
20e50 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
20e60 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
20e70 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
20e80 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x3a->ht[h] ) 
20e90 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x3a->ht[h]->from
20ea0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
20eb0 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61    np->next = x3a
20ec0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e  ->ht[h];.  x3a->
20ed0 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
20ee0 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e  ->from = &(x3a->
20ef0 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
20f00 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
20f10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
20f20 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
20f30 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
20f40 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
20f50 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
20f60 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53  .struct state *S
20f70 74 61 74 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73  tate_find(key).s
20f80 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
20f90 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  y;.{.  int h;.  
20fa0 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69  x3node *np;..  i
20fb0 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
20fc0 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61 74  rn 0;.  h = stat
20fd0 65 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 33  ehash(key) & (x3
20fe0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
20ff0 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
21000 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
21010 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e    if( statecmp(n
21020 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
21030 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
21040 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
21050 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
21060 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
21070 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79   Return an array
21080 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
21090 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20  all data in the 
210a0 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72  table..** The ar
210b0 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ray is obtained 
210c0 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65  from malloc.  Re
210d0 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d  turn NULL if mem
210e0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
210f0 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69  * problems, or i
21100 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65  f the array is e
21110 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20  mpty. */.struct 
21120 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72  state **State_ar
21130 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75  rayof().{.  stru
21140 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61 79  ct state **array
21150 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a  ;.  int i,size;.
21160 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72    if( x3a==0 ) r
21170 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20  eturn 0;.  size 
21180 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x3a->count;.  
21190 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20  array = (struct 
211a0 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63 28  state **)malloc(
211b0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
211c0 74 61 74 65 20 2a 29 2a 73 69 7a 65 20 29 3b 0a  tate *)*size );.
211d0 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20    if( array ){. 
211e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
211f0 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69  ze; i++) array[i
21200 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e  ] = x3a->tbl[i].
21210 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75  data;.  }.  retu
21220 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20  rn array;.}../* 
21230 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72 61  Hash a configura
21240 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
21250 69 6e 74 20 63 6f 6e 66 69 67 68 61 73 68 28 61  int confighash(a
21260 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
21270 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b  *a;.{.  int h=0;
21280 0a 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61  .  h = h*571 + a
21290 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b  ->rp->index*37 +
212a0 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72   a->dot;.  retur
212b0 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65  n h;.}../* There
212c0 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
212d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
212e0 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
212f0 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
21300 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
21310 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x4"..*/.struc
21320 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73  t s_x4 {.  int s
21330 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
21340 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
21350 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
21360 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
21390 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
213a0 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
213d0 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
213e0 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
213f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21400 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
21410 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
21420 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
21430 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
21440 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
21450 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
21460 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
21470 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
21480 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
21490 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
214a0 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
214b0 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
214c0 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
214d0 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
214e0 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
214f0 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x4"..*/.typedef
21500 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
21510 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
21520 69 67 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ig *data;       
21530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21540 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
21550 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78  ct s_x4node *nex
21560 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
21570 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
21580 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
21590 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x4node **fro
215a0 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
215b0 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65  link */.} x4node
215c0 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
215d0 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
215e0 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
215f0 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
21600 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
21610 73 74 72 75 63 74 20 73 5f 78 34 20 2a 78 34 61  struct s_x4 *x4a
21620 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
21630 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
21640 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43   array */.void C
21650 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28  onfigtable_init(
21660 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20 72  ){.  if( x4a ) r
21670 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28  eturn;.  x4a = (
21680 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c  struct s_x4*)mal
21690 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
216a0 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69 66  ct s_x4) );.  if
216b0 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34 61  ( x4a ){.    x4a
216c0 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20  ->size = 64;.   
216d0 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x4a->count = 0;
216e0 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20  .    x4a->tbl = 
216f0 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x4node*)malloc(
21700 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28   .      (sizeof(
21710 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x4node) + sizeof
21720 28 78 34 6e 6f 64 65 2a 29 29 2a 36 34 20 29 3b  (x4node*))*64 );
21730 0a 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74 62  .    if( x4a->tb
21740 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
21750 65 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20 78  ee(x4a);.      x
21760 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  4a = 0;.    }els
21770 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
21780 20 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d 20        x4a->ht = 
21790 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d  (x4node**)&(x4a-
217a0 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20  >tbl[64]);.     
217b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20   for(i=0; i<64; 
217c0 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20  i++) x4a->ht[i] 
217d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
217e0 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
217f0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
21800 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
21810 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
21820 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
21830 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
21840 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
21850 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f  ritten */.int Co
21860 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
21870 28 64 61 74 61 29 0a 73 74 72 75 63 74 20 63 6f  (data).struct co
21880 6e 66 69 67 20 2a 64 61 74 61 3b 0a 7b 0a 20 20  nfig *data;.{.  
21890 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e  x4node *np;.  in
218a0 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a  t h;.  int ph;..
218b0 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72    if( x4a==0 ) r
218c0 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
218d0 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61 29  confighash(data)
218e0 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 34  ;.  h = ph & (x4
218f0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
21900 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
21910 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
21920 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
21930 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d  np->data,data)==
21940 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
21950 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
21960 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
21970 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
21980 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
21990 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
219a0 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
219b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
219c0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
219d0 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
219e0 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x4a->count>=
219f0 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x4a->size ){.   
21a00 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
21a10 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
21a20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
21a30 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74  t i,size;.    st
21a40 72 75 63 74 20 73 5f 78 34 20 61 72 72 61 79 3b  ruct s_x4 array;
21a50 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
21a60 3d 20 73 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69  = size = x4a->si
21a70 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
21a80 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75  count = x4a->cou
21a90 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
21aa0 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c  l = (x4node*)mal
21ab0 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65  loc(.      (size
21ac0 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x4node) + siz
21ad0 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 73 69  eof(x4node*))*si
21ae0 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72  ze );.    if( ar
21af0 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
21b00 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
21b10 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
21b20 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
21b30 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a  ay.ht = (x4node*
21b40 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
21b50 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
21b60 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
21b70 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
21b80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21b90 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x4a->count; i++)
21ba0 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20 2a  {.      x4node *
21bb0 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
21bc0 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
21bd0 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  4a->tbl[i]);.   
21be0 20 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73     h = confighas
21bf0 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26  h(oldnp->data) &
21c00 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
21c10 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
21c20 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
21c30 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
21c40 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
21c50 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
21c60 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
21c70 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
21c80 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
21c90 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70  np->data = oldnp
21ca0 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65  ->data;.      ne
21cb0 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72  wnp->from = &(ar
21cc0 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20  ray.ht[h]);.    
21cd0 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20    array.ht[h] = 
21ce0 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20  newnp;.    }.   
21cf0 20 66 72 65 65 28 78 34 61 2d 3e 74 62 6c 29 3b   free(x4a->tbl);
21d00 0a 20 20 20 20 2a 78 34 61 20 3d 20 61 72 72 61  .    *x4a = arra
21d10 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65  y;.  }.  /* Inse
21d20 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20  rt the new data 
21d30 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  */.  h = ph & (x
21d40 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
21d50 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 78  p = &(x4a->tbl[x
21d60 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20  4a->count++]);. 
21d70 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
21d80 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e 68 74 5b  ;.  if( x4a->ht[
21d90 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d 2d  h] ) x4a->ht[h]-
21da0 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
21db0 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
21dc0 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x4a->ht[h];.  
21dd0 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x4a->ht[h] = np;
21de0 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
21df0 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x4a->ht[h]);.  r
21e00 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
21e10 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
21e20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
21e30 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
21e40 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
21e50 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
21e60 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  y. */.struct con
21e70 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65  fig *Configtable
21e80 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74 72 75 63  _find(key).struc
21e90 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b  t config *key;.{
21ea0 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f  .  int h;.  x4no
21eb0 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
21ec0 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  4a==0 ) return 0
21ed0 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61  ;.  h = configha
21ee0 73 68 28 6b 65 79 29 20 26 20 28 78 34 61 2d 3e  sh(key) & (x4a->
21ef0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
21f00 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x4a->ht[h];.  wh
21f10 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
21f20 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d  f( Configcmp(np-
21f30 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20  >data,key)==0 ) 
21f40 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
21f50 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
21f60 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
21f70 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
21f80 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20  Remove all data 
21f90 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20  from the table. 
21fa0 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61 20   Pass each data 
21fb0 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
21fc0 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73 20  "f".** as it is 
21fd0 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20 6d  removed.  ("f" m
21fe0 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76  ay be null to av
21ff0 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29 20  oid this step.) 
22000 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  */.void Configta
22010 62 6c 65 5f 63 6c 65 61 72 28 66 29 0a 69 6e 74  ble_clear(f).int
22020 28 2a 66 29 28 2f 2a 20 73 74 72 75 63 74 20 63  (*f)(/* struct c
22030 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 7b 0a 20  onfig * */);.{. 
22040 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 78 34   int i;.  if( x4
22050 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f 75  a==0 || x4a->cou
22060 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  nt==0 ) return;.
22070 20 20 69 66 28 20 66 20 29 20 66 6f 72 28 69 3d    if( f ) for(i=
22080 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b  0; i<x4a->count;
22090 20 69 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d 3e   i++) (*f)(x4a->
220a0 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20 20  tbl[i].data);.  
220b0 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e  for(i=0; i<x4a->
220c0 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d 3e  size; i++) x4a->
220d0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34 61  ht[i] = 0;.  x4a
220e0 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 72  ->count = 0;.  r
220f0 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.