/ Hex Artifact Content
Login

Artifact d3dff81e31c459dd18784d024a759b7229f66297:


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 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
19950 20 22 23 69 66 6e 64 65 66 20 59 59 53 54 41 43   "#ifndef YYSTAC
19960 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65  KDEPTH\n"); line
19970 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
19980 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20  ->stacksize ){. 
19990 20 20 20 69 66 28 20 61 74 6f 69 28 6c 65 6d 70     if( atoi(lemp
199a0 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3c 3d 30 20  ->stacksize)<=0 
199b0 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73  ){.      ErrorMs
199c0 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
199d0 2c 30 2c 0a 22 49 6c 6c 65 67 61 6c 20 73 74 61  ,0,."Illegal sta
199e0 63 6b 20 73 69 7a 65 3a 20 5b 25 73 5d 2e 20 20  ck size: [%s].  
199f0 54 68 65 20 73 74 61 63 6b 20 73 69 7a 65 20 73  The stack size s
19a00 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
19a10 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e 22 2c 0a  ger constant.",.
19a20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 73 74          lemp->st
19a30 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  acksize);.      
19a40 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
19a50 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 73 74  ;.      lemp->st
19a60 61 63 6b 73 69 7a 65 20 3d 20 22 31 30 30 22 3b  acksize = "100";
19a70 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
19a80 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
19a90 59 59 53 54 41 43 4b 44 45 50 54 48 20 25 73 5c  YYSTACKDEPTH %s\
19aa0 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69  n",lemp->stacksi
19ab0 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ze);  lineno++;.
19ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
19ad0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
19ae0 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 31  e YYSTACKDEPTH 1
19af0 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b  00\n");  lineno+
19b00 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
19b10 28 6f 75 74 2c 20 22 23 65 6e 64 69 66 5c 6e 22  (out, "#endif\n"
19b20 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ); lineno++;.  i
19b30 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
19b40 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
19b50 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
19b60 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
19b70 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61   name = lemp->na
19b80 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me ? lemp->name 
19b90 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69 66 28  : "Parse";.  if(
19ba0 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20 6c 65   lemp->arg && le
19bb0 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a 20 20  mp->arg[0] ){.  
19bc0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 20 3d    int i;.    i =
19bd0 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72   strlen(lemp->ar
19be0 67 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  g);.    while( i
19bf0 3e 3d 31 20 26 26 20 69 73 73 70 61 63 65 28 6c  >=1 && isspace(l
19c00 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29  emp->arg[i-1]) )
19c10 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28   i--;.    while(
19c20 20 69 3e 3d 31 20 26 26 20 28 69 73 61 6c 6e 75   i>=1 && (isalnu
19c30 6d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  m(lemp->arg[i-1]
19c40 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69  ) || lemp->arg[i
19c50 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b  -1]=='_') ) i--;
19c60 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
19c70 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
19c80 53 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d  SDECL %s;\n",nam
19c90 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c  e,lemp->arg);  l
19ca0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
19cb0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
19cc0 65 20 25 73 41 52 47 5f 50 44 45 43 4c 20 2c 25  e %sARG_PDECL ,%
19cd0 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  s\n",name,lemp->
19ce0 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  arg);  lineno++;
19cf0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
19d00 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
19d10 46 45 54 43 48 20 25 73 20 3d 20 79 79 70 50 61  FETCH %s = yypPa
19d20 72 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20  rser->%s\n",.   
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
19d40 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65  me,lemp->arg,&le
19d50 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69  mp->arg[i]);  li
19d60 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
19d70 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
19d80 20 25 73 41 52 47 5f 53 54 4f 52 45 20 79 79 70   %sARG_STORE yyp
19d90 50 61 72 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c  Parser->%s = %s\
19da0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
19db0 20 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d       name,&lemp-
19dc0 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61  >arg[i],&lemp->a
19dd0 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  rg[i]);  lineno+
19de0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
19df0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
19e00 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c  fine %sARG_SDECL
19e10 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65  \n",name);  line
19e20 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
19e30 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
19e40 73 41 52 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61  sARG_PDECL\n",na
19e50 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  me);  lineno++;.
19e60 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19e70 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46  "#define %sARG_F
19e80 45 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  ETCH\n",name); l
19e90 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
19ea0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
19eb0 65 20 25 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22  e %sARG_STORE\n"
19ec0 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
19ed0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c  ;.  }.  if( mhfl
19ee0 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ag ){.    fprint
19ef0 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
19f00 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
19f10 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19f20 23 64 65 66 69 6e 65 20 59 59 4e 53 54 41 54 45  #define YYNSTATE
19f30 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74   %d\n",lemp->nst
19f40 61 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ate);  lineno++;
19f50 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19f60 23 64 65 66 69 6e 65 20 59 59 4e 52 55 4c 45 20  #define YYNRULE 
19f70 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c  %d\n",lemp->nrul
19f80 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
19f90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
19fa0 65 66 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d  efine YYERRORSYM
19fb0 42 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  BOL %d\n",lemp->
19fc0 65 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20  errsym->index); 
19fd0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
19fe0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
19ff0 65 20 59 59 45 52 52 53 59 4d 44 54 20 79 79 25  e YYERRSYMDT yy%
1a000 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  d\n",lemp->errsy
1a010 6d 2d 3e 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65  m->dtnum);  line
1a020 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1a030 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29  ->has_fallback )
1a040 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1a050 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46 41 4c  t,"#define YYFAL
1a060 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69  LBACK 1\n");  li
1a070 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
1a080 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1a090 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1a0a0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1a0b0 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  te the action ta
1a0c0 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f  ble and its asso
1a0d0 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ciates:.  **.  *
1a0e0 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20  *  yy_action[]  
1a0f0 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74        A single t
1a100 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1a110 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  all actions..  *
1a120 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  *  yy_lookahead[
1a130 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f  ]     A table co
1a140 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f  ntaining the loo
1a150 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63 68 20  kahead for each 
1a160 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20  entry in.  **   
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a180 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73    yy_action.  Us
1a190 65 64 20 74 6f 20 64 65 74 65 63 74 20 68 61 73  ed to detect has
1a1a0 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20  h collisions..  
1a1b0 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73  **  yy_shift_ofs
1a1c0 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20  t[]    For each 
1a1d0 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65  state, the offse
1a1e0 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e  t into yy_action
1a1f0 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20   for.  **       
1a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
1a210 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73  ifting terminals
1a220 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63  ..  **  yy_reduc
1a230 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65  e_ofst[]   For e
1a240 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f  ach state, the o
1a250 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63  ffset into yy_ac
1a260 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20  tion for.  **   
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a280 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74    shifting non-t
1a290 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61  erminals after a
1a2a0 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79   reduce..  **  y
1a2b0 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20  y_default[]     
1a2c0 20 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e    Default action
1a2d0 20 66 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e   for each state.
1a2e0 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  .  */..  /* Comp
1a2f0 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 73 20  ute the actions 
1a300 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e  on all states an
1a310 64 20 63 6f 75 6e 74 20 74 68 65 6d 20 75 70 20  d count them up 
1a320 2a 2f 0a 20 20 61 78 20 3d 20 6d 61 6c 6c 6f 63  */.  ax = malloc
1a330 28 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2a  ( sizeof(ax[0])*
1a340 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 20 29  lemp->nstate*2 )
1a350 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b  ;.  if( ax==0 ){
1a360 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1a370 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
1a380 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ed\n");.    exit
1a390 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (1);.  }.  for(i
1a3a0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
1a3b0 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
1a3c0 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1a3d0 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  [i];.    ax[i*2]
1a3e0 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20  .stp = stp;.    
1a3f0 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20  ax[i*2].isTkn = 
1a400 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e  1;.    ax[i*2].n
1a410 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54  Action = stp->nT
1a420 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a  knAct;.    ax[i*
1a430 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a  2+1].stp = stp;.
1a440 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73      ax[i*2+1].is
1a450 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b  Tkn = 0;.    ax[
1a460 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d  i*2+1].nAction =
1a470 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20   stp->nNtAct;.  
1a480 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20  }.  mxTknOfst = 
1a490 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20  mnTknOfst = 0;. 
1a4a0 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74   mxNtOfst = mnNt
1a4b0 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Ofst = 0;..  /* 
1a4c0 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69  Compute the acti
1a4d0 6f 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 72  on table.  In or
1a4e0 64 65 72 20 74 6f 20 74 72 79 20 74 6f 20 6b 65  der to try to ke
1a4f0 65 70 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ep the size of t
1a500 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f 6e 20 74  he.  ** action t
1a510 61 62 6c 65 20 74 6f 20 61 20 6d 69 6e 69 6d 75  able to a minimu
1a520 6d 2c 20 74 68 65 20 68 65 75 72 69 73 74 69 63  m, the heuristic
1a530 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20   of placing the 
1a540 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e 0a 20  largest action. 
1a550 20 2a 2a 20 73 65 74 73 20 66 69 72 73 74 20 69   ** sets first i
1a560 73 20 75 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 71  s used..  */.  q
1a570 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e  sort(ax, lemp->n
1a580 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28  state*2, sizeof(
1a590 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63 6f  ax[0]), axset_co
1a5a0 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74 61  mpare);.  pActta
1a5b0 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63  b = acttab_alloc
1a5c0 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ();.  for(i=0; i
1a5d0 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 20  <lemp->nstate*2 
1a5e0 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e  && ax[i].nAction
1a5f0 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  >0; i++){.    st
1a600 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20  p = ax[i].stp;. 
1a610 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73 54     if( ax[i].isT
1a620 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  kn ){.      for(
1a630 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
1a640 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1a650 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e        int action
1a660 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
1a670 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d  ->sp->index>=lem
1a680 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63  p->nterminal ) c
1a690 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1a6a0 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74   action = comput
1a6b0 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61  e_action(lemp, a
1a6c0 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
1a6d0 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69  action<0 ) conti
1a6e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
1a6f0 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74  tab_action(pActt
1a700 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  ab, ap->sp->inde
1a710 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  x, action);.    
1a720 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69    }.      stp->i
1a730 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61 62  TknOfst = acttab
1a740 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62 29  _insert(pActtab)
1a750 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
1a760 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f  >iTknOfst<mnTknO
1a770 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74 20  fst ) mnTknOfst 
1a780 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
1a790 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e  .      if( stp->
1a7a0 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66  iTknOfst>mxTknOf
1a7b0 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20 3d  st ) mxTknOfst =
1a7c0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a   stp->iTknOfst;.
1a7d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a7e0 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1a7f0 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1a800 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
1a810 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
1a820 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
1a830 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
1a840 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1a850 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
1a860 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73  >index==lemp->ns
1a870 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  ymbol ) continue
1a880 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e  ;.        action
1a890 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f   = compute_actio
1a8a0 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20  n(lemp, ap);.   
1a8b0 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c       if( action<
1a8c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1a8d0 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74        acttab_act
1a8e0 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d  ion(pActtab, ap-
1a8f0 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69  >sp->index, acti
1a900 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on);.      }.   
1a910 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20     stp->iNtOfst 
1a920 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28  = acttab_insert(
1a930 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20  pActtab);.      
1a940 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  if( stp->iNtOfst
1a950 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e 74  <mnNtOfst ) mnNt
1a960 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f  Ofst = stp->iNtO
1a970 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  fst;.      if( s
1a980 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e 74  tp->iNtOfst>mxNt
1a990 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73 74 20  Ofst ) mxNtOfst 
1a9a0 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a  = stp->iNtOfst;.
1a9b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72 65 65      }.  }.  free
1a9c0 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  (ax);..  /* Outp
1a9d0 75 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  ut the yy_action
1a9e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1a9f0 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20  ntf(out,"static 
1aa00 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59  const YYACTIONTY
1aa10 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d  PE yy_action[] =
1aa20 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   {\n"); lineno++
1aa30 3b 0a 20 20 6e 20 3d 20 61 63 74 74 61 62 5f 73  ;.  n = acttab_s
1aa40 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20  ize(pActtab);.  
1aa50 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1aa60 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63  i++){.    int ac
1aa70 74 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79  tion = acttab_yy
1aa80 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20  action(pActtab, 
1aa90 69 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69  i);.    if( acti
1aaa0 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20  on<0 ) action = 
1aab0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c  lemp->nstate + l
1aac0 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a  emp->nrule + 2;.
1aad0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1aae0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1aaf0 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1ab00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1ab10 20 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b   %4d,", action);
1ab20 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1ab30 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1ab40 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1ab50 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1ab60 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1ab70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1ab80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1ab90 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1aba0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1abb0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
1abc0 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c  y_lookahead tabl
1abd0 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  e */.  fprintf(o
1abe0 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74  ut,"static const
1abf0 20 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c   YYCODETYPE yy_l
1ac00 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e  ookahead[] = {\n
1ac10 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1ac20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1ac30 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61  i++){.    int la
1ac40 20 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b   = acttab_yylook
1ac50 61 68 65 61 64 28 70 41 63 74 74 61 62 2c 20 69  ahead(pActtab, i
1ac60 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20  );.    if( la<0 
1ac70 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79  ) la = lemp->nsy
1ac80 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d  mbol;.    if( j=
1ac90 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1aca0 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1acb0 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1acc0 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61  out, " %4d,", la
1acd0 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1ace0 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1acf0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1ad00 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1ad10 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1ad20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1ad30 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1ad40 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1ad50 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1ad60 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
1ad70 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
1ad80 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1ad90 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1ada0 65 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44  e YY_SHIFT_USE_D
1adb0 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54  FLT (%d)\n", mnT
1adc0 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e  knOfst-1); linen
1add0 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  o++;.  n = lemp-
1ade0 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65  >nstate;.  while
1adf0 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73  ( n>0 && lemp->s
1ae00 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e  orted[n-1]->iTkn
1ae10 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  Ofst==NO_OFFSET 
1ae20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66  ) n--;.  fprintf
1ae30 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1ae40 59 5f 53 48 49 46 54 5f 4d 41 58 20 25 64 5c 6e  Y_SHIFT_MAX %d\n
1ae50 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  ", n-1); lineno+
1ae60 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1ae70 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  , "static const 
1ae80 25 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  %s yy_shift_ofst
1ae90 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20  [] = {\n", .    
1aea0 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69        minimum_si
1aeb0 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73  ze_type(mnTknOfs
1aec0 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29  t-1, mxTknOfst))
1aed0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1aee0 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1aef0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
1af00 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
1af10 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1af20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b   ofst = stp->iTk
1af30 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  nOfst;.    if( o
1af40 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
1af50 20 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73   ofst = mnTknOfs
1af60 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a  t - 1;.    if( j
1af70 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1af80 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1af90 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1afa0 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f  (out, " %4d,", o
1afb0 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  fst);.    if( j=
1afc0 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1afd0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1afe0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1aff0 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1b000 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b010 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1b020 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1b030 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1b040 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1b050 74 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66  the yy_reduce_of
1b060 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  st[] table */.  
1b070 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1b080 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
1b090 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22  USE_DFLT (%d)\n"
1b0a0 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c  , mnNtOfst-1); l
1b0b0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c  ineno++;.  n = l
1b0c0 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77  emp->nstate;.  w
1b0d0 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d  hile( n>0 && lem
1b0e0 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e  p->sorted[n-1]->
1b0f0 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  iNtOfst==NO_OFFS
1b100 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69  ET ) n--;.  fpri
1b110 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1b120 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41 58 20  e YY_REDUCE_MAX 
1b130 25 64 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e  %d\n", n-1); lin
1b140 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1b150 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
1b160 6e 73 74 20 25 73 20 79 79 5f 72 65 64 75 63 65  nst %s yy_reduce
1b170 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20  _ofst[] = {\n", 
1b180 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d  .          minim
1b190 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e  um_size_type(mnN
1b1a0 74 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73  tOfst-1, mxNtOfs
1b1b0 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  t)); lineno++;. 
1b1c0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1b1d0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
1b1e0 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c  fst;.    stp = l
1b1f0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1b200 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e      ofst = stp->
1b210 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28  iNtOfst;.    if(
1b220 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54   ofst==NO_OFFSET
1b230 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66   ) ofst = mnNtOf
1b240 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  st - 1;.    if( 
1b250 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1b260 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1b270 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1b280 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1b290 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a  ofst);.    if( j
1b2a0 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1b2b0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1b2c0 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1b2d0 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1b2e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b2f0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1b300 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1b310 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1b320 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
1b330 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74   the default act
1b340 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ion table */.  f
1b350 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1b360 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49  tic const YYACTI
1b370 4f 4e 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c  ONTYPE yy_defaul
1b380 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e  t[] = {\n"); lin
1b390 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d  eno++;.  n = lem
1b3a0 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72  p->nstate;.  for
1b3b0 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1b3c0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1b3d0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1b3e0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1b3f0 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1b400 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1b410 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1b420 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74  4d,", stp->iDflt
1b430 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1b440 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1b450 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1b460 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1b470 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1b480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1b490 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1b4a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1b4b0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1b4c0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1b4d0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1b4e0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1b4f0 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65  nerate the table
1b500 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b   of fallback tok
1b510 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ens..  */.  if( 
1b520 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  lemp->has_fallba
1b530 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ck ){.    for(i=
1b540 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  0; i<lemp->nterm
1b550 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
1b560 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1b570 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  *p = lemp->symbo
1b580 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
1b590 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20   p->fallback==0 
1b5a0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1b5b0 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30 2c 20  tf(out, "    0, 
1b5c0 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f 74 68   /* %10s => noth
1b5d0 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61  ing */\n", p->na
1b5e0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
1b5f0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1b600 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c 20 20  f(out, "  %3d,  
1b610 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20 2a 2f  /* %10s => %s */
1b620 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b  \n", p->fallback
1b630 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  ->index,.       
1b640 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66     p->name, p->f
1b650 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a  allback->name);.
1b660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 69        }.      li
1b670 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
1b680 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1b690 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75  mp->name, in, ou
1b6a0 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  t, &lineno);..  
1b6b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61  /* Generate a ta
1b6c0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1b6d0 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  he symbolic name
1b6e0 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62 6f 6c   of every symbol
1b6f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
1b700 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1b710 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69  ; i++){.    spri
1b720 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22  ntf(line,"\"%s\"
1b730 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ,",lemp->symbols
1b740 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
1b750 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
1b760 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20  -15s",line);.   
1b770 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20 29 7b   if( (i&3)==3 ){
1b780 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
1b790 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
1b7a0 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33 29 21    }.  if( (i&3)!
1b7b0 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75  =0 ){ fprintf(ou
1b7c0 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  t,"\n"); lineno+
1b7d0 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  +; }.  tplt_xfer
1b7e0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1b7f0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1b800 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61  /* Generate a ta
1b810 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ble containing a
1b820 20 74 65 78 74 20 73 74 72 69 6e 67 20 74 68 61   text string tha
1b830 74 20 64 65 73 63 72 69 62 65 73 20 65 76 65 72  t describes ever
1b840 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74  y.  ** rule in t
1b850 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66 20 74  he rule set of t
1b860 68 65 20 67 72 61 6d 6d 65 72 2e 20 20 54 68 69  he grammer.  Thi
1b870 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
1b880 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20   used.  ** when 
1b890 74 72 61 63 69 6e 67 20 52 45 44 55 43 45 20 61  tracing REDUCE a
1b8a0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  ctions..  */.  f
1b8b0 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d  or(i=0, rp=lemp-
1b8c0 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1b8d0 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  ->next, i++){.  
1b8e0 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e 69 6e    assert( rp->in
1b8f0 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70  dex==i );.    fp
1b900 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1b910 33 64 20 2a 2f 20 5c 22 25 73 20 3a 3a 3d 22 2c  3d */ \"%s ::=",
1b920 20 69 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d   i, rp->lhs->nam
1b930 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  e);.    for(j=0;
1b940 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b   j<rp->nrhs; j++
1b950 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1b960 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d  symbol *sp = rp-
1b970 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 66  >rhs[j];.      f
1b980 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22  printf(out," %s"
1b990 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
1b9a0 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
1b9b0 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
1b9c0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  {.        int k;
1b9d0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 31  .        for(k=1
1b9e0 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; k<sp->nsubsym;
1b9f0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
1ba00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25   fprintf(out,"|%
1ba10 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d  s",sp->subsym[k]
1ba20 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
1ba30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1ba40 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ba50 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ,"\",\n"); linen
1ba60 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1ba70 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1ba80 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1ba90 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1baa0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1bab0 74 65 73 20 65 76 65 72 79 20 74 69 6d 65 20 61  tes every time a
1bac0 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65   symbol is poppe
1bad0 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
1bae0 73 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f 63  stack while proc
1baf0 65 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f 72  essing errors or
1bb00 20 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69 6e   while destroyin
1bb10 67 20 74 68 65 20 70 61 72 73 65 72 2e 20 0a 20  g the parser. . 
1bb20 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f   ** (In other wo
1bb30 72 64 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68  rds, generate th
1bb40 65 20 25 64 65 73 74 72 75 63 74 6f 72 20 61 63  e %destructor ac
1bb50 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66  tions).  */.  if
1bb60 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  ( lemp->tokendes
1bb70 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
1bb80 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
1bb90 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
1bba0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1bbb0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
1bbc0 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  [i];.      if( s
1bbd0 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65  p==0 || sp->type
1bbe0 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e  !=TERMINAL ) con
1bbf0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 70 72  tinue;.      fpr
1bc00 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
1bc10 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e  se %d:\n",sp->in
1bc20 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1bc30 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
1bc40 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1bc50 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62  ol && lemp->symb
1bc60 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45  ols[i]->type!=TE
1bc70 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20  RMINAL; i++);.  
1bc80 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73    if( i<lemp->ns
1bc90 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65  ymbol ){.      e
1bca0 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
1bcb0 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79  ode(out,lemp->sy
1bcc0 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c  mbols[i],lemp,&l
1bcd0 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70  ineno);.      fp
1bce0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1bcf0 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1bd00 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  eno++;.    }.  }
1bd10 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  .  if( lemp->var
1bd20 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  dest ){.    stru
1bd30 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f  ct symbol *dflt_
1bd40 73 70 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  sp = 0;.    for(
1bd50 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
1bd60 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
1bd70 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1bd80 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
1bd90 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ols[i];.      if
1bda0 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74  ( sp==0 || sp->t
1bdb0 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c  ype==TERMINAL ||
1bdc0 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69  .          sp->i
1bdd0 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e 64  ndex<=0 || sp->d
1bde0 65 73 74 72 75 63 74 6f 72 21 3d 30 20 29 20 63  estructor!=0 ) c
1bdf0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
1be00 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1be10 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e  case %d:\n",sp->
1be20 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  index); lineno++
1be30 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73 70 20  ;.      dflt_sp 
1be40 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = sp;.    }.    
1be50 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30 20 29  if( dflt_sp!=0 )
1be60 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73  {.      emit_des
1be70 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
1be80 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c  ,dflt_sp,lemp,&l
1be90 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70  ineno);.      fp
1bea0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1beb0 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1bec0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  eno++;.    }.  }
1bed0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1bee0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
1bef0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
1bf00 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
1bf10 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1bf20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1bf30 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
1bf40 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74   || sp->destruct
1bf50 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  or==0 ) continue
1bf60 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1bf70 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c  t,"    case %d:\
1bf80 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c  n",sp->index); l
1bf90 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  ineno++;..    /*
1bfa0 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63 61   Combine duplica
1bfb0 74 65 20 64 65 73 74 72 75 63 74 6f 72 73 20 69  te destructors i
1bfc0 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 61 73  nto a single cas
1bfd0 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 69  e */.    for(j=i
1bfe0 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  +1; j<lemp->nsym
1bff0 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  bol; j++){.     
1c000 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1c010 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  sp2 = lemp->symb
1c020 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  ols[j];.      if
1c030 28 20 73 70 32 20 26 26 20 73 70 32 2d 3e 74 79  ( sp2 && sp2->ty
1c040 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26 20  pe!=TERMINAL && 
1c050 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 0a  sp2->destructor.
1c060 20 20 20 20 20 20 20 20 20 20 26 26 20 73 70 32            && sp2
1c070 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e  ->dtnum==sp->dtn
1c080 75 6d 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  um.          && 
1c090 73 74 72 63 6d 70 28 73 70 2d 3e 64 65 73 74 72  strcmp(sp->destr
1c0a0 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74 72  uctor,sp2->destr
1c0b0 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20  uctor)==0 ){.   
1c0c0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1c0d0 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c  t,"    case %d:\
1c0e0 6e 22 2c 73 70 32 2d 3e 69 6e 64 65 78 29 3b 20  n",sp2->index); 
1c0f0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1c100 20 20 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74     sp2->destruct
1c110 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  or = 0;.      }.
1c120 20 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f      }..    emit_
1c130 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
1c140 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  out,lemp->symbol
1c150 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  s[i],lemp,&linen
1c160 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  o);.    fprintf(
1c170 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
1c180 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1c190 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1c1a0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1c1b0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1c1c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1c1d0 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
1c1e0 77 68 65 6e 65 76 65 72 20 74 68 65 20 70 61 72  whenever the par
1c1f0 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c  ser stack overfl
1c200 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  ows */.  tplt_pr
1c210 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1c220 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 6c 65 6d 70  p->overflow,lemp
1c230 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 2c 26 6c 69  ->overflowln,&li
1c240 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1c250 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1c260 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1c270 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
1c280 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c 65 20  e table of rule 
1c290 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a  information .  *
1c2a0 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69  *.  ** Note: Thi
1c2b0 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
1c2c0 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
1c2d0 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72  rules are number
1c2e0 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c  .  ** sequentual
1c2f0 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ly beginning wit
1c300 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  h 0..  */.  for(
1c310 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
1c320 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
1c330 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1c340 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c  ,"  { %d, %d },\
1c350 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65  n",rp->lhs->inde
1c360 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e  x,rp->nrhs); lin
1c370 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1c380 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1c390 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1c3a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1c3b0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1c3c0 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61  cution during ea
1c3d0 63 68 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e  ch REDUCE action
1c3e0 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
1c3f0 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
1c400 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 74  rp->next){.    t
1c410 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65  ranslate_code(le
1c420 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 66  mp, rp);.  }.  f
1c430 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
1c440 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
1c450 74 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72  t){.    struct r
1c460 75 6c 65 20 2a 72 70 32 3b 0a 20 20 20 20 69 66  ule *rp2;.    if
1c470 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20  ( rp->code==0 ) 
1c480 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70  continue;.    fp
1c490 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1c4a0 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 72 70 2d   case %d:\n",rp-
1c4b0 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
1c4c0 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70 32 3d 72  +;.    for(rp2=r
1c4d0 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72 70  p->next; rp2; rp
1c4e0 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20  2=rp2->next){.  
1c4f0 20 20 20 20 69 66 28 20 72 70 32 2d 3e 63 6f 64      if( rp2->cod
1c500 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20  e==rp->code ){. 
1c510 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1c520 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20 25  ut,"      case %
1c530 64 3a 5c 6e 22 2c 72 70 32 2d 3e 69 6e 64 65 78  d:\n",rp2->index
1c540 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1c550 20 20 20 20 20 72 70 32 2d 3e 63 6f 64 65 20 3d       rp2->code =
1c560 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1c570 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65 28  }.    emit_code(
1c580 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e  out,rp,lemp,&lin
1c590 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  eno);.    fprint
1c5a0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62  f(out,"        b
1c5b0 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
1c5c0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1c5d0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1c5e0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1c5f0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1c600 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1c610 74 65 73 20 69 66 20 61 20 70 61 72 73 65 20 66  tes if a parse f
1c620 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  ails */.  tplt_p
1c630 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
1c640 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 6c 65 6d 70  mp->failure,lemp
1c650 2d 3e 66 61 69 6c 75 72 65 6c 6e 2c 26 6c 69 6e  ->failureln,&lin
1c660 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
1c670 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1c680 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1c690 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1c6a0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1c6b0 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78 20 65   when a syntax e
1c6c0 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20  rror occurs */. 
1c6d0 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1c6e0 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72  lemp,lemp->error
1c6f0 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 6c 6e 2c 26  ,lemp->errorln,&
1c700 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
1c710 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1c720 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1c730 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1c740 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1c750 74 65 73 20 77 68 65 6e 20 74 68 65 20 70 61 72  tes when the par
1c760 73 65 72 20 61 63 63 65 70 74 73 20 69 74 73 20  ser accepts its 
1c770 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f  input */.  tplt_
1c780 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
1c790 65 6d 70 2d 3e 61 63 63 65 70 74 2c 6c 65 6d 70  emp->accept,lemp
1c7a0 2d 3e 61 63 63 65 70 74 6c 6e 2c 26 6c 69 6e 65  ->acceptln,&line
1c7b0 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
1c7c0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1c7d0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1c7e0 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64  /* Append any ad
1c7f0 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20  dition code the 
1c800 75 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a  user desires */.
1c810 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1c820 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72  ,lemp,lemp->extr
1c830 61 63 6f 64 65 2c 6c 65 6d 70 2d 3e 65 78 74 72  acode,lemp->extr
1c840 61 63 6f 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29  acodeln,&lineno)
1c850 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  ;..  fclose(in);
1c860 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a  .  fclose(out);.
1c870 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
1c880 47 65 6e 65 72 61 74 65 20 61 20 68 65 61 64 65  Generate a heade
1c890 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  r file for the p
1c8a0 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65  arser */.void Re
1c8b0 70 6f 72 74 48 65 61 64 65 72 28 6c 65 6d 70 29  portHeader(lemp)
1c8c0 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
1c8d0 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f  emp;.{.  FILE *o
1c8e0 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ut, *in;.  char 
1c8f0 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61 72 20  *prefix;.  char 
1c900 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  line[LINESIZE];.
1c910 20 20 63 68 61 72 20 70 61 74 74 65 72 6e 5b 4c    char pattern[L
1c920 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  INESIZE];.  int 
1c930 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  i;..  if( lemp->
1c940 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72  tokenprefix ) pr
1c950 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b  efix = lemp->tok
1c960 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c 73 65  enprefix;.  else
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b      prefix = "";
1c990 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65  .  in = file_ope
1c9a0 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 62 22  n(lemp,".h","rb"
1c9b0 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a 20  );.  if( in ){. 
1c9c0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65     for(i=1; i<le
1c9d0 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26  mp->nterminal &&
1c9e0 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45   fgets(line,LINE
1c9f0 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a  SIZE,in); i++){.
1ca00 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 61        sprintf(pa
1ca10 74 74 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25  ttern,"#define %
1ca20 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72  s%-30s %2d\n",pr
1ca30 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  efix,lemp->symbo
1ca40 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a  ls[i]->name,i);.
1ca50 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
1ca60 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20 29  (line,pattern) )
1ca70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ca80 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1ca90 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e    if( i==lemp->n
1caa0 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20  terminal ){.    
1cab0 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69    /* No change i
1cac0 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e  n the file.  Don
1cad0 27 74 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a  't rewrite it. *
1cae0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
1caf0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20      }.  }.  out 
1cb00 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
1cb10 2c 22 2e 68 22 2c 22 77 62 22 29 3b 0a 20 20 69  ,".h","wb");.  i
1cb20 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f  f( out ){.    fo
1cb30 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
1cb40 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
1cb50 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1cb60 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  t,"#define %s%-3
1cb70 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78  0s %2d\n",prefix
1cb80 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1cb90 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
1cba0 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74  }.    fclose(out
1cbb0 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  );  .  }.  retur
1cbc0 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20  n;.}../* Reduce 
1cbd0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1cbe0 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69  action tables, i
1cbf0 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d  f possible, by m
1cc00 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20  aking use.** of 
1cc10 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20  defaults..**.** 
1cc20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c  In this version,
1cc30 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d 6f 73   we take the mos
1cc40 74 20 66 72 65 71 75 65 6e 74 20 52 45 44 55 43  t frequent REDUC
1cc50 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b  E action and mak
1cc60 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65 66 61  e.** it the defa
1cc70 75 6c 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68  ult.  Except, th
1cc80 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61 75 6c  ere is no defaul
1cc90 74 20 69 66 20 74 68 65 20 77 69 6c 64 63 61 72  t if the wildcar
1cca0 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61 20  d token.** is a 
1ccb0 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68  possible look-ah
1ccc0 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d  ead..*/.void Com
1ccd0 70 72 65 73 73 54 61 62 6c 65 73 28 6c 65 6d 70  pressTables(lemp
1cce0 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
1ccf0 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  lemp;.{.  struct
1cd00 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
1cd10 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
1cd20 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72 75 63 74  , *ap2;.  struct
1cd30 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c   rule *rp, *rp2,
1cd40 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e   *rbest;.  int n
1cd50 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69  best, n;.  int i
1cd60 3b 0a 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64  ;.  int usesWild
1cd70 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  card;..  for(i=0
1cd80 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
1cd90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
1cda0 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1cdb0 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30  ];.    nbest = 0
1cdc0 3b 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b  ;.    rbest = 0;
1cdd0 0a 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72  .    usesWildcar
1cde0 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28  d = 0;..    for(
1cdf0 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
1ce00 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1ce10 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
1ce20 3d 3d 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73  ==SHIFT && ap->s
1ce30 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72  p==lemp->wildcar
1ce40 64 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65  d ){.        use
1ce50 73 57 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20  sWildcard = 1;. 
1ce60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1ce70 20 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43   ap->type!=REDUC
1ce80 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  E ) continue;.  
1ce90 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72      rp = ap->x.r
1cea0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 3d  p;.      if( rp=
1ceb0 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75  =rbest ) continu
1cec0 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  e;.      n = 1;.
1ced0 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d 61 70        for(ap2=ap
1cee0 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61 70 32  ->next; ap2; ap2
1cef0 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =ap2->next){.   
1cf00 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e 74 79       if( ap2->ty
1cf10 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e  pe!=REDUCE ) con
1cf20 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 72  tinue;.        r
1cf30 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a  p2 = ap2->x.rp;.
1cf40 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d          if( rp2=
1cf50 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75  =rbest ) continu
1cf60 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e;.        if( r
1cf70 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20  p2==rp ) n++;.  
1cf80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1cf90 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20 20 20  n>nbest ){.     
1cfa0 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20     nbest = n;.  
1cfb0 20 20 20 20 20 20 72 62 65 73 74 20 3d 20 72 70        rbest = rp
1cfc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cfd0 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20   .    /* Do not 
1cfe0 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20 69  make a default i
1cff0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1d000 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c 74  rules to default
1d010 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  .    ** is not a
1d020 74 20 6c 65 61 73 74 20 31 20 6f 72 20 69 66 20  t least 1 or if 
1d030 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b  the wildcard tok
1d040 65 6e 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65  en is a possible
1d050 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65 61  .    ** lookahea
1d060 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1d070 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75 73 65  ( nbest<1 || use
1d080 73 57 69 6c 64 63 61 72 64 20 29 20 63 6f 6e 74  sWildcard ) cont
1d090 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43  inue;...    /* C
1d0a0 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e 67 20  ombine matching 
1d0b0 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20 69  REDUCE actions i
1d0c0 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65 66  nto a single def
1d0d0 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ault */.    for(
1d0e0 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
1d0f0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1d100 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
1d110 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e  ==REDUCE && ap->
1d120 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 62 72  x.rp==rbest ) br
1d130 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  eak;.    }.    a
1d140 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20 20  ssert( ap );.   
1d150 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c   ap->sp = Symbol
1d160 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22  _new("{default}"
1d170 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61 70  );.    for(ap=ap
1d180 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d 61  ->next; ap; ap=a
1d190 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1d1a0 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
1d1b0 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70  DUCE && ap->x.rp
1d1c0 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e 74 79  ==rbest ) ap->ty
1d1d0 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20  pe = NOT_USED;. 
1d1e0 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70     }.    stp->ap
1d1f0 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73   = Action_sort(s
1d200 74 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  tp->ap);.  }.}..
1d210 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1d220 77 6f 20 73 74 61 74 65 73 20 66 6f 72 20 73 6f  wo states for so
1d230 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  rting purposes. 
1d240 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 73 74 61   The smaller sta
1d250 74 65 20 69 73 20 74 68 65 0a 2a 2a 20 6f 6e 65  te is the.** one
1d260 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74 20 6e   with the most n
1d270 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69  on-terminal acti
1d280 6f 6e 73 2e 20 20 49 66 20 74 68 65 79 20 68 61  ons.  If they ha
1d290 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
1d2a0 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74 65 72  er.** of non-ter
1d2b0 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2c 20 74  minal actions, t
1d2c0 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c 65 72 20  hen the smaller 
1d2d0 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
1d2e0 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f 6b 65  the most.** toke
1d2f0 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  n actions..*/.st
1d300 61 74 69 63 20 69 6e 74 20 73 74 61 74 65 52 65  atic int stateRe
1d310 73 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f 6e 73  sortCompare(cons
1d320 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74  t void *a, const
1d330 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e   void *b){.  con
1d340 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65 20  st struct state 
1d350 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74  *pA = *(const st
1d360 72 75 63 74 20 73 74 61 74 65 2a 2a 29 61 3b 0a  ruct state**)a;.
1d370 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
1d380 74 61 74 65 20 2a 70 42 20 3d 20 2a 28 63 6f 6e  tate *pB = *(con
1d390 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65 2a  st struct state*
1d3a0 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  *)b;.  int n;.. 
1d3b0 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41 63 74 20   n = pB->nNtAct 
1d3c0 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20  - pA->nNtAct;.  
1d3d0 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
1d3e0 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63 74 20  n = pB->nTknAct 
1d3f0 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20  - pA->nTknAct;. 
1d400 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
1d410 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62 65  .../*.** Renumbe
1d420 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73 74 61  r and resort sta
1d430 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61 74  tes so that stat
1d440 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63 68  es with fewer ch
1d450 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72 20 61  oices.** occur a
1d460 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78 63 65  t the end.  Exce
1d470 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65 20 30  pt, keep state 0
1d480 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73 74   as the first st
1d490 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65 73  ate..*/.void Res
1d4a0 6f 72 74 53 74 61 74 65 73 28 6c 65 6d 70 29 0a  ortStates(lemp).
1d4b0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1d4c0 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
1d4d0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
1d4e0 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  tp;.  struct act
1d4f0 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f 72 28  ion *ap;..  for(
1d500 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1d510 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
1d520 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1d530 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e  d[i];.    stp->n
1d540 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e  TknAct = stp->nN
1d550 74 41 63 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  tAct = 0;.    st
1d560 70 2d 3e 69 44 66 6c 74 20 3d 20 6c 65 6d 70 2d  p->iDflt = lemp-
1d570 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
1d580 6e 72 75 6c 65 3b 0a 20 20 20 20 73 74 70 2d 3e  nrule;.    stp->
1d590 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46  iTknOfst = NO_OF
1d5a0 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69  FSET;.    stp->i
1d5b0 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53  NtOfst = NO_OFFS
1d5c0 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  ET;.    for(ap=s
1d5d0 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
1d5e0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1d5f0 69 66 28 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  if( compute_acti
1d600 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d 30 20 29  on(lemp,ap)>=0 )
1d610 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  {.        if( ap
1d620 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70  ->sp->index<lemp
1d630 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20  ->nterminal ){. 
1d640 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54           stp->nT
1d650 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20  knAct++;.       
1d660 20 7d 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73   }else if( ap->s
1d670 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e  p->index<lemp->n
1d680 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20  symbol ){.      
1d690 20 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b      stp->nNtAct+
1d6a0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
1d6b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d  {.          stp-
1d6c0 3e 69 44 66 6c 74 20 3d 20 63 6f 6d 70 75 74 65  >iDflt = compute
1d6d0 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70  _action(lemp, ap
1d6e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1d700 20 71 73 6f 72 74 28 26 6c 65 6d 70 2d 3e 73 6f   qsort(&lemp->so
1d710 72 74 65 64 5b 31 5d 2c 20 6c 65 6d 70 2d 3e 6e  rted[1], lemp->n
1d720 73 74 61 74 65 2d 31 2c 20 73 69 7a 65 6f 66 28  state-1, sizeof(
1d730 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 29  lemp->sorted[0])
1d740 2c 0a 20 20 20 20 20 20 20 20 73 74 61 74 65 52  ,.        stateR
1d750 65 73 6f 72 74 43 6f 6d 70 61 72 65 29 3b 0a 20  esortCompare);. 
1d760 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1d770 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
1d780 20 20 20 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64      lemp->sorted
1d790 5b 69 5d 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20  [i]->statenum = 
1d7a0 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  i;.  }.}.../****
1d7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
1d7c0 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74  om the file "set
1d7d0 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
1d7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d7f0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
1d800 53 65 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e  Set manipulation
1d810 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68   routines for th
1d820 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
1d830 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74  enerator..*/..st
1d840 61 74 69 63 20 69 6e 74 20 73 69 7a 65 20 3d 20  atic int size = 
1d850 30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 73  0;../* Set the s
1d860 65 74 20 73 69 7a 65 20 2a 2f 0a 76 6f 69 64 20  et size */.void 
1d870 53 65 74 53 69 7a 65 28 6e 29 0a 69 6e 74 20 6e  SetSize(n).int n
1d880 3b 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b 31  ;.{.  size = n+1
1d890 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;.}../* Allocate
1d8a0 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63 68   a new set */.ch
1d8b0 61 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20 20  ar *SetNew(){.  
1d8c0 63 68 61 72 20 2a 73 3b 0a 20 20 69 6e 74 20 69  char *s;.  int i
1d8d0 3b 0a 20 20 73 20 3d 20 28 63 68 61 72 2a 29 6d  ;.  s = (char*)m
1d8e0 61 6c 6c 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20  alloc( size );. 
1d8f0 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20   if( s==0 ){.   
1d900 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d   extern void mem
1d910 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20  ory_error();.   
1d920 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
1d930 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1d940 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 73 5b 69  i<size; i++) s[i
1d950 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
1d960 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63  s;.}../* Dealloc
1d970 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69  ate a set */.voi
1d980 64 20 53 65 74 46 72 65 65 28 73 29 0a 63 68 61  d SetFree(s).cha
1d990 72 20 2a 73 3b 0a 7b 0a 20 20 66 72 65 65 28 73  r *s;.{.  free(s
1d9a0 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e  );.}../* Add a n
1d9b0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1d9c0 65 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20 54  e set.  Return T
1d9d0 52 55 45 20 69 66 20 74 68 65 20 65 6c 65 6d 65  RUE if the eleme
1d9e0 6e 74 20 77 61 73 20 61 64 64 65 64 0a 2a 2a 20  nt was added.** 
1d9f0 61 6e 64 20 46 41 4c 53 45 20 69 66 20 69 74 20  and FALSE if it 
1da00 77 61 73 20 61 6c 72 65 61 64 79 20 74 68 65 72  was already ther
1da10 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64  e. */.int SetAdd
1da20 28 73 2c 65 29 0a 63 68 61 72 20 2a 73 3b 0a 69  (s,e).char *s;.i
1da30 6e 74 20 65 3b 0a 7b 0a 20 20 69 6e 74 20 72 76  nt e;.{.  int rv
1da40 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a 20  ;.  rv = s[e];. 
1da50 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65 74   s[e] = 1;.  ret
1da60 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41  urn !rv;.}../* A
1da70 64 64 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  dd every element
1da80 20 6f 66 20 73 32 20 74 6f 20 73 31 2e 20 20 52   of s2 to s1.  R
1da90 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 31  eturn TRUE if s1
1daa0 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74   changes. */.int
1dab0 20 53 65 74 55 6e 69 6f 6e 28 73 31 2c 73 32 29   SetUnion(s1,s2)
1dac0 0a 63 68 61 72 20 2a 73 31 3b 0a 63 68 61 72 20  .char *s1;.char 
1dad0 2a 73 32 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 20  *s2;.{.  int i, 
1dae0 70 72 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f 67  progress;.  prog
1daf0 72 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  ress = 0;.  for(
1db00 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
1db10 29 7b 0a 20 20 20 20 69 66 28 20 73 32 5b 69 5d  ){.    if( s2[i]
1db20 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1db30 20 20 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30      if( s1[i]==0
1db40 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 67 72 65   ){.      progre
1db50 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 31  ss = 1;.      s1
1db60 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  [i] = 1;.    }. 
1db70 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 67   }.  return prog
1db80 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ress;.}./*******
1db90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1dba0 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
1dbb0 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.c" ********
1dbc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dbd0 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  ****/./*.** All 
1dbe0 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
1dbf0 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d  e has been autom
1dc00 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
1dc10 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65  ed.** from a spe
1dc20 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68  cification in th
1dc30 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  e file.**       
1dc40 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22         "table.q"
1dc50 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63  .** by the assoc
1dc60 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64  iative array cod
1dc70 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72  e building progr
1dc80 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44  am "aagen"..** D
1dc90 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20  o not edit this 
1dca0 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20  file!  Instead, 
1dcb0 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69  edit the specifi
1dcc0 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20  cation.** file, 
1dcd0 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e  then rerun aagen
1dce0 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ..*/./*.** Code 
1dcf0 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74  for processing t
1dd00 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d  ables in the LEM
1dd10 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
1dd20 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45  tor..*/..PRIVATE
1dd30 20 69 6e 74 20 73 74 72 68 61 73 68 28 78 29 0a   int strhash(x).
1dd40 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 69 6e 74  char *x;.{.  int
1dd50 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   h = 0;.  while(
1dd60 20 2a 78 29 20 68 20 3d 20 68 2a 31 33 20 2b 20   *x) h = h*13 + 
1dd70 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e  *(x++);.  return
1dd80 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20   h;.}../* Works 
1dd90 6c 69 6b 65 20 73 74 72 64 75 70 2c 20 73 6f 72  like strdup, sor
1dda0 74 20 6f 66 2e 20 20 53 61 76 65 20 61 20 73 74  t of.  Save a st
1ddb0 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64  ring in malloced
1ddc0 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20   memory, but.** 
1ddd0 6b 65 65 70 20 73 74 72 69 6e 67 73 20 69 6e 20  keep strings in 
1dde0 61 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20  a table so that 
1ddf0 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20  the same string 
1de00 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a  is not in more.*
1de10 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65  * than one place
1de20 2e 0a 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73 61  ..*/.char *Strsa
1de30 66 65 28 79 29 0a 63 68 61 72 20 2a 79 3b 0a 7b  fe(y).char *y;.{
1de40 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69  .  char *z;..  i
1de50 66 28 20 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( y==0 ) return
1de60 20 30 3b 0a 20 20 7a 20 3d 20 53 74 72 73 61 66   0;.  z = Strsaf
1de70 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28  e_find(y);.  if(
1de80 20 7a 3d 3d 30 20 26 26 20 28 7a 3d 6d 61 6c 6c   z==0 && (z=mall
1de90 6f 63 28 20 73 74 72 6c 65 6e 28 79 29 2b 31 20  oc( strlen(y)+1 
1dea0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))!=0 ){.    str
1deb0 63 70 79 28 7a 2c 79 29 3b 0a 20 20 20 20 53 74  cpy(z,y);.    St
1dec0 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b  rsafe_insert(z);
1ded0 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65  .  }.  MemoryChe
1dee0 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ck(z);.  return 
1def0 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  z;.}../* There i
1df00 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1df10 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1df20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
1df30 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
1df40 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
1df50 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x1"..*/.struct 
1df60 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x1 {.  int siz
1df70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1df80 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1df90 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
1dfa0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfc0 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
1dfd0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
1dfe0 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
1e010 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
1e020 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
1e030 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e040 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
1e050 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
1e060 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62  uct s_x1node *tb
1e070 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
1e080 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
1e090 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1e0a0 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
1e0b0 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
1e0c0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
1e0d0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1e0e0 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1e0f0 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
1e100 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
1e110 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
1e120 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
1e130 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  1"..*/.typedef s
1e140 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b  truct s_x1node {
1e150 0a 20 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  .  char *data;  
1e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e170 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
1e180 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1e190 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
1e1a0 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
1e1b0 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
1e1c0 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
1e1d0 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
1e1e0 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
1e1f0 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  1node;../* There
1e200 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
1e210 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
1e220 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
1e230 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
1e240 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 31  atic struct s_x1
1e250 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x1a;../* Alloc
1e260 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
1e270 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
1e280 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74  oid Strsafe_init
1e290 28 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20  (){.  if( x1a ) 
1e2a0 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20  return;.  x1a = 
1e2b0 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61  (struct s_x1*)ma
1e2c0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
1e2d0 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69  uct s_x1) );.  i
1e2e0 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31  f( x1a ){.    x1
1e2f0 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  a->size = 1024;.
1e300 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d      x1a->count =
1e310 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c   0;.    x1a->tbl
1e320 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x1node*)mall
1e330 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
1e340 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x1node) + siz
1e350 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30  eof(x1node*))*10
1e360 32 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 31  24 );.    if( x1
1e370 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
1e380 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20     free(x1a);.  
1e390 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20      x1a = 0;.   
1e3a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1e3b0 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e  t i;.      x1a->
1e3c0 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
1e3d0 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29  (x1a->tbl[1024])
1e3e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1e3f0 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31   i<1024; i++) x1
1e400 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
1e410 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
1e420 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
1e430 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
1e440 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1e450 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
1e460 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
1e470 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
1e480 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
1e490 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  */.int Strsafe_i
1e4a0 6e 73 65 72 74 28 64 61 74 61 29 0a 63 68 61 72  nsert(data).char
1e4b0 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78 31 6e 6f   *data;.{.  x1no
1e4c0 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b  de *np;.  int h;
1e4d0 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66  .  int ph;..  if
1e4e0 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
1e4f0 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68  n 0;.  ph = strh
1e500 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d  ash(data);.  h =
1e510 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65   ph & (x1a->size
1e520 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d  -1);.  np = x1a-
1e530 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
1e540 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
1e550 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64  trcmp(np->data,d
1e560 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ata)==0 ){.     
1e570 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
1e580 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
1e590 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
1e5a0 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
1e5b0 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
1e5c0 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
1e5d0 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
1e5e0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1e5f0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
1e600 20 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63    }.  if( x1a->c
1e610 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20  ount>=x1a->size 
1e620 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
1e630 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
1e640 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
1e650 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a      int i,size;.
1e660 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 31 20      struct s_x1 
1e670 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
1e680 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78  .size = size = x
1e690 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  1a->size*2;.    
1e6a0 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31  array.count = x1
1e6b0 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
1e6c0 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64  ray.tbl = (x1nod
1e6d0 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e*)malloc(.     
1e6e0 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29   (sizeof(x1node)
1e6f0 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
1e700 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20  *))*size );.    
1e710 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
1e720 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
1e730 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
1e740 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
1e750 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
1e760 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  1node**)&(array.
1e770 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20  tbl[size]);.    
1e780 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1e790 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
1e7a0 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
1e7b0 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74  =0; i<x1a->count
1e7c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31  ; i++){.      x1
1e7d0 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
1e7e0 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
1e7f0 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d   = &(x1a->tbl[i]
1e800 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72  );.      h = str
1e810 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
1e820 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
1e830 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
1e840 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
1e850 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
1e860 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
1e870 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
1e880 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
1e890 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
1e8a0 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
1e8b0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
1e8c0 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
1e8d0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
1e8e0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
1e8f0 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
1e900 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
1e910 20 20 20 20 66 72 65 65 28 78 31 61 2d 3e 74 62      free(x1a->tb
1e920 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20 61  l);.    *x1a = a
1e930 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
1e940 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
1e950 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
1e960 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
1e970 20 20 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62    np = &(x1a->tb
1e980 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x1a->count++])
1e990 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
1e9a0 61 74 61 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e  ata;.  if( x1a->
1e9b0 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b  ht[h] ) x1a->ht[
1e9c0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
1e9d0 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
1e9e0 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  xt = x1a->ht[h];
1e9f0 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x1a->ht[h] = 
1ea00 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
1ea10 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x1a->ht[h]);.
1ea20 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1ea30 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1ea40 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
1ea50 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
1ea60 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
1ea70 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
1ea80 20 6b 65 79 2e 20 2a 2f 0a 63 68 61 72 20 2a 53   key. */.char *S
1ea90 74 72 73 61 66 65 5f 66 69 6e 64 28 6b 65 79 29  trsafe_find(key)
1eaa0 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20  .char *key;.{.  
1eab0 69 6e 74 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20  int h;.  x1node 
1eac0 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d  *np;..  if( x1a=
1ead0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1eae0 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79   h = strhash(key
1eaf0 29 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  ) & (x1a->size-1
1eb00 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68  );.  np = x1a->h
1eb10 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1eb20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
1eb30 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79  cmp(np->data,key
1eb40 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
1eb50 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
1eb60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
1eb70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
1eb80 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
1eb90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28  pointer to the (
1eba0 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74  terminal or nont
1ebb0 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20  erminal) symbol 
1ebc0 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61  "x"..** Create a
1ebd0 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74   new symbol if t
1ebe0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1ebf0 20 74 69 6d 65 20 22 78 22 20 68 61 73 20 62 65   time "x" has be
1ec00 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75  en seen..*/.stru
1ec10 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
1ec20 6c 5f 6e 65 77 28 78 29 0a 63 68 61 72 20 2a 78  l_new(x).char *x
1ec30 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ;.{.  struct sym
1ec40 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d  bol *sp;..  sp =
1ec50 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b   Symbol_find(x);
1ec60 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a  .  if( sp==0 ){.
1ec70 20 20 20 20 73 70 20 3d 20 28 73 74 72 75 63 74      sp = (struct
1ec80 20 73 79 6d 62 6f 6c 20 2a 29 6d 61 6c 6c 6f 63   symbol *)malloc
1ec90 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
1eca0 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20 20 4d  symbol) );.    M
1ecb0 65 6d 6f 72 79 43 68 65 63 6b 28 73 70 29 3b 0a  emoryCheck(sp);.
1ecc0 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d 20 53      sp->name = S
1ecd0 74 72 73 61 66 65 28 78 29 3b 0a 20 20 20 20 73  trsafe(x);.    s
1ece0 70 2d 3e 74 79 70 65 20 3d 20 69 73 75 70 70 65  p->type = isuppe
1ecf0 72 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e 41 4c  r(*x) ? TERMINAL
1ed00 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a   : NONTERMINAL;.
1ed10 20 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d 20 30      sp->rule = 0
1ed20 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61  ;.    sp->fallba
1ed30 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  ck = 0;.    sp->
1ed40 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20 73  prec = -1;.    s
1ed50 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a  p->assoc = UNK;.
1ed60 20 20 20 20 73 70 2d 3e 66 69 72 73 74 73 65 74      sp->firstset
1ed70 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c 61   = 0;.    sp->la
1ed80 6d 62 64 61 20 3d 20 42 5f 46 41 4c 53 45 3b 0a  mbda = B_FALSE;.
1ed90 20 20 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74      sp->destruct
1eda0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  or = 0;.    sp->
1edb0 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20  datatype = 0;.  
1edc0 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28    Symbol_insert(
1edd0 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  sp,sp->name);.  
1ede0 7d 0a 20 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d  }.  return sp;.}
1edf0 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
1ee00 20 73 79 6d 62 6f 6c 73 20 66 6f 72 20 77 6f 72   symbols for wor
1ee10 6b 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2a  king purposes.**
1ee20 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61 74  .** Symbols that
1ee30 20 62 65 67 69 6e 20 77 69 74 68 20 75 70 70 65   begin with uppe
1ee40 72 20 63 61 73 65 20 6c 65 74 74 65 72 73 20 28  r case letters (
1ee50 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b  terminals or tok
1ee60 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72  ens).** must sor
1ee70 74 20 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73  t before symbols
1ee80 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
1ee90 20 6c 6f 77 65 72 20 63 61 73 65 20 6c 65 74 74   lower case lett
1eea0 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d  ers.** (non-term
1eeb0 69 6e 61 6c 73 29 2e 20 20 4f 74 68 65 72 20 74  inals).  Other t
1eec0 68 61 6e 20 74 68 61 74 2c 20 74 68 65 20 6f 72  han that, the or
1eed0 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  der does not mat
1eee0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69  ter..**.** We fi
1eef0 6e 64 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c  nd experimentall
1ef00 79 20 74 68 61 74 20 6c 65 61 76 69 6e 67 20 74  y that leaving t
1ef10 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68  he symbols in th
1ef20 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  eir original.** 
1ef30 6f 72 64 65 72 20 28 74 68 65 20 6f 72 64 65 72  order (the order
1ef40 20 74 68 65 79 20 61 70 70 65 61 72 65 64 20 69   they appeared i
1ef50 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 66 69  n the grammar fi
1ef60 6c 65 29 20 67 69 76 65 73 20 74 68 65 0a 2a 2a  le) gives the.**
1ef70 20 73 6d 61 6c 6c 65 73 74 20 70 61 72 73 65 72   smallest parser
1ef80 20 74 61 62 6c 65 73 20 69 6e 20 53 51 4c 69 74   tables in SQLit
1ef90 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  e..*/.int Symbol
1efa0 63 6d 70 70 28 73 74 72 75 63 74 20 73 79 6d 62  cmpp(struct symb
1efb0 6f 6c 20 2a 2a 61 2c 20 73 74 72 75 63 74 20 73  ol **a, struct s
1efc0 79 6d 62 6f 6c 20 2a 2a 62 29 7b 0a 20 20 69 6e  ymbol **b){.  in
1efd0 74 20 69 31 20 3d 20 28 2a 2a 61 29 2e 69 6e 64  t i1 = (**a).ind
1efe0 65 78 20 2b 20 31 30 30 30 30 30 30 30 2a 28 28  ex + 10000000*((
1eff0 2a 2a 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27  **a).name[0]>'Z'
1f000 29 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 28 2a  );.  int i2 = (*
1f010 2a 62 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30  *b).index + 1000
1f020 30 30 30 30 2a 28 28 2a 2a 62 29 2e 6e 61 6d 65  0000*((**b).name
1f030 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 72 65 74 75  [0]>'Z');.  retu
1f040 72 6e 20 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20  rn i1-i2;.}../* 
1f050 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1f060 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1f070 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1f080 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
1f090 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
1f0a0 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a  f type "x2"..*/.
1f0b0 73 74 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20  struct s_x2 {.  
1f0c0 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
1f0d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1f0e0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1f0f0 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
1f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f110 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
1f120 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
1f130 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1f140 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f160 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
1f170 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
1f180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1f190 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
1f1a0 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
1f1b0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
1f1c0 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
1f1d0 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
1f1e0 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
1f1f0 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x2node **ht;  /
1f200 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
1f210 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
1f220 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
1f230 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1f240 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
1f250 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
1f260 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
1f270 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
1f280 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79  type "x2"..*/.ty
1f290 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
1f2a0 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  2node {.  struct
1f2b0 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20   symbol *data;  
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
1f2e0 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20   char *key;     
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f300 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74   The key */.  st
1f310 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e  ruct s_x2node *n
1f320 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
1f330 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
1f340 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
1f350 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66  uct s_x2node **f
1f360 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
1f370 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f  s link */.} x2no
1f380 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
1f390 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
1f3a0 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
1f3b0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
1f3c0 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
1f3d0 63 20 73 74 72 75 63 74 20 73 5f 78 32 20 2a 78  c struct s_x2 *x
1f3e0 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  2a;../* Allocate
1f3f0 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
1f400 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
1f410 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a   Symbol_init(){.
1f420 20 20 69 66 28 20 78 32 61 20 29 20 72 65 74 75    if( x2a ) retu
1f430 72 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72  rn;.  x2a = (str
1f440 75 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63  uct s_x2*)malloc
1f450 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
1f460 73 5f 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x2) );.  if( x
1f470 32 61 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73  2a ){.    x2a->s
1f480 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78  ize = 128;.    x
1f490 32 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  2a->count = 0;. 
1f4a0 20 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78     x2a->tbl = (x
1f4b0 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a  2node*)malloc( .
1f4c0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32        (sizeof(x2
1f4d0 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
1f4e0 32 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a  2node*))*128 );.
1f4f0 20 20 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c      if( x2a->tbl
1f500 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
1f510 65 28 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32  e(x2a);.      x2
1f520 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
1f530 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1f540 20 20 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28       x2a->ht = (
1f550 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e  x2node**)&(x2a->
1f560 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20  tbl[128]);.     
1f570 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b   for(i=0; i<128;
1f580 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d   i++) x2a->ht[i]
1f590 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1f5a0 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
1f5b0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
1f5c0 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
1f5d0 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
1f5e0 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
1f5f0 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
1f600 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
1f610 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
1f620 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 64 61 74  ymbol_insert(dat
1f630 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20 73 79  a,key).struct sy
1f640 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 63 68 61 72  mbol *data;.char
1f650 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 32 6e 6f 64   *key;.{.  x2nod
1f660 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a  e *np;.  int h;.
1f670 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28    int ph;..  if(
1f680 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
1f690 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61   0;.  ph = strha
1f6a0 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70  sh(key);.  h = p
1f6b0 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  h & (x2a->size-1
1f6c0 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68  );.  np = x2a->h
1f6d0 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1f6e0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
1f6f0 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
1f700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1f710 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
1f720 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
1f730 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
1f740 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
1f750 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
1f760 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
1f770 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1f780 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
1f790 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
1f7a0 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75 6e 74    if( x2a->count
1f7b0 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x2a->size ){. 
1f7c0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
1f7d0 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
1f7e0 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
1f7f0 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20  int i,size;.    
1f800 73 74 72 75 63 74 20 73 5f 78 32 20 61 72 72 61  struct s_x2 arra
1f810 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
1f820 65 20 3d 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e  e = size = x2a->
1f830 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
1f840 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63  y.count = x2a->c
1f850 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
1f860 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d  tbl = (x2node*)m
1f870 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69  alloc(.      (si
1f880 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73  zeof(x2node) + s
1f890 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a  izeof(x2node*))*
1f8a0 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  size );.    if( 
1f8b0 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
1f8c0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
1f8d0 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
1f8e0 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
1f8f0 72 72 61 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64  rray.ht = (x2nod
1f900 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
1f910 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  size]);.    for(
1f920 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
1f930 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
1f940 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
1f950 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x2a->count; i+
1f960 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64 65  +){.      x2node
1f970 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
1f980 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
1f990 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x2a->tbl[i]);. 
1f9a0 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68       h = strhash
1f9b0 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28  (oldnp->key) & (
1f9c0 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  size-1);.      n
1f9d0 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
1f9e0 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
1f9f0 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
1fa00 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
1fa10 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
1fa20 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
1fa30 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
1fa40 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
1fa50 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b  ->key = oldnp->k
1fa60 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ey;.      newnp-
1fa70 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
1fa80 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
1fa90 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
1faa0 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
1fab0 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
1fac0 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
1fad0 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x2a->tbl);.  
1fae0 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79 3b 0a    *x2a = array;.
1faf0 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
1fb00 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
1fb10 20 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d    h = ph & (x2a-
1fb20 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
1fb30 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d   &(x2a->tbl[x2a-
1fb40 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
1fb50 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e  ->key = key;.  n
1fb60 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
1fb70 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d    if( x2a->ht[h]
1fb80 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x2a->ht[h]->f
1fb90 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
1fba0 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
1fbb0 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32  x2a->ht[h];.  x2
1fbc0 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
1fbd0 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32   np->from = &(x2
1fbe0 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
1fbf0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
1fc00 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1fc10 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
1fc20 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
1fc30 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
1fc40 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
1fc50 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f   */.struct symbo
1fc60 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6b  l *Symbol_find(k
1fc70 65 79 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b  ey).char *key;.{
1fc80 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 32 6e 6f  .  int h;.  x2no
1fc90 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
1fca0 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  2a==0 ) return 0
1fcb0 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28  ;.  h = strhash(
1fcc0 6b 65 79 29 20 26 20 28 78 32 61 2d 3e 73 69 7a  key) & (x2a->siz
1fcd0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61  e-1);.  np = x2a
1fce0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
1fcf0 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
1fd00 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  strcmp(np->key,k
1fd10 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
1fd20 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
1fd30 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
1fd40 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
1fd50 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
1fd60 74 68 65 20 6e 2d 74 68 20 64 61 74 61 2e 20 20  the n-th data.  
1fd70 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
1fd80 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
1fd90 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
1fda0 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 6e  ol *Symbol_Nth(n
1fdb0 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 74 72  ).int n;.{.  str
1fdc0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
1fdd0 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26 20 6e  ;.  if( x2a && n
1fde0 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f  >0 && n<=x2a->co
1fdf0 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20  unt ){.    data 
1fe00 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e  = x2a->tbl[n-1].
1fe10 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  data;.  }else{. 
1fe20 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d     data = 0;.  }
1fe30 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a  .  return data;.
1fe40 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
1fe50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72   size of the arr
1fe60 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c  ay */.int Symbol
1fe70 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74  _count().{.  ret
1fe80 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63  urn x2a ? x2a->c
1fe90 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  ount : 0;.}../* 
1fea0 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
1feb0 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
1fec0 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
1fed0 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
1fee0 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
1fef0 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
1ff00 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
1ff10 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
1ff20 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
1ff30 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
1ff40 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
1ff50 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61  ymbol **Symbol_a
1ff60 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
1ff70 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72  uct symbol **arr
1ff80 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65  ay;.  int i,size
1ff90 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ;.  if( x2a==0 )
1ffa0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a   return 0;.  siz
1ffb0 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  e = x2a->count;.
1ffc0 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63    array = (struc
1ffd0 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 6d 61 6c 6c  t symbol **)mall
1ffe0 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
1fff0 74 20 73 79 6d 62 6f 6c 20 2a 29 2a 73 69 7a 65  t symbol *)*size
20000 20 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20   );.  if( array 
20010 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
20020 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  i<size; i++) arr
20030 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c  ay[i] = x2a->tbl
20040 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20  [i].data;.  }.  
20050 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a  return array;.}.
20060 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
20070 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a  configurations *
20080 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28  /.int Configcmp(
20090 61 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  a,b).struct conf
200a0 69 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f  ig *a;.struct co
200b0 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74  nfig *b;.{.  int
200c0 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d   x;.  x = a->rp-
200d0 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e  >index - b->rp->
200e0 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d  index;.  if( x==
200f0 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d  0 ) x = a->dot -
20100 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72   b->dot;.  retur
20110 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61  n x;.}../* Compa
20120 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 2a 2f  re two states */
20130 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61  .PRIVATE int sta
20140 74 65 63 6d 70 28 61 2c 62 29 0a 73 74 72 75 63  tecmp(a,b).struc
20150 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72  t config *a;.str
20160 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b  uct config *b;.{
20170 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72  .  int rc;.  for
20180 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20  (rc=0; rc==0 && 
20190 61 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70  a && b;  a=a->bp
201a0 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20  , b=b->bp){.    
201b0 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65  rc = a->rp->inde
201c0 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78  x - b->rp->index
201d0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20  ;.    if( rc==0 
201e0 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20  ) rc = a->dot - 
201f0 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66  b->dot;.  }.  if
20200 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
20210 66 28 20 61 20 29 20 72 63 20 3d 20 31 3b 0a 20  f( a ) rc = 1;. 
20220 20 20 20 69 66 28 20 62 20 29 20 72 63 20 3d 20     if( b ) rc = 
20230 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
20240 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20   rc;.}../* Hash 
20250 61 20 73 74 61 74 65 20 2a 2f 0a 50 52 49 56 41  a state */.PRIVA
20260 54 45 20 69 6e 74 20 73 74 61 74 65 68 61 73 68  TE int statehash
20270 28 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  (a).struct confi
20280 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d  g *a;.{.  int h=
20290 30 3b 0a 20 20 77 68 69 6c 65 28 20 61 20 29 7b  0;.  while( a ){
202a0 0a 20 20 20 20 68 20 3d 20 68 2a 35 37 31 20 2b  .    h = h*571 +
202b0 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37   a->rp->index*37
202c0 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61   + a->dot;.    a
202d0 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20   = a->bp;.  }.  
202e0 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
202f0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
20300 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20 2a  tate structure *
20310 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  /.struct state *
20320 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20  State_new().{.  
20330 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65  struct state *ne
20340 77 3b 0a 20 20 6e 65 77 20 3d 20 28 73 74 72 75  w;.  new = (stru
20350 63 74 20 73 74 61 74 65 20 2a 29 6d 61 6c 6c 6f  ct state *)mallo
20360 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
20370 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d   state) );.  Mem
20380 6f 72 79 43 68 65 63 6b 28 6e 65 77 29 3b 0a 20  oryCheck(new);. 
20390 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a   return new;.}..
203a0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
203b0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
203c0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
203d0 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
203e0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
203f0 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a  y of type "x3"..
20400 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b  */.struct s_x3 {
20410 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
20420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20430 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
20440 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
20450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
20470 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
20480 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
20490 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
204a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204b0 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
204c0 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
204e0 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
204f0 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
20500 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
20510 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x3node *tbl;  /*
20520 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
20530 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
20540 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x3node **ht;
20550 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
20560 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
20570 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
20580 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
20590 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
205a0 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
205b0 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
205c0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
205d0 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f  of type "x3"..*/
205e0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
205f0 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72  s_x3node {.  str
20600 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b  uct state *data;
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20620 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
20630 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
20640 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20   *key;          
20650 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
20660 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  key */.  struct 
20670 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x3node *next; 
20680 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
20690 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
206a0 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
206b0 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x3node **from; 
206c0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
206d0 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a  k */.} x3node;..
206e0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
206f0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
20700 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
20710 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
20720 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
20730 75 63 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a  uct s_x3 *x3a;..
20740 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
20750 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
20760 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74  ray */.void Stat
20770 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
20780 78 33 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x3a ) return;.  
20790 78 33 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x3a = (struct s_
207a0 78 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x3*)malloc( size
207b0 6f 66 28 73 74 72 75 63 74 20 73 5f 78 33 29 20  of(struct s_x3) 
207c0 29 3b 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a  );.  if( x3a ){.
207d0 20 20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20      x3a->size = 
207e0 31 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f  128;.    x3a->co
207f0 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61  unt = 0;.    x3a
20800 2d 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a  ->tbl = (x3node*
20810 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20  )malloc( .      
20820 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20  (sizeof(x3node) 
20830 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a  + sizeof(x3node*
20840 29 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66  ))*128 );.    if
20850 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x3a->tbl==0 ){
20860 0a 20 20 20 20 20 20 66 72 65 65 28 78 33 61 29  .      free(x3a)
20870 3b 0a 20 20 20 20 20 20 78 33 61 20 3d 20 30 3b  ;.      x3a = 0;
20880 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20890 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
208a0 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65  3a->ht = (x3node
208b0 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32  **)&(x3a->tbl[12
208c0 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  8]);.      for(i
208d0 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20  =0; i<128; i++) 
208e0 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x3a->ht[i] = 0;.
208f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49      }.  }.}./* I
20900 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
20910 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61  rd into the arra
20920 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  y.  Return TRUE 
20930 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
20940 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74  * Prior data wit
20950 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
20960 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65  s NOT overwritte
20970 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69  n */.int State_i
20980 6e 73 65 72 74 28 64 61 74 61 2c 6b 65 79 29 0a  nsert(data,key).
20990 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61  struct state *da
209a0 74 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ta;.struct confi
209b0 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 33 6e 6f  g *key;.{.  x3no
209c0 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b  de *np;.  int h;
209d0 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66  .  int ph;..  if
209e0 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x3a==0 ) retur
209f0 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 61 74  n 0;.  ph = stat
20a00 65 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20  ehash(key);.  h 
20a10 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a  = ph & (x3a->siz
20a20 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61  e-1);.  np = x3a
20a30 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
20a40 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
20a50 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79  statecmp(np->key
20a60 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,key)==0 ){.    
20a70 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
20a80 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
20a90 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
20aa0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
20ab0 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
20ac0 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
20ad0 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
20ae0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
20af0 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
20b00 0a 20 20 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e  .  }.  if( x3a->
20b10 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65  count>=x3a->size
20b20 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
20b30 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
20b40 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
20b50 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  .    int i,size;
20b60 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 33  .    struct s_x3
20b70 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
20b80 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20  y.size = size = 
20b90 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x3a->size*2;.   
20ba0 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
20bb0 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  3a->count;.    a
20bc0 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f  rray.tbl = (x3no
20bd0 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20  de*)malloc(.    
20be0 20 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65    (sizeof(x3node
20bf0 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64  ) + sizeof(x3nod
20c00 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20  e*))*size );.   
20c10 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
20c20 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
20c30 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
20c40 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
20c50 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
20c60 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x3node**)&(array
20c70 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20  .tbl[size]);.   
20c80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
20c90 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
20ca0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
20cb0 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e  i=0; i<x3a->coun
20cc0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
20cd0 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  3node *oldnp, *n
20ce0 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
20cf0 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69  p = &(x3a->tbl[i
20d00 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74  ]);.      h = st
20d10 61 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b  atehash(oldnp->k
20d20 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a  ey) & (size-1);.
20d30 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28        newnp = &(
20d40 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20  array.tbl[i]);. 
20d50 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68       if( array.h
20d60 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b  t[h] ) array.ht[
20d70 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77  h]->from = &(new
20d80 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20  np->next);.     
20d90 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61   newnp->next = a
20da0 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20  rray.ht[h];.    
20db0 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f    newnp->key = o
20dc0 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20  ldnp->key;.     
20dd0 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f   newnp->data = o
20de0 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20  ldnp->data;.    
20df0 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20    newnp->from = 
20e00 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a  &(array.ht[h]);.
20e10 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68        array.ht[h
20e20 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d  ] = newnp;.    }
20e30 0a 20 20 20 20 66 72 65 65 28 78 33 61 2d 3e 74  .    free(x3a->t
20e40 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20  bl);.    *x3a = 
20e50 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20  array;.  }.  /* 
20e60 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
20e70 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20  ata */.  h = ph 
20e80 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
20e90 0a 20 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74  .  np = &(x3a->t
20ea0 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d  bl[x3a->count++]
20eb0 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b  );.  np->key = k
20ec0 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d  ey;.  np->data =
20ed0 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 33 61   data;.  if( x3a
20ee0 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68  ->ht[h] ) x3a->h
20ef0 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
20f00 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e  p->next);.  np->
20f10 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68  next = x3a->ht[h
20f20 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20  ];.  x3a->ht[h] 
20f30 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d  = np;.  np->from
20f40 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29   = &(x3a->ht[h])
20f50 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
20f60 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
20f70 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73  nter to data ass
20f80 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76  igned to the giv
20f90 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20  en key.  Return 
20fa0 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75  NULL.** if no su
20fb0 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63  ch key. */.struc
20fc0 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66  t state *State_f
20fd0 69 6e 64 28 6b 65 79 29 0a 73 74 72 75 63 74 20  ind(key).struct 
20fe0 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20  config *key;.{. 
20ff0 20 69 6e 74 20 68 3b 0a 20 20 78 33 6e 6f 64 65   int h;.  x3node
21000 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61   *np;..  if( x3a
21010 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
21020 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28    h = statehash(
21030 6b 65 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a  key) & (x3a->siz
21040 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61  e-1);.  np = x3a
21050 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
21060 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
21070 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79  statecmp(np->key
21080 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
21090 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
210a0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
210b0 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
210c0 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
210d0 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  n an array of po
210e0 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61  inters to all da
210f0 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ta in the table.
21100 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73  .** The array is
21110 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
21120 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e  alloc.  Return N
21130 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c  ULL if memory al
21140 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62  location.** prob
21150 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20  lems, or if the 
21160 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20  array is empty. 
21170 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
21180 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  **State_arrayof(
21190 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ).{.  struct sta
211a0 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e  te **array;.  in
211b0 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20  t i,size;.  if( 
211c0 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x3a==0 ) return 
211d0 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 33 61 2d  0;.  size = x3a-
211e0 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20  >count;.  array 
211f0 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20  = (struct state 
21200 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  **)malloc( sizeo
21210 66 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  f(struct state *
21220 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  )*size );.  if( 
21230 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72  array ){.    for
21240 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
21250 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33  +) array[i] = x3
21260 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a  a->tbl[i].data;.
21270 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72    }.  return arr
21280 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61  ay;.}../* Hash a
21290 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a   configuration *
212a0 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f  /.PRIVATE int co
212b0 6e 66 69 67 68 61 73 68 28 61 29 0a 73 74 72 75  nfighash(a).stru
212c0 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a  ct config *a;.{.
212d0 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 68 20 3d    int h=0;.  h =
212e0 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e   h*571 + a->rp->
212f0 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f  index*37 + a->do
21300 74 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d  t;.  return h;.}
21310 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
21320 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
21330 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
21340 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
21350 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
21360 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22  ray of type "x4"
21370 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 34  ..*/.struct s_x4
21380 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
21390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
213a0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
213b0 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
213c0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
213d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
213e0 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
213f0 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
21400 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
21430 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
21440 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
21450 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
21460 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
21470 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
21480 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x4node *tbl;  
21490 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
214a0 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
214b0 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68  uct s_x4node **h
214c0 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
214d0 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
214e0 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
214f0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
21500 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
21510 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
21520 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
21530 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
21540 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a  y of type "x4"..
21550 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
21560 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73  t s_x4node {.  s
21570 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61  truct config *da
21580 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
21590 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
215a0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
215b0 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  4node *next;   /
215c0 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
215d0 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
215e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34  */.  struct s_x4
215f0 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
21600 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
21610 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x4node;../* 
21620 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
21630 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
21640 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
21650 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
21660 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
21670 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20   s_x4 *x4a;../* 
21680 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
21690 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
216a0 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74   */.void Configt
216b0 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69  able_init(){.  i
216c0 66 28 20 78 34 61 20 29 20 72 65 74 75 72 6e 3b  f( x4a ) return;
216d0 0a 20 20 78 34 61 20 3d 20 28 73 74 72 75 63 74  .  x4a = (struct
216e0 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x4*)malloc( s
216f0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
21700 34 29 20 29 3b 0a 20 20 69 66 28 20 78 34 61 20  4) );.  if( x4a 
21710 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a 65  ){.    x4a->size
21720 20 3d 20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e   = 64;.    x4a->
21730 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  count = 0;.    x
21740 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64  4a->tbl = (x4nod
21750 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20  e*)malloc( .    
21760 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65    (sizeof(x4node
21770 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64  ) + sizeof(x4nod
21780 65 2a 29 29 2a 36 34 20 29 3b 0a 20 20 20 20 69  e*))*64 );.    i
21790 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29  f( x4a->tbl==0 )
217a0 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 34 61  {.      free(x4a
217b0 29 3b 0a 20 20 20 20 20 20 78 34 61 20 3d 20 30  );.      x4a = 0
217c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
217d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
217e0 78 34 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64  x4a->ht = (x4nod
217f0 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36  e**)&(x4a->tbl[6
21800 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4]);.      for(i
21810 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78  =0; i<64; i++) x
21820 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  4a->ht[i] = 0;. 
21830 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
21840 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
21850 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
21860 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
21870 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
21880 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
21890 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
218a0 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
218b0 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61   */.int Configta
218c0 62 6c 65 5f 69 6e 73 65 72 74 28 64 61 74 61 29  ble_insert(data)
218d0 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
218e0 64 61 74 61 3b 0a 7b 0a 20 20 78 34 6e 6f 64 65  data;.{.  x4node
218f0 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20   *np;.  int h;. 
21900 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20   int ph;..  if( 
21910 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x4a==0 ) return 
21920 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69 67  0;.  ph = config
21930 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20  hash(data);.  h 
21940 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a  = ph & (x4a->siz
21950 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61  e-1);.  np = x4a
21960 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
21970 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
21980 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61  Configcmp(np->da
21990 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20  ta,data)==0 ){. 
219a0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
219b0 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
219c0 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
219d0 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
219e0 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
219f0 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
21a00 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
21a10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
21a20 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
21a30 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34  xt;.  }.  if( x4
21a40 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73  a->count>=x4a->s
21a50 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
21a60 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
21a70 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
21a80 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69   */.    int i,si
21a90 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
21aa0 5f 78 34 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x4 array;.    a
21ab0 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65  rray.size = size
21ac0 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x4a->size*2;.
21ad0 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
21ae0 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x4a->count;.  
21af0 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
21b00 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20  4node*)malloc(. 
21b10 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e       (sizeof(x4n
21b20 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34  ode) + sizeof(x4
21b30 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a  node*))*size );.
21b40 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
21b50 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
21b60 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
21b70 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
21b80 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
21b90 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x4node**)&(ar
21ba0 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
21bb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
21bc0 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
21bd0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
21be0 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63  or(i=0; i<x4a->c
21bf0 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
21c00 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x4node *oldnp,
21c10 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
21c20 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62  ldnp = &(x4a->tb
21c30 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
21c40 20 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e   confighash(oldn
21c50 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65  p->data) & (size
21c60 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
21c70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
21c80 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
21c90 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
21ca0 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
21cb0 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
21cc0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
21cd0 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
21ce0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
21cf0 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
21d00 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
21d10 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
21d20 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
21d30 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
21d40 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
21d50 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x4a->tbl);.    *
21d60 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x4a = array;.  }
21d70 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
21d80 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
21d90 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69   = ph & (x4a->si
21da0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
21db0 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f  x4a->tbl[x4a->co
21dc0 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64  unt++]);.  np->d
21dd0 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
21de0 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x4a->ht[h] ) x
21df0 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  4a->ht[h]->from 
21e00 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
21e10 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d   np->next = x4a-
21e20 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68  >ht[h];.  x4a->h
21e30 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
21e40 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68  >from = &(x4a->h
21e50 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
21e60 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
21e70 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
21e80 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
21e90 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
21ea0 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
21eb0 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
21ec0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
21ed0 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28  onfigtable_find(
21ee0 6b 65 79 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  key).struct conf
21ef0 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74  ig *key;.{.  int
21f00 20 68 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70   h;.  x4node *np
21f10 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  ;..  if( x4a==0 
21f20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
21f30 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6b 65 79  = confighash(key
21f40 29 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31  ) & (x4a->size-1
21f50 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68  );.  np = x4a->h
21f60 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
21f70 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e  p ){.    if( Con
21f80 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  figcmp(np->data,
21f90 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
21fa0 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
21fb0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
21fc0 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
21fd0 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65   0;.}../* Remove
21fe0 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74   all data from t
21ff0 68 65 20 74 61 62 6c 65 2e 20 20 50 61 73 73 20  he table.  Pass 
22000 65 61 63 68 20 64 61 74 61 20 74 6f 20 74 68 65  each data to the
22010 20 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a   function "f".**
22020 20 61 73 20 69 74 20 69 73 20 72 65 6d 6f 76 65   as it is remove
22030 64 2e 20 20 28 22 66 22 20 6d 61 79 20 62 65 20  d.  ("f" may be 
22040 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74 68  null to avoid th
22050 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69  is step.) */.voi
22060 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c  d Configtable_cl
22070 65 61 72 28 66 29 0a 69 6e 74 28 2a 66 29 28 2f  ear(f).int(*f)(/
22080 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  * struct config 
22090 2a 20 2a 2f 29 3b 0a 7b 0a 20 20 69 6e 74 20 69  * */);.{.  int i
220a0 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c  ;.  if( x4a==0 |
220b0 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20  | x4a->count==0 
220c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
220d0 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78  f ) for(i=0; i<x
220e0 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20  4a->count; i++) 
220f0 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d  (*f)(x4a->tbl[i]
22100 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d  .data);.  for(i=
22110 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20  0; i<x4a->size; 
22120 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20  i++) x4a->ht[i] 
22130 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e  = 0;.  x4a->coun
22140 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  t = 0;.  return;
22150 0a 7d 0a                                         .}.