/ Hex Artifact Content
Login

Artifact c8c8b25ab1ac8156b3ad83ba4ea1bf00d5e07f5a:


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 69 66 28 20 72 70 2d 3e 63   0;..  if( rp->c
173a0 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 70  ode==0 ){.    rp
173b0 2d 3e 63 6f 64 65 20 3d 20 22 5c 6e 22 3b 0a 20  ->code = "\n";. 
173c0 20 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70     rp->line = rp
173d0 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a  ->ruleline;.  }.
173e0 0a 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c  .  append_str(0,
173f0 30 2c 30 2c 30 29 3b 0a 20 20 66 6f 72 28 63 70  0,0,0);.  for(cp
17400 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20  =rp->code; *cp; 
17410 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69  cp++){.    if( i
17420 73 61 6c 70 68 61 28 2a 63 70 29 20 26 26 20 28  salpha(*cp) && (
17430 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20  cp==rp->code || 
17440 28 21 69 73 61 6c 6e 75 6d 28 63 70 5b 2d 31 5d  (!isalnum(cp[-1]
17450 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27  ) && cp[-1]!='_'
17460 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  )) ){.      char
17470 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 66 6f   saved;.      fo
17480 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20 69 73  r(xp= &cp[1]; is
17490 61 6c 6e 75 6d 28 2a 78 70 29 20 7c 7c 20 2a 78  alnum(*xp) || *x
174a0 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20  p=='_'; xp++);. 
174b0 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 78 70       saved = *xp
174c0 3b 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 30 3b  ;.      *xp = 0;
174d0 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  .      if( rp->l
174e0 68 73 61 6c 69 61 73 20 26 26 20 73 74 72 63 6d  hsalias && strcm
174f0 70 28 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  p(cp,rp->lhsalia
17500 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  s)==0 ){.       
17510 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 67   append_str("yyg
17520 6f 74 6f 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30  otominor.yy%d",0
17530 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 2c  ,rp->lhs->dtnum,
17540 30 29 3b 0a 20 20 20 20 20 20 20 20 63 70 20 3d  0);.        cp =
17550 20 78 70 3b 0a 20 20 20 20 20 20 20 20 6c 68 73   xp;.        lhs
17560 75 73 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  used = 1;.      
17570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
17580 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
17590 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
175a0 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61      if( rp->rhsa
175b0 6c 69 61 73 5b 69 5d 20 26 26 20 73 74 72 63 6d  lias[i] && strcm
175c0 70 28 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61  p(cp,rp->rhsalia
175d0 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  s[i])==0 ){.    
175e0 20 20 20 20 20 20 20 20 69 66 28 20 63 70 21 3d          if( cp!=
175f0 72 70 2d 3e 63 6f 64 65 20 26 26 20 63 70 5b 2d  rp->code && cp[-
17600 31 5d 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20 20  1]=='@' ){.     
17610 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
17620 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  he argument is o
17630 66 20 74 68 65 20 66 6f 72 6d 20 40 58 20 74 68  f the form @X th
17640 65 6e 20 73 75 62 73 74 69 74 75 74 65 64 0a 20  en substituted. 
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
17660 74 68 65 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72  the token number
17670 20 6f 66 20 58 2c 20 6e 6f 74 20 74 68 65 20 76   of X, not the v
17680 61 6c 75 65 20 6f 66 20 58 20 2a 2f 0a 20 20 20  alue of X */.   
17690 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
176a0 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d  d_str("yymsp[%d]
176b0 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d  .major",-1,i-rp-
176c0 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a 20 20 20 20  >nrhs+1,0);.    
176d0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
176f0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
17700 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
17710 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
17720 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
17730 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
17740 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
17750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
17760 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 73     dtnum = sp->s
17770 75 62 73 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d 3b  ubsym[0]->dtnum;
17780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
17790 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
177a0 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70        dtnum = sp
177b0 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  ->dtnum;.       
177c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
177d0 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
177e0 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  r("yymsp[%d].min
177f0 6f 72 2e 79 79 25 64 22 2c 30 2c 69 2d 72 70 2d  or.yy%d",0,i-rp-
17800 3e 6e 72 68 73 2b 31 2c 20 64 74 6e 75 6d 29 3b  >nrhs+1, dtnum);
17810 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
17820 20 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20             cp = 
17830 78 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  xp;.            
17840 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20  used[i] = 1;.   
17850 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17860 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17870 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17880 20 20 20 20 2a 78 70 20 3d 20 73 61 76 65 64 3b      *xp = saved;
17890 0a 20 20 20 20 7d 0a 20 20 20 20 61 70 70 65 6e  .    }.    appen
178a0 64 5f 73 74 72 28 63 70 2c 20 31 2c 20 30 2c 20  d_str(cp, 1, 0, 
178b0 30 29 3b 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  0);.  } /* End l
178c0 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  oop */..  /* Che
178d0 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
178e0 74 68 65 20 4c 48 53 20 68 61 73 20 62 65 65 6e  the LHS has been
178f0 20 75 73 65 64 20 2a 2f 0a 20 20 69 66 28 20 72   used */.  if( r
17900 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 21  p->lhsalias && !
17910 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20 20 45  lhsused ){.    E
17920 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
17930 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
17940 69 6e 65 2c 0a 20 20 20 20 20 20 22 4c 61 62 65  ine,.      "Labe
17950 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25  l \"%s\" for \"%
17960 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
17970 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
17980 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70   rp->lhsalias,rp
17990 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e  ->lhs->name,rp->
179a0 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c  lhsalias);.    l
179b0 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
179c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
179d0 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  ate destructor c
179e0 6f 64 65 20 66 6f 72 20 52 48 53 20 73 79 6d 62  ode for RHS symb
179f0 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20 6e 6f  ols which are no
17a00 74 20 75 73 65 64 20 69 6e 20 74 68 65 0a 20 20  t used in the.  
17a10 2a 2a 20 72 65 64 75 63 65 20 63 6f 64 65 20 2a  ** reduce code *
17a20 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72  /.  for(i=0; i<r
17a30 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
17a40 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c     if( rp->rhsal
17a50 69 61 73 5b 69 5d 20 26 26 20 21 75 73 65 64 5b  ias[i] && !used[
17a60 69 5d 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f  i] ){.      Erro
17a70 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
17a80 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
17a90 2c 0a 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c  ,.        "Label
17aa0 20 25 73 20 66 6f 72 20 5c 22 25 73 28 25 73 29   %s for \"%s(%s)
17ab0 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  \" is never used
17ac0 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e  .",.        rp->
17ad0 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e  rhsalias[i],rp->
17ae0 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d  rhs[i]->name,rp-
17af0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20  >rhsalias[i]);. 
17b00 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
17b10 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
17b20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61   if( rp->rhsalia
17b30 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  s[i]==0 ){.     
17b40 20 69 66 28 20 68 61 73 5f 64 65 73 74 72 75 63   if( has_destruc
17b50 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c  tor(rp->rhs[i],l
17b60 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  emp) ){.        
17b70 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79  append_str("  yy
17b80 5f 64 65 73 74 72 75 63 74 6f 72 28 25 64 2c 26  _destructor(%d,&
17b90 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29  yymsp[%d].minor)
17ba0 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20  ;\n", 0,.       
17bb0 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e      rp->rhs[i]->
17bc0 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73  index,i-rp->nrhs
17bd0 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
17be0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  {.        /* No 
17bf0 64 65 73 74 72 75 63 74 6f 72 20 64 65 66 69 6e  destructor defin
17c00 65 64 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  ed for this term
17c10 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
17c20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 70 2d 3e  }.  }.  if( rp->
17c30 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 70 20 3d  code ){.    cp =
17c40 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c   append_str(0,0,
17c50 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d 3e 63 6f  0,0);.    rp->co
17c60 64 65 20 3d 20 53 74 72 73 61 66 65 28 63 70 3f  de = Strsafe(cp?
17c70 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  cp:"");.  }.}../
17c80 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  * .** Generate c
17c90 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
17ca0 65 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c 65  es when the rule
17cb0 20 22 72 70 22 20 69 73 20 72 65 64 75 63 65 64   "rp" is reduced
17cc0 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  .  Write.** the 
17cd0 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20 20  code to "out".  
17ce0 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f  Make sure lineno
17cf0 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61 74   stays up-to-dat
17d00 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  e..*/.PRIVATE vo
17d10 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74  id emit_code(out
17d20 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29  ,rp,lemp,lineno)
17d30 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75  .FILE *out;.stru
17d40 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 73 74 72  ct rule *rp;.str
17d50 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
17d60 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a  .int *lineno;.{.
17d70 20 63 68 61 72 20 2a 63 70 3b 0a 20 69 6e 74 20   char *cp;. int 
17d80 6c 69 6e 65 63 6e 74 20 3d 20 30 3b 0a 0a 20 2f  linecnt = 0;.. /
17d90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
17da0 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63 65  to do the reduce
17db0 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20   action */. if( 
17dc0 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 74  rp->code ){.   t
17dd0 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
17de0 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66  rp->line,lemp->f
17df0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 66 70 72  ilename);.   fpr
17e00 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73 22 2c 72  intf(out,"{%s",r
17e10 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20 66 6f 72  p->code);.   for
17e20 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63  (cp=rp->code; *c
17e30 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 69  p; cp++){.     i
17e40 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c  f( *cp=='\n' ) l
17e50 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 7d 20 2f  inecnt++;.   } /
17e60 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20  * End loop */.  
17e70 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20   (*lineno) += 3 
17e80 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20 20 20 66 70  + linecnt;.   fp
17e90 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29  rintf(out,"}\n")
17ea0 3b 0a 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69  ;.   tplt_linedi
17eb0 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65  r(out,*lineno,le
17ec0 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d  mp->outname);. }
17ed0 20 2f 2a 20 45 6e 64 20 69 66 28 20 72 70 2d 3e   /* End if( rp->
17ee0 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 72 65 74 75  code ) */.. retu
17ef0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  rn;.}../*.** Pri
17f00 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  nt the definitio
17f10 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75  n of the union u
17f20 73 65 64 20 66 6f 72 20 74 68 65 20 70 61 72 73  sed for the pars
17f30 65 72 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e  er's data stack.
17f40 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63  .** This union c
17f50 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66  ontains fields f
17f60 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c  or every possibl
17f70 65 20 64 61 74 61 20 74 79 70 65 20 66 6f 72 20  e data type for 
17f80 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f  tokens.** and no
17f90 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20  nterminals.  In 
17fa0 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63  the process of c
17fb0 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69  omputing and pri
17fc0 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e  nting this.** un
17fd0 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68  ion, also set th
17fe0 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64  e ".dtnum" field
17ff0 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e   of every termin
18000 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  al and nontermin
18010 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f  al.** symbol..*/
18020 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63  .void print_stac
18030 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70  k_union(out,lemp
18040 2c 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29  ,plineno,mhflag)
18050 0a 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20  .FILE *out;     
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18070 54 68 65 20 6f 75 74 70 75 74 20 73 74 72 65 61  The output strea
18080 6d 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f  m */.struct lemo
18090 6e 20 2a 6c 65 6d 70 3b 20 20 20 20 20 20 20 20  n *lemp;        
180a0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66   /* The main inf
180b0 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
180c0 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 69  this parser */.i
180d0 6e 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20  nt *plineno;    
180e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
180f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e  inter to the lin
18100 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 69 6e 74 20  e number */.int 
18110 6d 68 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20  mhflag;         
18120 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
18130 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61  if generating ma
18140 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70 75 74  keheaders output
18150 20 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c 69 6e 65   */.{.  int line
18160 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20  no = *plineno;  
18170 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75    /* The line nu
18180 6d 62 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70  mber of the outp
18190 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74  ut */.  char **t
181a0 79 70 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ypes;           
181b0 20 20 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c    /* A hash tabl
181c0 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a  e of datatypes *
181d0 2f 0a 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a  /.  int arraysiz
181e0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
181f0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79   Size of the "ty
18200 70 65 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20  pes" array */.  
18210 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b  int maxdtlength;
18220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
18230 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61  imum length of a
18240 6e 79 20 22 2e 64 61 74 61 74 79 70 65 22 20 66  ny ".datatype" f
18250 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20  ield. */.  char 
18260 2a 73 74 64 64 74 3b 20 20 20 20 20 20 20 20 20  *stddt;         
18270 20 20 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64       /* Standard
18280 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  ized name for a 
18290 64 61 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e  datatype */.  in
182a0 74 20 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20  t i,j;          
182b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
182c0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
182d0 74 20 68 61 73 68 3b 20 20 20 20 20 20 20 20 20  t hash;         
182e0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68          /* For h
182f0 61 73 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  ashing the name 
18300 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  of a type */.  c
18310 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
18320 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
18330 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a   of the parser *
18340 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
18350 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
18360 74 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f  types[] and allo
18370 63 61 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a  cate stddt[] */.
18380 20 20 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65    arraysize = le
18390 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b  mp->nsymbol * 2;
183a0 0a 20 20 74 79 70 65 73 20 3d 20 28 63 68 61 72  .  types = (char
183b0 2a 2a 29 6d 61 6c 6c 6f 63 28 20 61 72 72 61 79  **)malloc( array
183c0 73 69 7a 65 20 2a 20 73 69 7a 65 6f 66 28 63 68  size * sizeof(ch
183d0 61 72 2a 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d  ar*) );.  for(i=
183e0 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20  0; i<arraysize; 
183f0 69 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20  i++) types[i] = 
18400 30 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68  0;.  maxdtlength
18410 20 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70   = 0;.  if( lemp
18420 2d 3e 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20  ->vartype ){.   
18430 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 73   maxdtlength = s
18440 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74  trlen(lemp->vart
18450 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ype);.  }.  for(
18460 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
18470 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
18480 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72  int len;.    str
18490 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
184a0 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
184b0 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64  ];.    if( sp->d
184c0 61 74 61 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e  atatype==0 ) con
184d0 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d  tinue;.    len =
184e0 20 73 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61   strlen(sp->data
184f0 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c  type);.    if( l
18500 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29  en>maxdtlength )
18510 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c   maxdtlength = l
18520 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20  en;.  }.  stddt 
18530 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
18540 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b   maxdtlength*2 +
18550 20 31 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65   1 );.  if( type
18560 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30  s==0 || stddt==0
18570 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
18580 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
18590 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20  emory.\n");.    
185a0 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20  exit(1);.  }..  
185b0 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68 20  /* Build a hash 
185c0 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70  table of datatyp
185d0 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22  es. The ".dtnum"
185e0 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73   field of each s
185f0 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69  ymbol.  ** is fi
18600 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65  lled in with the
18610 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73   hash index plus
18620 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20   1.  A ".dtnum" 
18630 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20  value of 0 is.  
18640 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d  ** used for term
18650 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49  inal symbols.  I
18660 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64  f there is no %d
18670 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69  efault_type defi
18680 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20  ned then.  ** 0 
18690 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20  is also used as 
186a0 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65  the .dtnum value
186b0 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   for nonterminal
186c0 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73  s which do not s
186d0 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61  pecify.  ** a da
186e0 74 61 74 79 70 65 20 75 73 69 6e 67 20 74 68 65  tatype using the
186f0 20 25 74 79 70 65 20 64 69 72 65 63 74 69 76 65   %type directive
18700 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
18710 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
18720 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  l; i++){.    str
18730 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
18740 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
18750 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b  ];.    char *cp;
18760 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d  .    if( sp==lem
18770 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20  p->errsym ){.   
18780 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61     sp->dtnum = a
18790 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20  rraysize+1;.    
187a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
187b0 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  }.    if( sp->ty
187c0 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe!=NONTERMINAL 
187d0 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65  || (sp->datatype
187e0 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72  ==0 && lemp->var
187f0 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  type==0) ){.    
18800 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b    sp->dtnum = 0;
18810 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
18820 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20  .    }.    cp = 
18830 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20  sp->datatype;.  
18840 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70    if( cp==0 ) cp
18850 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65   = lemp->vartype
18860 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
18870 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
18880 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20  *cp) ) cp++;.   
18890 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74   while( *cp ) st
188a0 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b  ddt[j++] = *cp++
188b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30  ;.    while( j>0
188c0 20 26 26 20 69 73 73 70 61 63 65 28 73 74 64 64   && isspace(stdd
188d0 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20  t[j-1]) ) j--;. 
188e0 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b     stddt[j] = 0;
188f0 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20  .    hash = 0;. 
18900 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64     for(j=0; stdd
18910 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
18920 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33    hash = hash*53
18930 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20   + stddt[j];.   
18940 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68   }.    hash = (h
18950 61 73 68 20 26 20 30 78 37 66 66 66 66 66 66 66  ash & 0x7fffffff
18960 29 25 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20  )%arraysize;.   
18970 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61   while( types[ha
18980 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  sh] ){.      if(
18990 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61   strcmp(types[ha
189a0 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b  sh],stddt)==0 ){
189b0 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  .        sp->dtn
189c0 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20  um = hash + 1;. 
189d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
189e0 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68      }.      hash
189f0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61  ++;.      if( ha
18a00 73 68 3e 3d 61 72 72 61 79 73 69 7a 65 20 29 20  sh>=arraysize ) 
18a10 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  hash = 0;.    }.
18a20 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61      if( types[ha
18a30 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sh]==0 ){.      
18a40 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68  sp->dtnum = hash
18a50 20 2b 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65   + 1;.      type
18a60 73 5b 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a  s[hash] = (char*
18a70 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28  )malloc( strlen(
18a80 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20  stddt)+1 );.    
18a90 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68    if( types[hash
18aa0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
18ab0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
18ac0 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e  Out of memory.\n
18ad0 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  ");.        exit
18ae0 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
18af0 20 20 20 73 74 72 63 70 79 28 74 79 70 65 73 5b     strcpy(types[
18b00 68 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20  hash],stddt);.  
18b10 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
18b20 69 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66 69  int out the defi
18b30 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45  nition of YYTOKE
18b40 4e 54 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f  NTYPE and YYMINO
18b50 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20  RTYPE */.  name 
18b60 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c  = lemp->name ? l
18b70 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72  emp->name : "Par
18b80 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  se";.  lineno = 
18b90 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20  *plineno;.  if( 
18ba0 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74  mhflag ){ fprint
18bb0 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52  f(out,"#if INTER
18bc0 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  FACE\n"); lineno
18bd0 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ++; }.  fprintf(
18be0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54  out,"#define %sT
18bf0 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e  OKENTYPE %s\n",n
18c00 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74  ame,.    lemp->t
18c10 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74  okentype?lemp->t
18c20 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22  okentype:"void*"
18c30 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
18c40 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70  if( mhflag ){ fp
18c50 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69  rintf(out,"#endi
18c60 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
18c70 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
18c80 2c 22 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20  ,"typedef union 
18c90 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
18ca0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
18cb0 20 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 79 79    %sTOKENTYPE yy
18cc0 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e  0;\n",name); lin
18cd0 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30  eno++;.  for(i=0
18ce0 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
18cf0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 79 70  ++){.    if( typ
18d00 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  es[i]==0 ) conti
18d10 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  nue;.    fprintf
18d20 28 6f 75 74 2c 22 20 20 25 73 20 79 79 25 64 3b  (out,"  %s yy%d;
18d30 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31  \n",types[i],i+1
18d40 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
18d50 20 66 72 65 65 28 74 79 70 65 73 5b 69 5d 29 3b   free(types[i]);
18d60 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
18d70 75 74 2c 22 20 20 69 6e 74 20 79 79 25 64 3b 5c  ut,"  int yy%d;\
18d80 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  n",lemp->errsym-
18d90 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b  >dtnum); lineno+
18da0 2b 3b 0a 20 20 66 72 65 65 28 73 74 64 64 74 29  +;.  free(stddt)
18db0 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73 29 3b  ;.  free(types);
18dc0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
18dd0 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e  } YYMINORTYPE;\n
18de0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
18df0 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  *plineno = linen
18e00 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  o;.}../*.** Retu
18e10 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  rn the name of a
18e20 20 43 20 64 61 74 61 74 79 70 65 20 61 62 6c 65   C datatype able
18e30 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61   to represent va
18e40 6c 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  lues between.** 
18e50 6c 77 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63  lwr and upr, inc
18e60 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  lusive..*/.stati
18e70 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69  c const char *mi
18e80 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
18e90 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72  int lwr, int upr
18ea0 29 7b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20  ){.  if( lwr>=0 
18eb0 29 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d  ){.    if( upr<=
18ec0 32 35 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74  255 ){.      ret
18ed0 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68  urn "unsigned ch
18ee0 61 72 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ar";.    }else i
18ef0 66 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a  f( upr<65535 ){.
18f00 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e        return "un
18f10 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74  signed short int
18f20 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
18f30 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69      return "unsi
18f40 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d  gned int";.    }
18f50 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72  .  }else if( lwr
18f60 3e 3d 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31  >=-127 && upr<=1
18f70 32 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  27 ){.    return
18f80 20 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a   "signed char";.
18f90 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
18fa0 3d 2d 33 32 37 36 37 20 26 26 20 75 70 72 3c 33  =-32767 && upr<3
18fb0 32 37 36 37 20 29 7b 0a 20 20 20 20 72 65 74 75  2767 ){.    retu
18fc0 72 6e 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65  rn "short";.  }e
18fd0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
18fe0 22 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  "int";.  }.}../*
18ff0 0a 2a 2a 20 45 61 63 68 20 73 74 61 74 65 20 63  .** Each state c
19000 6f 6e 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66  ontains a set of
19010 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69   token transacti
19020 6f 6e 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a  on and a set of.
19030 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74  ** nonterminal t
19040 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61  ransactions.  Ea
19050 63 68 20 6f 66 20 74 68 65 73 65 20 73 65 74 73  ch of these sets
19060 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e   makes an instan
19070 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ce.** of the fol
19080 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
19090 2e 20 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74  .  An array of t
190a0 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
190b0 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72  is used.** to or
190c0 64 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e  der the creation
190d0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
190e0 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74  he yy_action[] t
190f0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  able..*/.struct 
19100 61 78 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74  axset {.  struct
19110 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f   state *stp;   /
19120 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
19130 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20   state */.  int 
19140 69 73 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20  isTkn;          
19150 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
19160 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66  tokens.  False f
19170 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73  or non-terminals
19180 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f   */.  int nActio
19190 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
191a0 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
191b0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.};../*.** Com
191c0 70 61 72 65 20 74 6f 20 61 78 73 65 74 20 73 74  pare to axset st
191d0 72 75 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72  ructures for sor
191e0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f  ting purposes.*/
191f0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 78 73 65  .static int axse
19200 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  t_compare(const 
19210 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76  void *a, const v
19220 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63  oid *b){.  struc
19230 74 20 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73  t axset *p1 = (s
19240 74 72 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a  truct axset*)a;.
19250 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
19260 70 32 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  p2 = (struct axs
19270 65 74 2a 29 62 3b 0a 20 20 72 65 74 75 72 6e 20  et*)b;.  return 
19280 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31  p2->nAction - p1
19290 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a  ->nAction;.}../*
192a0 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72   Generate C sour
192b0 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ce code for the 
192c0 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52  parser */.void R
192d0 65 70 6f 72 74 54 61 62 6c 65 28 6c 65 6d 70 2c  eportTable(lemp,
192e0 20 6d 68 66 6c 61 67 29 0a 73 74 72 75 63 74 20   mhflag).struct 
192f0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74  lemon *lemp;.int
19300 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 2f 2a 20   mhflag;     /* 
19310 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65  Output in makehe
19320 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20  aders format if 
19330 74 72 75 65 20 2a 2f 0a 7b 0a 20 20 46 49 4c 45  true */.{.  FILE
19340 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68   *out, *in;.  ch
19350 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
19360 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f  ];.  int  lineno
19370 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
19380 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
19390 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74  action *ap;.  st
193a0 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
193b0 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20 2a   struct acttab *
193c0 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69  pActtab;.  int i
193d0 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , j, n;.  char *
193e0 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b  name;.  int mnTk
193f0 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74  nOfst, mxTknOfst
19400 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74  ;.  int mnNtOfst
19410 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74  , mxNtOfst;.  st
19420 72 75 63 74 20 61 78 73 65 74 20 2a 61 78 3b 0a  ruct axset *ax;.
19430 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65  .  in = tplt_ope
19440 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69  n(lemp);.  if( i
19450 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
19460 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e   out = file_open
19470 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29  (lemp,".c","wb")
19480 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29  ;.  if( out==0 )
19490 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  {.    fclose(in)
194a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
194b0 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  }.  lineno = 1;.
194c0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
194d0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
194e0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
194f0 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75  nerate the inclu
19500 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20  de code, if any 
19510 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
19520 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69  out,lemp,lemp->i
19530 6e 63 6c 75 64 65 2c 6c 65 6d 70 2d 3e 69 6e 63  nclude,lemp->inc
19540 6c 75 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b  ludeln,&lineno);
19550 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
19560 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 20  .    char *name 
19570 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28  = file_makename(
19580 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20  lemp, ".h");.   
19590 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
195a0 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22  nclude \"%s\"\n"
195b0 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  , name); lineno+
195c0 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e 61 6d 65  +;.    free(name
195d0 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  );.  }.  tplt_xf
195e0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
195f0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
19600 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64    /* Generate #d
19610 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74  efines for all t
19620 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d  okens */.  if( m
19630 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61  hflag ){.    cha
19640 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20 66  r *prefix;.    f
19650 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
19660 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
19670 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
19680 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
19690 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65  ix ) prefix = le
196a0 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  mp->tokenprefix;
196b0 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20  .    else       
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
196d0 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f  fix = "";.    fo
196e0 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
196f0 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
19700 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
19710 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  t,"#define %s%-3
19720 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78  0s %2d\n",prefix
19730 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
19740 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
19750 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
19760 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
19770 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
19780 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
19790 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
197a0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
197b0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
197c0 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73 20  ate the defines 
197d0 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
197e0 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45  ,"#define YYCODE
197f0 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
19800 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
19810 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  e(0, lemp->nsymb
19820 6f 6c 2b 35 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ol+5)); lineno++
19830 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
19840 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44  "#define YYNOCOD
19850 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73  E %d\n",lemp->ns
19860 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e  ymbol+1);  linen
19870 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
19880 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43  ut,"#define YYAC
19890 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a  TIONTYPE %s\n",.
198a0 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
198b0 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e  _type(0, lemp->n
198c0 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c  state+lemp->nrul
198d0 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  e+5));  lineno++
198e0 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69  ;.  if( lemp->wi
198f0 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 66 70  ldcard ){.    fp
19900 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
19910 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20 25 64  ne YYWILDCARD %d
19920 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70  \n",.       lemp
19930 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65  ->wildcard->inde
19940 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
19950 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  }.  print_stack_
19960 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26  union(out,lemp,&
19970 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a  lineno,mhflag);.
19980 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
19990 23 69 66 6e 64 65 66 20 59 59 53 54 41 43 4b 44  #ifndef YYSTACKD
199a0 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  EPTH\n"); lineno
199b0 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
199c0 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20  stacksize ){.   
199d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
199e0 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50  efine YYSTACKDEP
199f0 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73  TH %s\n",lemp->s
19a00 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65  tacksize);  line
19a10 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no++;.  }else{. 
19a20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19a30 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
19a40 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c  EPTH 100\n");  l
19a50 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
19a60 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e  printf(out, "#en
19a70 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
19a80 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  +;.  if( mhflag 
19a90 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
19aa0 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
19ab0 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
19ac0 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  .  }.  name = le
19ad0 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
19ae0 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
19af0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67  .  if( lemp->arg
19b00 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d   && lemp->arg[0]
19b10 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
19b20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 6c 65     i = strlen(le
19b30 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77 68  mp->arg);.    wh
19b40 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 69 73 73  ile( i>=1 && iss
19b50 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b 69  pace(lemp->arg[i
19b60 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20  -1]) ) i--;.    
19b70 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28  while( i>=1 && (
19b80 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72  isalnum(lemp->ar
19b90 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d  g[i-1]) || lemp-
19ba0 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20  >arg[i-1]=='_') 
19bb0 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e  ) i--;.    fprin
19bc0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
19bd0 25 73 41 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c  %sARG_SDECL %s;\
19be0 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72  n",name,lemp->ar
19bf0 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  g);  lineno++;. 
19c00 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19c10 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44  #define %sARG_PD
19c20 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c  ECL ,%s\n",name,
19c30 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e  lemp->arg);  lin
19c40 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
19c50 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
19c60 25 73 41 52 47 5f 46 45 54 43 48 20 25 73 20 3d  %sARG_FETCH %s =
19c70 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 5c 6e   yypParser->%s\n
19c80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19c90 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61      name,lemp->a
19ca0 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  rg,&lemp->arg[i]
19cb0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
19cc0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
19cd0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f  define %sARG_STO
19ce0 52 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73  RE yypParser->%s
19cf0 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20   = %s\n",.      
19d00 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
19d10 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c  &lemp->arg[i],&l
19d20 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c  emp->arg[i]);  l
19d30 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65  ineno++;.  }else
19d40 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
19d50 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
19d60 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b  _SDECL\n",name);
19d70 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
19d80 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
19d90 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c  fine %sARG_PDECL
19da0 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65  \n",name);  line
19db0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
19dc0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
19dd0 73 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61  sARG_FETCH\n",na
19de0 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
19df0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19e00 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54  #define %sARG_ST
19e10 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  ORE\n",name); li
19e20 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  neno++;.  }.  if
19e30 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
19e40 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
19e50 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
19e60 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
19e70 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
19e80 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65 6d  NSTATE %d\n",lem
19e90 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69 6e  p->nstate);  lin
19ea0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
19eb0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
19ec0 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d 70  NRULE %d\n",lemp
19ed0 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e  ->nrule);  linen
19ee0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
19ef0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52  ut,"#define YYER
19f00 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c  RORSYMBOL %d\n",
19f10 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e  lemp->errsym->in
19f20 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  dex);  lineno++;
19f30 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19f40 23 64 65 66 69 6e 65 20 59 59 45 52 52 53 59 4d  #define YYERRSYM
19f50 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d  DT yy%d\n",lemp-
19f60 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b  >errsym->dtnum);
19f70 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
19f80 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c  ( lemp->has_fall
19f90 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 70 72 69  back ){.    fpri
19fa0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
19fb0 20 59 59 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22   YYFALLBACK 1\n"
19fc0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
19fd0 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
19fe0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
19ff0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1a000 47 65 6e 65 72 61 74 65 20 74 68 65 20 61 63 74  Generate the act
1a010 69 6f 6e 20 74 61 62 6c 65 20 61 6e 64 20 69 74  ion table and it
1a020 73 20 61 73 73 6f 63 69 61 74 65 73 3a 0a 20 20  s associates:.  
1a030 2a 2a 0a 20 20 2a 2a 20 20 79 79 5f 61 63 74 69  **.  **  yy_acti
1a040 6f 6e 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69  on[]        A si
1a050 6e 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61  ngle table conta
1a060 69 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e  ining all action
1a070 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b  s..  **  yy_look
1a080 61 68 65 61 64 5b 5d 20 20 20 20 20 41 20 74 61  ahead[]     A ta
1a090 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1a0a0 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72  he lookahead for
1a0b0 20 65 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 20   each entry in. 
1a0c0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
1a0d0 20 20 20 20 20 20 20 20 79 79 5f 61 63 74 69 6f          yy_actio
1a0e0 6e 2e 20 20 55 73 65 64 20 74 6f 20 64 65 74 65  n.  Used to dete
1a0f0 63 74 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ct hash collisio
1a100 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69  ns..  **  yy_shi
1a110 66 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72  ft_ofst[]    For
1a120 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65   each state, the
1a130 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f   offset into yy_
1a140 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20  action for.  ** 
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 20 20 20 20 73 68 69 66 74 69 6e 67 20 74 65 72      shifting ter
1a170 6d 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79  minals..  **  yy
1a180 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20  _reduce_ofst[]  
1a190 20 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c   For each state,
1a1a0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f   the offset into
1a1b0 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20   yy_action for. 
1a1c0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
1a1d0 20 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67          shifting
1a1e0 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61   non-terminals a
1a1f0 66 74 65 72 20 61 20 72 65 64 75 63 65 2e 0a 20  fter a reduce.. 
1a200 20 2a 2a 20 20 79 79 5f 64 65 66 61 75 6c 74 5b   **  yy_default[
1a210 5d 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 20  ]       Default 
1a220 61 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  action for each 
1a230 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  state..  */..  /
1a240 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63  * Compute the ac
1a250 74 69 6f 6e 73 20 6f 6e 20 61 6c 6c 20 73 74 61  tions on all sta
1a260 74 65 73 20 61 6e 64 20 63 6f 75 6e 74 20 74 68  tes and count th
1a270 65 6d 20 75 70 20 2a 2f 0a 20 20 61 78 20 3d 20  em up */.  ax = 
1a280 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61  malloc( sizeof(a
1a290 78 5b 30 5d 29 2a 6c 65 6d 70 2d 3e 6e 73 74 61  x[0])*lemp->nsta
1a2a0 74 65 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 78  te*2 );.  if( ax
1a2b0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
1a2c0 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f  tf(stderr,"mallo
1a2d0 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20  c failed\n");.  
1a2e0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
1a2f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1a300 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
1a310 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
1a320 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61  sorted[i];.    a
1a330 78 5b 69 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70  x[i*2].stp = stp
1a340 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73  ;.    ax[i*2].is
1a350 54 6b 6e 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b  Tkn = 1;.    ax[
1a360 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73  i*2].nAction = s
1a370 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20  tp->nTknAct;.   
1a380 20 61 78 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d   ax[i*2+1].stp =
1a390 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32   stp;.    ax[i*2
1a3a0 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20  +1].isTkn = 0;. 
1a3b0 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63     ax[i*2+1].nAc
1a3c0 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41  tion = stp->nNtA
1a3d0 63 74 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f  ct;.  }.  mxTknO
1a3e0 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20  fst = mnTknOfst 
1a3f0 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20  = 0;.  mxNtOfst 
1a400 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a  = mnNtOfst = 0;.
1a410 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
1a420 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20  e action table. 
1a430 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 79   In order to try
1a440 20 74 6f 20 6b 65 65 70 20 74 68 65 20 73 69 7a   to keep the siz
1a450 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 61 63  e of the.  ** ac
1a460 74 69 6f 6e 20 74 61 62 6c 65 20 74 6f 20 61 20  tion table to a 
1a470 6d 69 6e 69 6d 75 6d 2c 20 74 68 65 20 68 65 75  minimum, the heu
1a480 72 69 73 74 69 63 20 6f 66 20 70 6c 61 63 69 6e  ristic of placin
1a490 67 20 74 68 65 20 6c 61 72 67 65 73 74 20 61 63  g the largest ac
1a4a0 74 69 6f 6e 0a 20 20 2a 2a 20 73 65 74 73 20 66  tion.  ** sets f
1a4b0 69 72 73 74 20 69 73 20 75 73 65 64 2e 0a 20 20  irst is used..  
1a4c0 2a 2f 0a 20 20 71 73 6f 72 74 28 61 78 2c 20 6c  */.  qsort(ax, l
1a4d0 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73  emp->nstate*2, s
1a4e0 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78  izeof(ax[0]), ax
1a4f0 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20  set_compare);.  
1a500 70 41 63 74 74 61 62 20 3d 20 61 63 74 74 61 62  pActtab = acttab
1a510 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28  _alloc();.  for(
1a520 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1a530 61 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e  ate*2 && ax[i].n
1a540 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a  Action>0; i++){.
1a550 20 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e      stp = ax[i].
1a560 73 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78 5b  stp;.    if( ax[
1a570 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20  i].isTkn ){.    
1a580 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1a590 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1a5a0 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
1a5b0 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  action;.        
1a5c0 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1a5d0 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  x>=lemp->ntermin
1a5e0 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  al ) continue;. 
1a5f0 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20         action = 
1a600 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
1a610 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20  emp, ap);.      
1a620 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29    if( action<0 )
1a630 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1a640 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e     acttab_action
1a650 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70  (pActtab, ap->sp
1a660 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29  ->index, action)
1a670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a680 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20  stp->iTknOfst = 
1a690 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41  acttab_insert(pA
1a6a0 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66  cttab);.      if
1a6b0 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c  ( stp->iTknOfst<
1a6c0 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b  mnTknOfst ) mnTk
1a6d0 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b  nOfst = stp->iTk
1a6e0 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28  nOfst;.      if(
1a6f0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d   stp->iTknOfst>m
1a700 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e  xTknOfst ) mxTkn
1a710 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  Ofst = stp->iTkn
1a720 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ofst;.    }else{
1a730 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74  .      for(ap=st
1a740 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
1a750 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
1a760 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20   int action;.   
1a770 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
1a780 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65  >index<lemp->nte
1a790 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75  rminal ) continu
1a7a0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  e;.        if( a
1a7b0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65  p->sp->index==le
1a7c0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f  mp->nsymbol ) co
1a7d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1a7e0 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65  action = compute
1a7f0 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70  _action(lemp, ap
1a800 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1a810 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e  ction<0 ) contin
1a820 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74  ue;.        actt
1a830 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61  ab_action(pActta
1a840 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  b, ap->sp->index
1a850 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  , action);.     
1a860 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e   }.      stp->iN
1a870 74 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69  tOfst = acttab_i
1a880 6e 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a  nsert(pActtab);.
1a890 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69        if( stp->i
1a8a0 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20  NtOfst<mnNtOfst 
1a8b0 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70  ) mnNtOfst = stp
1a8c0 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20  ->iNtOfst;.     
1a8d0 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73   if( stp->iNtOfs
1a8e0 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e  t>mxNtOfst ) mxN
1a8f0 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74  tOfst = stp->iNt
1a900 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Ofst;.    }.  }.
1a910 20 20 66 72 65 65 28 61 78 29 3b 0a 0a 20 20 2f    free(ax);..  /
1a920 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f  * Output the yy_
1a930 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a  action table */.
1a940 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73    fprintf(out,"s
1a950 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43  tatic const YYAC
1a960 54 49 4f 4e 54 59 50 45 20 79 79 5f 61 63 74 69  TIONTYPE yy_acti
1a970 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  on[] = {\n"); li
1a980 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 61 63  neno++;.  n = ac
1a990 74 74 61 62 5f 73 69 7a 65 28 70 41 63 74 74 61  ttab_size(pActta
1a9a0 62 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  b);.  for(i=j=0;
1a9b0 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1a9c0 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61 63 74  int action = act
1a9d0 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 70 41 63  tab_yyaction(pAc
1a9e0 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66  ttab, i);.    if
1a9f0 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 61 63 74  ( action<0 ) act
1aa00 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  ion = lemp->nsta
1aa10 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
1aa20 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d   + 2;.    if( j=
1aa30 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1aa40 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1aa50 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1aa60 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 61 63  out, " %4d,", ac
1aa70 74 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a  tion);.    if( j
1aa80 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1aa90 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1aaa0 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1aab0 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1aac0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1aad0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1aae0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1aaf0 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1ab00 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
1ab10 20 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61   the yy_lookahea
1ab20 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  d table */.  fpr
1ab30 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63  intf(out,"static
1ab40 20 63 6f 6e 73 74 20 59 59 43 4f 44 45 54 59 50   const YYCODETYP
1ab50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d  E yy_lookahead[]
1ab60 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   = {\n"); lineno
1ab70 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ++;.  for(i=j=0;
1ab80 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1ab90 69 6e 74 20 6c 61 20 3d 20 61 63 74 74 61 62 5f  int la = acttab_
1aba0 79 79 6c 6f 6f 6b 61 68 65 61 64 28 70 41 63 74  yylookahead(pAct
1abb0 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  tab, i);.    if(
1abc0 20 6c 61 3c 30 20 29 20 6c 61 20 3d 20 6c 65 6d   la<0 ) la = lem
1abd0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20 20  p->nsymbol;.    
1abe0 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
1abf0 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
1ac00 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
1ac10 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
1ac20 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20 69 66 28  ,", la);.    if(
1ac30 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20   j==9 || i==n-1 
1ac40 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1ac50 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e  (out, "\n"); lin
1ac60 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d  eno++;.      j =
1ac70 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1ac80 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
1ac90 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1aca0 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65  t, "};\n"); line
1acb0 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  no++;..  /* Outp
1acc0 75 74 20 74 68 65 20 79 79 5f 73 68 69 66 74 5f  ut the yy_shift_
1acd0 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a  ofst[] table */.
1ace0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1acf0 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54  #define YY_SHIFT
1ad00 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e  _USE_DFLT (%d)\n
1ad10 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29 3b  ", mnTknOfst-1);
1ad20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d   lineno++;.  n =
1ad30 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20   lemp->nstate;. 
1ad40 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c   while( n>0 && l
1ad50 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d  emp->sorted[n-1]
1ad60 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f  ->iTknOfst==NO_O
1ad70 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66  FFSET ) n--;.  f
1ad80 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1ad90 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41  fine YY_SHIFT_MA
1ada0 58 20 25 64 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c  X %d\n", n-1); l
1adb0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1adc0 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20  tf(out, "static 
1add0 63 6f 6e 73 74 20 25 73 20 79 79 5f 73 68 69 66  const %s yy_shif
1ade0 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c  t_ofst[] = {\n",
1adf0 20 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69   .          mini
1ae00 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e  mum_size_type(mn
1ae10 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e  TknOfst-1, mxTkn
1ae20 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  Ofst)); lineno++
1ae30 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
1ae40 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
1ae50 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20  t ofst;.    stp 
1ae60 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1ae70 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74  ];.    ofst = st
1ae80 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20  p->iTknOfst;.   
1ae90 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46   if( ofst==NO_OF
1aea0 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e  FSET ) ofst = mn
1aeb0 54 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20  TknOfst - 1;.   
1aec0 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1aed0 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1aee0 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1aef0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1af00 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  d,", ofst);.    
1af10 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
1af20 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
1af30 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
1af40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1af50 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
1af60 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1af70 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
1af80 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
1af90 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
1afa0 75 74 70 75 74 20 74 68 65 20 79 79 5f 72 65 64  utput the yy_red
1afb0 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65  uce_ofst[] table
1afc0 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1afd0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52  t, "#define YY_R
1afe0 45 44 55 43 45 5f 55 53 45 5f 44 46 4c 54 20 28  EDUCE_USE_DFLT (
1aff0 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74  %d)\n", mnNtOfst
1b000 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  -1); lineno++;. 
1b010 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74   n = lemp->nstat
1b020 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  e;.  while( n>0 
1b030 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  && lemp->sorted[
1b040 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e  n-1]->iNtOfst==N
1b050 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a  O_OFFSET ) n--;.
1b060 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b070 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
1b080 45 5f 4d 41 58 20 25 64 5c 6e 22 2c 20 6e 2d 31  E_MAX %d\n", n-1
1b090 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1b0a0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1b0b0 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f  tic const %s yy_
1b0c0 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20  reduce_ofst[] = 
1b0d0 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  {\n", .         
1b0e0 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
1b0f0 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d  pe(mnNtOfst-1, m
1b100 78 4e 74 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e  xNtOfst)); linen
1b110 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  o++;.  for(i=j=0
1b120 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1b130 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73   int ofst;.    s
1b140 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1b150 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d  d[i];.    ofst =
1b160 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20   stp->iNtOfst;. 
1b170 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f     if( ofst==NO_
1b180 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20  OFFSET ) ofst = 
1b190 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20  mnNtOfst - 1;.  
1b1a0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1b1b0 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1b1c0 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1b1d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1b1e0 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20  4d,", ofst);.   
1b1f0 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
1b200 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
1b210 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
1b220 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1b230 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
1b240 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
1b250 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
1b260 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
1b270 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
1b280 4f 75 74 70 75 74 20 74 68 65 20 64 65 66 61 75  Output the defau
1b290 6c 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  lt action table 
1b2a0 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1b2b0 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  , "static const 
1b2c0 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f  YYACTIONTYPE yy_
1b2d0 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22  default[] = {\n"
1b2e0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e  ); lineno++;.  n
1b2f0 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   = lemp->nstate;
1b300 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1b310 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  n; i++){.    stp
1b320 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
1b330 69 5d 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30  i];.    if( j==0
1b340 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1b350 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
1b360 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1b370 74 2c 20 22 20 25 34 64 2c 22 2c 20 73 74 70 2d  t, " %4d,", stp-
1b380 3e 69 44 66 6c 74 29 3b 0a 20 20 20 20 69 66 28  >iDflt);.    if(
1b390 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20   j==9 || i==n-1 
1b3a0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1b3b0 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e  (out, "\n"); lin
1b3c0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d  eno++;.      j =
1b3d0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1b3e0 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
1b3f0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1b400 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65  t, "};\n"); line
1b410 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65  no++;.  tplt_xfe
1b420 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1b430 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1b440 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
1b450 20 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61   table of fallba
1b460 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a  ck tokens..  */.
1b470 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f    if( lemp->has_
1b480 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  fallback ){.    
1b490 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1b4a0 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
1b4b0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1b4c0 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d  ymbol *p = lemp-
1b4d0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1b4e0 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61     if( p->fallba
1b4f0 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
1b500 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1b510 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d     0,  /* %10s =
1b520 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c  > nothing */\n",
1b530 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20   p->name);.     
1b540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b550 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
1b560 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e  %3d,  /* %10s =>
1b570 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61   %s */\n", p->fa
1b580 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20  llback->index,. 
1b590 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65           p->name
1b5a0 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e  , p->fallback->n
1b5b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1b5c0 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
1b5d0 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78    }.  }.  tplt_x
1b5e0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20  fer(lemp->name, 
1b5f0 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f  in, out, &lineno
1b600 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1b610 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
1b620 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 69  ning the symboli
1b630 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72 79 20  c name of every 
1b640 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f  symbol.  */.  fo
1b650 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1b660 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
1b670 20 20 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22    sprintf(line,"
1b680 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73  \"%s\",",lemp->s
1b690 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29  ymbols[i]->name)
1b6a0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1b6b0 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65  t,"  %-15s",line
1b6c0 29 3b 0a 20 20 20 20 69 66 28 20 28 69 26 33 29  );.    if( (i&3)
1b6d0 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  ==3 ){ fprintf(o
1b6e0 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ut,"\n"); lineno
1b6f0 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20  ++; }.  }.  if( 
1b700 28 69 26 33 29 21 3d 30 20 29 7b 20 66 70 72 69  (i&3)!=0 ){ fpri
1b710 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c  ntf(out,"\n"); l
1b720 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c  ineno++; }.  tpl
1b730 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1b740 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1b750 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1b760 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
1b770 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74 72 69  ning a text stri
1b780 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
1b790 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c  s every.  ** rul
1b7a0 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73 65  e in the rule se
1b7b0 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 65 72  t of the grammer
1b7c0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
1b7d0 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  ion is used.  **
1b7e0 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52 45   when tracing RE
1b7f0 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20  DUCE actions..  
1b800 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70  */.  for(i=0, rp
1b810 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
1b820 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b   rp=rp->next, i+
1b830 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1b840 72 70 2d 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a  rp->index==i );.
1b850 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b860 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 25 73  " /* %3d */ \"%s
1b870 20 3a 3a 3d 22 2c 20 69 2c 20 72 70 2d 3e 6c 68   ::=", i, rp->lh
1b880 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  s->name);.    fo
1b890 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68  r(j=0; j<rp->nrh
1b8a0 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73  s; j++){.      s
1b8b0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1b8c0 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20   = rp->rhs[j];. 
1b8d0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1b8e0 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65  ," %s", sp->name
1b8f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  );.      if( sp-
1b900 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
1b910 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
1b920 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66  int k;.        f
1b930 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73  or(k=1; k<sp->ns
1b940 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ubsym; k++){.   
1b950 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1b960 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62  ut,"|%s",sp->sub
1b970 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  sym[k]->name);. 
1b980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b990 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
1b9a0 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22 29 3b  tf(out,"\",\n");
1b9b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1b9c0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1b9d0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1b9e0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1b9f0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1ba00 20 65 78 65 63 75 74 65 73 20 65 76 65 72 79 20   executes every 
1ba10 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20 69 73  time a symbol is
1ba20 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20 20 2a   popped from.  *
1ba30 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68 69 6c  * the stack whil
1ba40 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65 72 72  e processing err
1ba50 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64 65 73  ors or while des
1ba60 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61 72 73  troying the pars
1ba70 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20 6f 74  er. .  ** (In ot
1ba80 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e 65 72  her words, gener
1ba90 61 74 65 20 74 68 65 20 25 64 65 73 74 72 75 63  ate the %destruc
1baa0 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20 20 2a  tor actions).  *
1bab0 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f  /.  if( lemp->to
1bac0 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20 20 66  kendest ){.    f
1bad0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1bae0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1baf0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1bb00 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1bb10 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
1bb20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1bb30 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
1bb40 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1bb50 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1bb60 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c      case %d:\n",
1bb70 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65  sp->index); line
1bb80 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no++;.    }.    
1bb90 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1bba0 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70  >nsymbol && lemp
1bbb0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79  ->symbols[i]->ty
1bbc0 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b  pe!=TERMINAL; i+
1bbd0 2b 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c 65  +);.    if( i<le
1bbe0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20  mp->nsymbol ){. 
1bbf0 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75       emit_destru
1bc00 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65  ctor_code(out,le
1bc10 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c  mp->symbols[i],l
1bc20 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
1bc30 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1bc40 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
1bc50 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1bc60 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d   }.  }.  if( lem
1bc70 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20  p->vardest ){.  
1bc80 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1bc90 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20  *dflt_sp = 0;.  
1bca0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1bcb0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1bcc0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1bcd0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
1bce0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
1bcf0 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
1bd00 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
1bd10 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  NAL ||.         
1bd20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c   sp->index<=0 ||
1bd30 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21   sp->destructor!
1bd40 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1bd50 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1bd60 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e  ,"    case %d:\n
1bd70 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69  ",sp->index); li
1bd80 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66  neno++;.      df
1bd90 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20  lt_sp = sp;.    
1bda0 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73  }.    if( dflt_s
1bdb0 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d  p!=0 ){.      em
1bdc0 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
1bdd0 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c  de(out,dflt_sp,l
1bde0 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
1bdf0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1be00 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
1be10 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1be20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30   }.  }.  for(i=0
1be30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
1be40 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  l; i++){.    str
1be50 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1be60 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1be70 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30  ];.    if( sp==0
1be80 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45   || sp->type==TE
1be90 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65  RMINAL || sp->de
1bea0 73 74 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f  structor==0 ) co
1beb0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69  ntinue;.    fpri
1bec0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
1bed0 65 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64  e %d:\n",sp->ind
1bee0 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  ex); lineno++;..
1bef0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64      /* Combine d
1bf00 75 70 6c 69 63 61 74 65 20 64 65 73 74 72 75 63  uplicate destruc
1bf10 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  tors into a sing
1bf20 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 66  le case */.    f
1bf30 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70  or(j=i+1; j<lemp
1bf40 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b  ->nsymbol; j++){
1bf50 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
1bf60 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70  mbol *sp2 = lemp
1bf70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20  ->symbols[j];.  
1bf80 20 20 20 20 69 66 28 20 73 70 32 20 26 26 20 73      if( sp2 && s
1bf90 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  p2->type!=TERMIN
1bfa0 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73 74 72  AL && sp2->destr
1bfb0 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20 20 20  uctor.          
1bfc0 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73  && sp2->dtnum==s
1bfd0 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20 20  p->dtnum.       
1bfe0 20 20 20 26 26 20 73 74 72 63 6d 70 28 73 70 2d     && strcmp(sp-
1bff0 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70 32 2d  >destructor,sp2-
1c000 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d 30 20  >destructor)==0 
1c010 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72 69  ){.         fpri
1c020 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
1c030 65 20 25 64 3a 5c 6e 22 2c 73 70 32 2d 3e 69 6e  e %d:\n",sp2->in
1c040 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1c050 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 64 65           sp2->de
1c060 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20  structor = 0;.  
1c070 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1c080 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
1c090 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e  _code(out,lemp->
1c0a0 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c  symbols[i],lemp,
1c0b0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70  &lineno);.    fp
1c0c0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1c0d0 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1c0e0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1c0f0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1c100 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1c110 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1c120 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1c130 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74  cutes whenever t
1c140 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20  he parser stack 
1c150 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74  overflows */.  t
1c160 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1c170 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f  mp,lemp->overflo
1c180 77 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77  w,lemp->overflow
1c190 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  ln,&lineno);.  t
1c1a0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1c1b0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1c1c0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1c1d0 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66  ate the table of
1c1e0 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f   rule informatio
1c1f0 6e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  n .  **.  ** Not
1c200 65 3a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  e: This code dep
1c210 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
1c220 20 74 68 61 74 20 72 75 6c 65 73 20 61 72 65 20   that rules are 
1c230 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71 75  number.  ** sequ
1c240 65 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69  entually beginni
1c250 6e 67 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a  ng with 0..  */.
1c260 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
1c270 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
1c280 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e  next){.    fprin
1c290 74 66 28 6f 75 74 2c 22 20 20 7b 20 25 64 2c 20  tf(out,"  { %d, 
1c2a0 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73  %d },\n",rp->lhs
1c2b0 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e 72 68 73  ->index,rp->nrhs
1c2c0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1c2d0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1c2e0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1c2f0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1c300 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1c310 63 68 20 65 78 65 63 75 74 69 6f 6e 20 64 75 72  ch execution dur
1c320 69 6e 67 20 65 61 63 68 20 52 45 44 55 43 45 20  ing each REDUCE 
1c330 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28  action */.  for(
1c340 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
1c350 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
1c360 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 5f 63  .    translate_c
1c370 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a 20  ode(lemp, rp);. 
1c380 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
1c390 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
1c3a0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74  p->next){.    st
1c3b0 72 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 0a  ruct rule *rp2;.
1c3c0 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65      if( rp->code
1c3d0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1c3e0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1c3f0 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 5c  "      case %d:\
1c400 6e 22 2c 72 70 2d 3e 69 6e 64 65 78 29 3b 20 6c  n",rp->index); l
1c410 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72  ineno++;.    for
1c420 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72  (rp2=rp->next; r
1c430 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78  p2; rp2=rp2->nex
1c440 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70  t){.      if( rp
1c450 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64  2->code==rp->cod
1c460 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  e ){.        fpr
1c470 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1c480 63 61 73 65 20 25 64 3a 5c 6e 22 2c 72 70 32 2d  case %d:\n",rp2-
1c490 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
1c4a0 2b 3b 0a 20 20 20 20 20 20 20 20 72 70 32 2d 3e  +;.        rp2->
1c4b0 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  code = 0;.      
1c4c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6d 69 74  }.    }.    emit
1c4d0 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d  _code(out,rp,lem
1c4e0 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
1c4f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1c500 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
1c510 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1c520 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1c530 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1c540 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1c550 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1c560 20 65 78 65 63 75 74 65 73 20 69 66 20 61 20 70   executes if a p
1c570 61 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20  arse fails */.  
1c580 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1c590 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72  emp,lemp->failur
1c5a0 65 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 6c  e,lemp->failurel
1c5b0 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70  n,&lineno);.  tp
1c5c0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1c5d0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1c5e0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1c5f0 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1c600 65 63 75 74 65 73 20 77 68 65 6e 20 61 20 73 79  ecutes when a sy
1c610 6e 74 61 78 20 65 72 72 6f 72 20 6f 63 63 75 72  ntax error occur
1c620 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
1c630 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
1c640 3e 65 72 72 6f 72 2c 6c 65 6d 70 2d 3e 65 72 72  >error,lemp->err
1c650 6f 72 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  orln,&lineno);. 
1c660 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1c670 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1c680 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1c690 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1c6a0 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74   executes when t
1c6b0 68 65 20 70 61 72 73 65 72 20 61 63 63 65 70 74  he parser accept
1c6c0 73 20 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20  s its input */. 
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 61 63 63 65 70  lemp,lemp->accep
1c6f0 74 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 6c 6e  t,lemp->acceptln
1c700 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
1c710 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1c720 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1c730 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20  );..  /* Append 
1c740 61 6e 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64  any addition cod
1c750 65 20 74 68 65 20 75 73 65 72 20 64 65 73 69 72  e the user desir
1c760 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  es */.  tplt_pri
1c770 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1c780 2d 3e 65 78 74 72 61 63 6f 64 65 2c 6c 65 6d 70  ->extracode,lemp
1c790 2d 3e 65 78 74 72 61 63 6f 64 65 6c 6e 2c 26 6c  ->extracodeln,&l
1c7a0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73  ineno);..  fclos
1c7b0 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28  e(in);.  fclose(
1c7c0 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  out);.  return;.
1c7d0 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  }../* Generate a
1c7e0 20 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72   header file for
1c7f0 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76   the parser */.v
1c800 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64 65 72  oid ReportHeader
1c810 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
1c820 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 46  mon *lemp;.{.  F
1c830 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20  ILE *out, *in;. 
1c840 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20   char *prefix;. 
1c850 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
1c860 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74  IZE];.  char pat
1c870 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  tern[LINESIZE];.
1c880 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
1c890 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1c8a0 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d  x ) prefix = lem
1c8b0 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
1c8c0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
1c8d0 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
1c8e0 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69   = "";.  in = fi
1c8f0 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
1c900 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  ","rb");.  if( i
1c910 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  n ){.    for(i=1
1c920 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
1c930 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c 69 6e  nal && fgets(lin
1c940 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20  e,LINESIZE,in); 
1c950 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70 72 69  i++){.      spri
1c960 6e 74 66 28 70 61 74 74 65 72 6e 2c 22 23 64 65  ntf(pattern,"#de
1c970 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64  fine %s%-30s %2d
1c980 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d  \n",prefix,lemp-
1c990 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
1c9a0 65 2c 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e,i);.      if( 
1c9b0 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74  strcmp(line,patt
1c9c0 65 72 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ern) ) break;.  
1c9d0 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69    }.    fclose(i
1c9e0 6e 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c  n);.    if( i==l
1c9f0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
1ca00 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68  {.      /* No ch
1ca10 61 6e 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  ange in the file
1ca20 2e 20 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65  .  Don't rewrite
1ca30 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65   it. */.      re
1ca40 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
1ca50 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65    out = file_ope
1ca60 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22  n(lemp,".h","wb"
1ca70 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
1ca80 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c      for(i=1; i<l
1ca90 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
1caa0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69  i++){.      fpri
1cab0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1cac0 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c   %s%-30s %2d\n",
1cad0 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d  prefix,lemp->sym
1cae0 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29  bols[i]->name,i)
1caf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f  ;.    }.    fclo
1cb00 73 65 28 6f 75 74 29 3b 20 20 0a 20 20 7d 0a 20  se(out);  .  }. 
1cb10 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
1cb20 65 64 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f  educe the size o
1cb30 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  f the action tab
1cb40 6c 65 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  les, if possible
1cb50 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a  , by making use.
1cb60 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a  ** of defaults..
1cb70 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  **.** In this ve
1cb80 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74  rsion, we take t
1cb90 68 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74  he most frequent
1cba0 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61   REDUCE action a
1cbb0 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68  nd make.** it th
1cbc0 65 20 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65  e default.  Exce
1cbd0 70 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  pt, there is no 
1cbe0 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 77  default if the w
1cbf0 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a  ildcard token.**
1cc00 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c   is a possible l
1cc10 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f  ook-ahead..*/.vo
1cc20 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65  id CompressTable
1cc30 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
1cc40 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
1cc50 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
1cc60 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
1cc70 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 3b 0a 20 20  on *ap, *ap2;.  
1cc80 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
1cc90 20 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20   *rp2, *rbest;. 
1cca0 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20   int nbest, n;. 
1ccb0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 75 73   int i;.  int us
1ccc0 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20 20 66  esWildcard;..  f
1ccd0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1cce0 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
1ccf0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
1cd00 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65  rted[i];.    nbe
1cd10 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 65 73  st = 0;.    rbes
1cd20 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65 73 57  t = 0;.    usesW
1cd30 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a 20 20  ildcard = 0;..  
1cd40 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1cd50 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1cd60 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
1cd70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26  ->type==SHIFT &&
1cd80 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77   ap->sp==lemp->w
1cd90 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 20  ildcard ){.     
1cda0 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20     usesWildcard 
1cdb0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1cdc0 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21     if( ap->type!
1cdd0 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e  =REDUCE ) contin
1cde0 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d 20 61  ue;.      rp = a
1cdf0 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 69  p->x.rp;.      i
1ce00 66 28 20 72 70 3d 3d 72 62 65 73 74 20 29 20 63  f( rp==rbest ) c
1ce10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e  ontinue;.      n
1ce20 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 1;.      for(
1ce30 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  ap2=ap->next; ap
1ce40 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74  2; ap2=ap2->next
1ce50 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
1ce60 70 32 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  p2->type!=REDUCE
1ce70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ce80 20 20 20 20 20 72 70 32 20 3d 20 61 70 32 2d 3e       rp2 = ap2->
1ce90 78 2e 72 70 3b 0a 20 20 20 20 20 20 20 20 69 66  x.rp;.        if
1cea0 28 20 72 70 32 3d 3d 72 62 65 73 74 20 29 20 63  ( rp2==rbest ) c
1ceb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1cec0 20 69 66 28 20 72 70 32 3d 3d 72 70 20 29 20 6e   if( rp2==rp ) n
1ced0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1cee0 20 20 69 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b    if( n>nbest ){
1cef0 0a 20 20 20 20 20 20 20 20 6e 62 65 73 74 20 3d  .        nbest =
1cf00 20 6e 3b 0a 20 20 20 20 20 20 20 20 72 62 65 73   n;.        rbes
1cf10 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a  t = rp;.      }.
1cf20 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44      }. .    /* D
1cf30 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65 66  o not make a def
1cf40 61 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d 62  ault if the numb
1cf50 65 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20 64  er of rules to d
1cf60 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73  efault.    ** is
1cf70 20 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 31 20   not at least 1 
1cf80 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  or if the wildca
1cf90 72 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f  rd token is a po
1cfa0 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f  ssible.    ** lo
1cfb0 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a  okahead..    */.
1cfc0 20 20 20 20 69 66 28 20 6e 62 65 73 74 3c 31 20      if( nbest<1 
1cfd0 7c 7c 20 75 73 65 73 57 69 6c 64 63 61 72 64 20  || usesWildcard 
1cfe0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20  ) continue;...  
1cff0 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74    /* Combine mat
1d000 63 68 69 6e 67 20 52 45 44 55 43 45 20 61 63 74  ching REDUCE act
1d010 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ions into a sing
1d020 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20  le default */.  
1d030 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1d040 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1d050 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
1d060 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
1d070 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73  & ap->x.rp==rbes
1d080 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t ) break;.    }
1d090 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20  .    assert( ap 
1d0a0 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20  );.    ap->sp = 
1d0b0 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66  Symbol_new("{def
1d0c0 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72  ault}");.    for
1d0d0 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70  (ap=ap->next; ap
1d0e0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1d0f0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1d100 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
1d110 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
1d120 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55  ap->type = NOT_U
1d130 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  SED;.    }.    s
1d140 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f  tp->ap = Action_
1d150 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20  sort(stp->ap);. 
1d160 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   }.}.../*.** Com
1d170 70 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20  pare two states 
1d180 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
1d190 6f 73 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c  oses.  The small
1d1a0 65 72 20 73 74 61 74 65 20 69 73 20 74 68 65 0a  er state is the.
1d1b0 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  ** one with the 
1d1c0 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  most non-termina
1d1d0 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74  l actions.  If t
1d1e0 68 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d  hey have the sam
1d1f0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e  e number.** of n
1d200 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69  on-terminal acti
1d210 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d  ons, then the sm
1d220 61 6c 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65  aller is the one
1d230 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a   with the most.*
1d240 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e  * token actions.
1d250 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1d260 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72  tateResortCompar
1d270 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c  e(const void *a,
1d280 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b   const void *b){
1d290 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  .  const struct 
1d2a0 73 74 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f  state *pA = *(co
1d2b0 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
1d2c0 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74  **)a;.  const st
1d2d0 72 75 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d  ruct state *pB =
1d2e0 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20   *(const struct 
1d2f0 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74  state**)b;.  int
1d300 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e   n;..  n = pB->n
1d310 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41  NtAct - pA->nNtA
1d320 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29  ct;.  if( n==0 )
1d330 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54  {.    n = pB->nT
1d340 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e  knAct - pA->nTkn
1d350 41 63 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Act;.  }.  retur
1d360 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  n n;.}.../*.** R
1d370 65 6e 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f  enumber and reso
1d380 72 74 20 73 74 61 74 65 73 20 73 6f 20 74 68 61  rt states so tha
1d390 74 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65  t states with fe
1d3a0 77 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f  wer choices.** o
1d3b0 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e  ccur at the end.
1d3c0 20 20 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73    Except, keep s
1d3d0 74 61 74 65 20 30 20 61 73 20 74 68 65 20 66 69  tate 0 as the fi
1d3e0 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f  rst state..*/.vo
1d3f0 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
1d400 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
1d410 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
1d420 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
1d430 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
1d440 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a  ct action *ap;..
1d450 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1d460 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
1d470 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1d480 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1d490 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73  stp->nTknAct = s
1d4a0 74 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a  tp->nNtAct = 0;.
1d4b0 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d      stp->iDflt =
1d4c0 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
1d4d0 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20  lemp->nrule;.   
1d4e0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d   stp->iTknOfst =
1d4f0 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20   NO_OFFSET;.    
1d500 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e  stp->iNtOfst = N
1d510 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f  O_OFFSET;.    fo
1d520 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1d530 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1d540 20 20 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74        if( comput
1d550 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70  e_action(lemp,ap
1d560 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
1d570 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1d580 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
1d590 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
1d5a0 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20  tp->nTknAct++;. 
1d5b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1d5c0 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c   ap->sp->index<l
1d5d0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a  emp->nsymbol ){.
1d5e0 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e            stp->n
1d5f0 4e 74 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20  NtAct++;.       
1d600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d610 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63    stp->iDflt = c
1d620 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1d630 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
1d640 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1d650 0a 20 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65  .  }.  qsort(&le
1d660 6d 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c  mp->sorted[1], l
1d670 65 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73  emp->nstate-1, s
1d680 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74  izeof(lemp->sort
1d690 65 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20  ed[0]),.        
1d6a0 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61  stateResortCompa
1d6b0 72 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  re);.  for(i=0; 
1d6c0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
1d6d0 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e  i++){.    lemp->
1d6e0 73 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65  sorted[i]->state
1d6f0 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a  num = i;.  }.}..
1d700 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1d710 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1d720 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  e "set.c" ******
1d730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1d740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1d750 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75  /*.** Set manipu
1d760 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  lation routines 
1d770 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
1d780 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
1d790 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73  */..static int s
1d7a0 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74  ize = 0;../* Set
1d7b0 20 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f   the set size */
1d7c0 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28 6e 29  .void SetSize(n)
1d7d0 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69 7a 65  .int n;.{.  size
1d7e0 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c   = n+1;.}../* Al
1d7f0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 74  locate a new set
1d800 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77   */.char *SetNew
1d810 28 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20  (){.  char *s;. 
1d820 20 69 6e 74 20 69 3b 0a 20 20 73 20 3d 20 28 63   int i;.  s = (c
1d830 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  har*)malloc( siz
1d840 65 20 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20  e );.  if( s==0 
1d850 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f  ){.    extern vo
1d860 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
1d870 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72  );.    memory_er
1d880 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  ror();.  }.  for
1d890 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
1d8a0 2b 29 20 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 72  +) s[i] = 0;.  r
1d8b0 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44  eturn s;.}../* D
1d8c0 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20  eallocate a set 
1d8d0 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65 65 28  */.void SetFree(
1d8e0 73 29 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20 20  s).char *s;.{.  
1d8f0 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41  free(s);.}../* A
1d900 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
1d910 20 74 6f 20 74 68 65 20 73 65 74 2e 20 20 52 65   to the set.  Re
1d920 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1d930 20 65 6c 65 6d 65 6e 74 20 77 61 73 20 61 64 64   element was add
1d940 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20  ed.** and FALSE 
1d950 69 66 20 69 74 20 77 61 73 20 61 6c 72 65 61 64  if it was alread
1d960 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20  y there. */.int 
1d970 53 65 74 41 64 64 28 73 2c 65 29 0a 63 68 61 72  SetAdd(s,e).char
1d980 20 2a 73 3b 0a 69 6e 74 20 65 3b 0a 7b 0a 20 20   *s;.int e;.{.  
1d990 69 6e 74 20 72 76 3b 0a 20 20 72 76 20 3d 20 73  int rv;.  rv = s
1d9a0 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b  [e];.  s[e] = 1;
1d9b0 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d  .  return !rv;.}
1d9c0 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20 65  ../* Add every e
1d9d0 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f 20  lement of s2 to 
1d9e0 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  s1.  Return TRUE
1d9f0 20 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e 20   if s1 changes. 
1da00 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28  */.int SetUnion(
1da10 73 31 2c 73 32 29 0a 63 68 61 72 20 2a 73 31 3b  s1,s2).char *s1;
1da20 0a 63 68 61 72 20 2a 73 32 3b 0a 7b 0a 20 20 69  .char *s2;.{.  i
1da30 6e 74 20 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a  nt i, progress;.
1da40 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a    progress = 0;.
1da50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1da60 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  e; i++){.    if(
1da70 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74   s2[i]==0 ) cont
1da80 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 31  inue;.    if( s1
1da90 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
1daa0 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  progress = 1;.  
1dab0 20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20      s1[i] = 1;. 
1dac0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1dad0 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a  n progress;.}./*
1dae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1daf0 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1db00 69 6c 65 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a  ile "table.c" **
1db10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1db20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
1db30 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68  * All code in th
1db40 69 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  is file has been
1db50 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67   automatically g
1db60 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d  enerated.** from
1db70 20 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e   a specification
1db80 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   in the file.** 
1db90 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61               "ta
1dba0 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65  ble.q".** by the
1dbb0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1dbc0 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67  ay code building
1dbd0 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22   program "aagen"
1dbe0 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74  ..** Do not edit
1dbf0 20 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73   this file!  Ins
1dc00 74 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73  tead, edit the s
1dc10 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20  pecification.** 
1dc20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e  file, then rerun
1dc30 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a   aagen..*/./*.**
1dc40 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73   Code for proces
1dc50 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74  sing tables in t
1dc60 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
1dc70 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50  generator..*/..P
1dc80 52 49 56 41 54 45 20 69 6e 74 20 73 74 72 68 61  RIVATE int strha
1dc90 73 68 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b  sh(x).char *x;.{
1dca0 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20  .  int h = 0;.  
1dcb0 77 68 69 6c 65 28 20 2a 78 29 20 68 20 3d 20 68  while( *x) h = h
1dcc0 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20  *13 + *(x++);.  
1dcd0 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
1dce0 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64 75  Works like strdu
1dcf0 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61 76  p, sort of.  Sav
1dd00 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d 61  e a string in ma
1dd10 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62  lloced memory, b
1dd20 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e  ut.** keep strin
1dd30 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 6f  gs in a table so
1dd40 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73   that the same s
1dd50 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20  tring is not in 
1dd60 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65  more.** than one
1dd70 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 68 61 72 20   place..*/.char 
1dd80 2a 53 74 72 73 61 66 65 28 79 29 0a 63 68 61 72  *Strsafe(y).char
1dd90 20 2a 79 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 7a   *y;.{.  char *z
1dda0 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20  ;..  if( y==0 ) 
1ddb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20  return 0;.  z = 
1ddc0 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b  Strsafe_find(y);
1ddd0 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28  .  if( z==0 && (
1dde0 7a 3d 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e  z=malloc( strlen
1ddf0 28 79 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20  (y)+1 ))!=0 ){. 
1de00 20 20 20 73 74 72 63 70 79 28 7a 2c 79 29 3b 0a     strcpy(z,y);.
1de10 20 20 20 20 53 74 72 73 61 66 65 5f 69 6e 73 65      Strsafe_inse
1de20 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d  rt(z);.  }.  Mem
1de30 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72  oryCheck(z);.  r
1de40 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54  eturn z;.}../* T
1de50 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
1de60 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1de70 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1de80 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f  for each.** asso
1de90 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
1dea0 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73   type "x1"..*/.s
1deb0 74 72 75 63 74 20 73 5f 78 31 20 7b 0a 20 20 69  truct s_x1 {.  i
1dec0 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
1ded0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
1dee0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1def0 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20  e slots. */.    
1df00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df10 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20        /*   Must 
1df20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
1df30 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1df40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df60 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a    equal to 1 */.
1df70 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20    int count;    
1df80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1df90 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79  ber of currently
1dfa0 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f   slots filled */
1dfb0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
1dfc0 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65  de *tbl;  /* The
1dfd0 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72   data stored her
1dfe0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  e */.  struct s_
1dff0 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a  x1node **ht;  /*
1e000 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   Hash table for 
1e010 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f  lookups */.};../
1e020 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
1e030 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
1e040 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76  structure for ev
1e050 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ery data element
1e060 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69  .** in an associ
1e070 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
1e080 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70  ype "x1"..*/.typ
1e090 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 31  edef struct s_x1
1e0a0 6e 6f 64 65 20 7b 0a 20 20 63 68 61 72 20 2a 64  node {.  char *d
1e0b0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1e0c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1e0d0 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  a */.  struct s_
1e0e0 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x1node *next;   
1e0f0 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
1e100 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
1e110 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1e120 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  1node **from;  /
1e130 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
1e140 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x1node;../*
1e150 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
1e160 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1e170 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
1e180 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
1e190 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
1e1a0 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a  t s_x1 *x1a;../*
1e1b0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1e1c0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1e1d0 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66  y */.void Strsaf
1e1e0 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
1e1f0 78 31 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x1a ) return;.  
1e200 78 31 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x1a = (struct s_
1e210 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x1*)malloc( size
1e220 6f 66 28 73 74 72 75 63 74 20 73 5f 78 31 29 20  of(struct s_x1) 
1e230 29 3b 0a 20 20 69 66 28 20 78 31 61 20 29 7b 0a  );.  if( x1a ){.
1e240 20 20 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20      x1a->size = 
1e250 31 30 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63  1024;.    x1a->c
1e260 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 31  ount = 0;.    x1
1e270 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65  a->tbl = (x1node
1e280 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20  *)malloc( .     
1e290 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29   (sizeof(x1node)
1e2a0 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
1e2b0 2a 29 29 2a 31 30 32 34 20 29 3b 0a 20 20 20 20  *))*1024 );.    
1e2c0 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20  if( x1a->tbl==0 
1e2d0 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 31  ){.      free(x1
1e2e0 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20  a);.      x1a = 
1e2f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1e300 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1e310 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f   x1a->ht = (x1no
1e320 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b  de**)&(x1a->tbl[
1e330 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  1024]);.      fo
1e340 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69  r(i=0; i<1024; i
1e350 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x1a->ht[i] =
1e360 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
1e370 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
1e380 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
1e390 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
1e3a0 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
1e3b0 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
1e3c0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
1e3d0 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
1e3e0 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72  itten */.int Str
1e3f0 73 61 66 65 5f 69 6e 73 65 72 74 28 64 61 74 61  safe_insert(data
1e400 29 0a 63 68 61 72 20 2a 64 61 74 61 3b 0a 7b 0a  ).char *data;.{.
1e410 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x1node *np;.  
1e420 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b  int h;.  int ph;
1e430 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29  ..  if( x1a==0 )
1e440 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20   return 0;.  ph 
1e450 3d 20 73 74 72 68 61 73 68 28 64 61 74 61 29 3b  = strhash(data);
1e460 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61  .  h = ph & (x1a
1e470 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
1e480 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x1a->ht[h];.  
1e490 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
1e4a0 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
1e4b0 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b  data,data)==0 ){
1e4c0 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
1e4d0 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
1e4e0 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
1e4f0 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
1e500 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
1e510 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
1e520 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
1e530 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1e540 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
1e550 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
1e560 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d  x1a->count>=x1a-
1e570 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
1e580 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
1e590 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
1e5a0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
1e5b0 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
1e5c0 20 73 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20   s_x1 array;.   
1e5d0 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
1e5e0 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32  ze = x1a->size*2
1e5f0 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
1e600 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x1a->count;.
1e610 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
1e620 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x1node*)malloc(
1e630 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
1e640 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
1e650 78 31 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x1node*))*size )
1e660 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
1e670 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
1e680 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
1e690 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
1e6a0 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
1e6b0 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28  t = (x1node**)&(
1e6c0 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
1e6d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1e6e0 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
1e6f0 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
1e700 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d   for(i=0; i<x1a-
1e710 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
1e720 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e      x1node *oldn
1e730 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
1e740 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e   oldnp = &(x1a->
1e750 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
1e760 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
1e770 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d  ->data) & (size-
1e780 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20  1);.      newnp 
1e790 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d  = &(array.tbl[i]
1e7a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72  );.      if( arr
1e7b0 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79  ay.ht[h] ) array
1e7c0 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  .ht[h]->from = &
1e7d0 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  (newnp->next);. 
1e7e0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74       newnp->next
1e7f0 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a   = array.ht[h];.
1e800 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
1e810 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
1e820 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
1e830 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
1e840 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
1e850 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
1e860 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
1e870 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  1a->tbl);.    *x
1e880 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  1a = array;.  }.
1e890 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
1e8a0 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
1e8b0 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a  = ph & (x1a->siz
1e8c0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
1e8d0 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75  1a->tbl[x1a->cou
1e8e0 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61  nt++]);.  np->da
1e8f0 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28  ta = data;.  if(
1e900 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31   x1a->ht[h] ) x1
1e910 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  a->ht[h]->from =
1e920 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20   &(np->next);.  
1e930 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e  np->next = x1a->
1e940 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74  ht[h];.  x1a->ht
1e950 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e  [h] = np;.  np->
1e960 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74  from = &(x1a->ht
1e970 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  [h]);.  return 1
1e980 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
1e990 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
1e9a0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
1e9b0 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74   given key.  Ret
1e9c0 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e  urn NULL.** if n
1e9d0 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63  o such key. */.c
1e9e0 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e  har *Strsafe_fin
1e9f0 64 28 6b 65 79 29 0a 63 68 61 72 20 2a 6b 65 79  d(key).char *key
1ea00 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ;.{.  int h;.  x
1ea10 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  1node *np;..  if
1ea20 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
1ea30 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61  n 0;.  h = strha
1ea40 73 68 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e  sh(key) & (x1a->
1ea50 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
1ea60 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x1a->ht[h];.  wh
1ea70 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
1ea80 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61  f( strcmp(np->da
1ea90 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  ta,key)==0 ) bre
1eaa0 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
1eab0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
1eac0 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
1ead0 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  a : 0;.}../* Ret
1eae0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1eaf0 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f   the (terminal o
1eb00 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73  r nonterminal) s
1eb10 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72  ymbol "x"..** Cr
1eb20 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
1eb30 6c 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  l if this is the
1eb40 20 66 69 72 73 74 20 74 69 6d 65 20 22 78 22 20   first time "x" 
1eb50 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a  has been seen..*
1eb60 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
1eb70 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 0a 63  *Symbol_new(x).c
1eb80 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 73 74 72 75  har *x;.{.  stru
1eb90 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a  ct symbol *sp;..
1eba0 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69    sp = Symbol_fi
1ebb0 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70 3d  nd(x);.  if( sp=
1ebc0 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28  =0 ){.    sp = (
1ebd0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
1ebe0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
1ebf0 74 72 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b  truct symbol) );
1ec00 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b  .    MemoryCheck
1ec10 28 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61  (sp);.    sp->na
1ec20 6d 65 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b  me = Strsafe(x);
1ec30 0a 20 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20  .    sp->type = 
1ec40 69 73 75 70 70 65 72 28 2a 78 29 20 3f 20 54 45  isupper(*x) ? TE
1ec50 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d  RMINAL : NONTERM
1ec60 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75  INAL;.    sp->ru
1ec70 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  le = 0;.    sp->
1ec80 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  fallback = 0;.  
1ec90 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b    sp->prec = -1;
1eca0 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d  .    sp->assoc =
1ecb0 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69   UNK;.    sp->fi
1ecc0 72 73 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  rstset = 0;.    
1ecd0 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 42 5f 46  sp->lambda = B_F
1ece0 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65  ALSE;.    sp->de
1ecf0 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20  structor = 0;.  
1ed00 20 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d    sp->datatype =
1ed10 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69   0;.    Symbol_i
1ed20 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d  nsert(sp,sp->nam
1ed30 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1ed40 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61   sp;.}../* Compa
1ed50 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66  re two symbols f
1ed60 6f 72 20 77 6f 72 6b 69 6e 67 20 70 75 72 70 6f  or working purpo
1ed70 73 65 73 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c  ses.**.** Symbol
1ed80 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1ed90 68 20 75 70 70 65 72 20 63 61 73 65 20 6c 65 74  h upper case let
1eda0 74 65 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20  ters (terminals 
1edb0 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75  or tokens).** mu
1edc0 73 74 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73  st sort before s
1edd0 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69  ymbols that begi
1ede0 6e 20 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73  n with lower cas
1edf0 65 20 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f  e letters.** (no
1ee00 6e 2d 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 4f  n-terminals).  O
1ee10 74 68 65 72 20 74 68 61 6e 20 74 68 61 74 2c 20  ther than that, 
1ee20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e  the order does n
1ee30 6f 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  ot matter..**.**
1ee40 20 57 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d   We find experim
1ee50 65 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61  entally that lea
1ee60 76 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73  ving the symbols
1ee70 20 69 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e   in their origin
1ee80 61 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65  al.** order (the
1ee90 20 6f 72 64 65 72 20 74 68 65 79 20 61 70 70 65   order they appe
1eea0 61 72 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d  ared in the gram
1eeb0 6d 61 72 20 66 69 6c 65 29 20 67 69 76 65 73 20  mar file) gives 
1eec0 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20  the.** smallest 
1eed0 70 61 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e  parser tables in
1eee0 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20   SQLite..*/.int 
1eef0 53 79 6d 62 6f 6c 63 6d 70 70 28 73 74 72 75 63  Symbolcmpp(struc
1ef00 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 2c 20 73 74  t symbol **a, st
1ef10 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 62 29  ruct symbol **b)
1ef20 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 28 2a 2a  {.  int i1 = (**
1ef30 61 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30  a).index + 10000
1ef40 30 30 30 2a 28 28 2a 2a 61 29 2e 6e 61 6d 65 5b  000*((**a).name[
1ef50 30 5d 3e 27 5a 27 29 3b 0a 20 20 69 6e 74 20 69  0]>'Z');.  int i
1ef60 32 20 3d 20 28 2a 2a 62 29 2e 69 6e 64 65 78 20  2 = (**b).index 
1ef70 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a 62  + 10000000*((**b
1ef80 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a  ).name[0]>'Z');.
1ef90 20 20 72 65 74 75 72 6e 20 69 31 2d 69 32 3b 0a    return i1-i2;.
1efa0 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
1efb0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1efc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1efd0 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
1efe0 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
1eff0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32  rray of type "x2
1f000 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
1f010 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  2 {.  int size; 
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f030 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
1f040 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
1f050 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1f060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f070 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
1f080 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
1f090 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
1f0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0b0 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
1f0c0 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
1f0d0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1f0e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
1f0f0 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
1f100 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
1f110 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x2node *tbl; 
1f120 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
1f130 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
1f140 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a  ruct s_x2node **
1f150 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
1f160 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
1f170 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
1f180 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1f190 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1f1a0 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
1f1b0 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
1f1c0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1f1d0 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e  ay of type "x2".
1f1e0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1f1f0 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20  ct s_x2node {.  
1f200 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
1f210 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1f220 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1f230 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6b 65 79  a */.  char *key
1f240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f250 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
1f260 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
1f270 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
1f280 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
1f290 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
1f2a0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
1f2b0 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
1f2c0 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
1f2d0 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x2node;../* Th
1f2e0 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
1f2f0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1f300 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
1f310 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
1f320 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
1f330 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c  _x2 *x2a;../* Al
1f340 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
1f350 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
1f360 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e  /.void Symbol_in
1f370 69 74 28 29 7b 0a 20 20 69 66 28 20 78 32 61 20  it(){.  if( x2a 
1f380 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20  ) return;.  x2a 
1f390 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29  = (struct s_x2*)
1f3a0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
1f3b0 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20  truct s_x2) );. 
1f3c0 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20   if( x2a ){.    
1f3d0 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x2a->size = 128;
1f3e0 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20  .    x2a->count 
1f3f0 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62  = 0;.    x2a->tb
1f400 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c  l = (x2node*)mal
1f410 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a  loc( .      (siz
1f420 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69  eof(x2node) + si
1f430 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 31  zeof(x2node*))*1
1f440 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 32  28 );.    if( x2
1f450 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
1f460 20 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20     free(x2a);.  
1f470 20 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20      x2a = 0;.   
1f480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1f490 74 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e  t i;.      x2a->
1f4a0 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26  ht = (x2node**)&
1f4b0 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b  (x2a->tbl[128]);
1f4c0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1f4d0 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d  i<128; i++) x2a-
1f4e0 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
1f4f0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
1f500 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
1f510 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
1f520 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
1f530 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
1f540 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
1f550 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
1f560 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
1f570 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
1f580 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72  rt(data,key).str
1f590 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
1f5a0 3b 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20  ;.char *key;.{. 
1f5b0 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x2node *np;.  i
1f5c0 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
1f5d0 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
1f5e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
1f5f0 20 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20   strhash(key);. 
1f600 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e   h = ph & (x2a->
1f610 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
1f620 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
1f630 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
1f640 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
1f650 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  y,key)==0 ){.   
1f660 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
1f670 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
1f680 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
1f690 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
1f6a0 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
1f6b0 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
1f6c0 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
1f6d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1f6e0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
1f6f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d  ;.  }.  if( x2a-
1f700 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a  >count>=x2a->siz
1f710 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
1f720 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
1f730 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
1f740 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
1f750 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
1f760 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  2 array;.    arr
1f770 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
1f780 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x2a->size*2;.  
1f790 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
1f7a0 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x2a->count;.    
1f7b0 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e  array.tbl = (x2n
1f7c0 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20  ode*)malloc(.   
1f7d0 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64     (sizeof(x2nod
1f7e0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f  e) + sizeof(x2no
1f7f0 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20  de*))*size );.  
1f800 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
1f810 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1f820 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
1f830 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
1f840 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
1f850 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x2node**)&(arra
1f860 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20  y.tbl[size]);.  
1f870 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1f880 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
1f890 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
1f8a0 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f 75  (i=0; i<x2a->cou
1f8b0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
1f8c0 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x2node *oldnp, *
1f8d0 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
1f8e0 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b  np = &(x2a->tbl[
1f8f0 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73  i]);.      h = s
1f900 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65  trhash(oldnp->ke
1f910 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20  y) & (size-1);. 
1f920 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
1f930 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
1f940 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
1f950 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
1f960 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
1f970 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
1f980 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
1f990 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
1f9a0 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c   newnp->key = ol
1f9b0 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20  dnp->key;.      
1f9c0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
1f9d0 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
1f9e0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
1f9f0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
1fa00 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
1fa10 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
1fa20 20 20 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62      free(x2a->tb
1fa30 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61  l);.    *x2a = a
1fa40 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
1fa50 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
1fa60 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
1fa70 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
1fa80 20 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62    np = &(x2a->tb
1fa90 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x2a->count++])
1faa0 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65  ;.  np->key = ke
1fab0 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  y;.  np->data = 
1fac0 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d  data;.  if( x2a-
1fad0 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74  >ht[h] ) x2a->ht
1fae0 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
1faf0 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
1fb00 65 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d  ext = x2a->ht[h]
1fb10 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x2a->ht[h] =
1fb20 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
1fb30 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x2a->ht[h]);
1fb40 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1fb50 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
1fb60 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
1fb70 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
1fb80 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
1fb90 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
1fba0 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74  h key. */.struct
1fbb0 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
1fbc0 66 69 6e 64 28 6b 65 79 29 0a 63 68 61 72 20 2a  find(key).char *
1fbd0 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key;.{.  int h;.
1fbe0 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x2node *np;.. 
1fbf0 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
1fc00 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74  turn 0;.  h = st
1fc10 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 32  rhash(key) & (x2
1fc20 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1fc30 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
1fc40 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
1fc50 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
1fc60 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62  >key,key)==0 ) b
1fc70 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
1fc80 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
1fc90 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
1fca0 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
1fcb0 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20 64  eturn the n-th d
1fcc0 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ata.  Return NUL
1fcd0 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f 66  L if n is out of
1fce0 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63   range. */.struc
1fcf0 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
1fd00 5f 4e 74 68 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  _Nth(n).int n;.{
1fd10 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1fd20 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32   *data;.  if( x2
1fd30 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78  a && n>0 && n<=x
1fd40 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20  2a->count ){.   
1fd50 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c   data = x2a->tbl
1fd60 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65  [n-1].data;.  }e
1fd70 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20  lse{.    data = 
1fd80 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1fd90 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  data;.}../* Retu
1fda0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
1fdb0 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20  he array */.int 
1fdc0 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b  Symbol_count().{
1fdd0 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f 20  .  return x2a ? 
1fde0 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a  x2a->count : 0;.
1fdf0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
1fe00 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
1fe10 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e  s to all data in
1fe20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54   the table..** T
1fe30 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
1fe40 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
1fe50 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1fe60 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
1fe70 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c  ion.** problems,
1fe80 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79   or if the array
1fe90 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74   is empty. */.st
1fea0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79  ruct symbol **Sy
1feb0 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b  mbol_arrayof().{
1fec0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1fed0 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20   **array;.  int 
1fee0 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 32  i,size;.  if( x2
1fef0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1ff00 0a 20 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 63  .  size = x2a->c
1ff10 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
1ff20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
1ff30 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
1ff40 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
1ff50 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  )*size );.  if( 
1ff60 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72  array ){.    for
1ff70 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
1ff80 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 32  +) array[i] = x2
1ff90 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a  a->tbl[i].data;.
1ffa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72    }.  return arr
1ffb0 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72  ay;.}../* Compar
1ffc0 65 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61 74  e two configurat
1ffd0 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66  ions */.int Conf
1ffe0 69 67 63 6d 70 28 61 2c 62 29 0a 73 74 72 75 63  igcmp(a,b).struc
1fff0 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72  t config *a;.str
20000 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b  uct config *b;.{
20010 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20  .  int x;.  x = 
20020 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62  a->rp->index - b
20030 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69  ->rp->index;.  i
20040 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d  f( x==0 ) x = a-
20050 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20  >dot - b->dot;. 
20060 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a   return x;.}../*
20070 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61   Compare two sta
20080 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20 69  tes */.PRIVATE i
20090 6e 74 20 73 74 61 74 65 63 6d 70 28 61 2c 62 29  nt statecmp(a,b)
200a0 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
200b0 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a;.struct config
200c0 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 72 63 3b   *b;.{.  int rc;
200d0 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d  .  for(rc=0; rc=
200e0 3d 30 20 26 26 20 61 20 26 26 20 62 3b 20 20 61  =0 && a && b;  a
200f0 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29  =a->bp, b=b->bp)
20100 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70  {.    rc = a->rp
20110 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d  ->index - b->rp-
20120 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  >index;.    if( 
20130 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e  rc==0 ) rc = a->
20140 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20  dot - b->dot;.  
20150 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
20160 0a 20 20 20 20 69 66 28 20 61 20 29 20 72 63 20  .    if( a ) rc 
20170 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29  = 1;.    if( b )
20180 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20   rc = -1;.  }.  
20190 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
201a0 20 48 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f   Hash a state */
201b0 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61  .PRIVATE int sta
201c0 74 65 68 61 73 68 28 61 29 0a 73 74 72 75 63 74  tehash(a).struct
201d0 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20   config *a;.{.  
201e0 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65  int h=0;.  while
201f0 28 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68  ( a ){.    h = h
20200 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e  *571 + a->rp->in
20210 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b  dex*37 + a->dot;
20220 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a  .    a = a->bp;.
20230 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a    }.  return h;.
20240 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  }../* Allocate a
20250 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63   new state struc
20260 74 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73  ture */.struct s
20270 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28  tate *State_new(
20280 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ).{.  struct sta
20290 74 65 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d  te *new;.  new =
202a0 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
202b0 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
202c0 73 74 72 75 63 74 20 73 74 61 74 65 29 20 29 3b  struct state) );
202d0 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e  .  MemoryCheck(n
202e0 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ew);.  return ne
202f0 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  w;.}../* There i
20300 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
20310 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
20320 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
20330 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
20340 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
20350 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x3"..*/.struct 
20360 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x3 {.  int siz
20370 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
20380 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
20390 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
203a0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203c0 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
203d0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
203e0 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
203f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20400 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
20410 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
20420 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
20430 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20440 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
20450 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
20460 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74 62  uct s_x3node *tb
20470 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
20480 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
20490 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
204a0 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
204b0 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
204c0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
204d0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
204e0 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
204f0 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
20500 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
20510 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
20520 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
20530 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  3"..*/.typedef s
20540 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 7b  truct s_x3node {
20550 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
20560 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
20570 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
20580 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
20590 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20 20  config *key;    
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
205b0 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73  * The key */.  s
205c0 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
205d0 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
205e0 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
205f0 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
20600 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a  ruct s_x3node **
20610 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
20620 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e  us link */.} x3n
20630 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
20640 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
20650 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
20660 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
20670 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
20680 69 63 20 73 74 72 75 63 74 20 73 5f 78 33 20 2a  ic struct s_x3 *
20690 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x3a;../* Allocat
206a0 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
206b0 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
206c0 64 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b 0a  d State_init(){.
206d0 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74 75    if( x3a ) retu
206e0 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74 72  rn;.  x3a = (str
206f0 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63  uct s_x3*)malloc
20700 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
20710 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x3) );.  if( x
20720 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73  3a ){.    x3a->s
20730 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78  ize = 128;.    x
20740 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  3a->count = 0;. 
20750 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78     x3a->tbl = (x
20760 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a  3node*)malloc( .
20770 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 33        (sizeof(x3
20780 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
20790 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a  3node*))*128 );.
207a0 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c      if( x3a->tbl
207b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
207c0 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33  e(x3a);.      x3
207d0 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
207e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
207f0 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28       x3a->ht = (
20800 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e  x3node**)&(x3a->
20810 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20  tbl[128]);.     
20820 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b   for(i=0; i<128;
20830 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d   i++) x3a->ht[i]
20840 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
20850 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
20860 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
20870 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
20880 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
20890 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
208a0 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
208b0 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
208c0 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
208d0 74 61 74 65 5f 69 6e 73 65 72 74 28 64 61 74 61  tate_insert(data
208e0 2c 6b 65 79 29 0a 73 74 72 75 63 74 20 73 74 61  ,key).struct sta
208f0 74 65 20 2a 64 61 74 61 3b 0a 73 74 72 75 63 74  te *data;.struct
20900 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a   config *key;.{.
20910 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x3node *np;.  
20920 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b  int h;.  int ph;
20930 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29  ..  if( x3a==0 )
20940 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20   return 0;.  ph 
20950 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29  = statehash(key)
20960 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33  ;.  h = ph & (x3
20970 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
20980 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
20990 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
209a0 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e    if( statecmp(n
209b0 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
209c0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
209d0 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
209e0 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
209f0 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
20a00 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
20a10 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
20a20 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
20a30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
20a40 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
20a50 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
20a60 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61   x3a->count>=x3a
20a70 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
20a80 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
20a90 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
20aa0 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
20ab0 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  ,size;.    struc
20ac0 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20 20  t s_x3 array;.  
20ad0 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73    array.size = s
20ae0 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a 65 2a  ize = x3a->size*
20af0 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
20b00 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b  nt = x3a->count;
20b10 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
20b20 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x3node*)malloc
20b30 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28  (.      (sizeof(
20b40 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x3node) + sizeof
20b50 28 78 33 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20  (x3node*))*size 
20b60 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
20b70 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
20b80 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
20b90 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
20ba0 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
20bb0 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26  ht = (x3node**)&
20bc0 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d  (array.tbl[size]
20bd0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
20be0 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  i<size; i++) arr
20bf0 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
20c00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 33 61    for(i=0; i<x3a
20c10 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
20c20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f 6c 64       x3node *old
20c30 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
20c40 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33 61 2d    oldnp = &(x3a-
20c50 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
20c60 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6f 6c  h = statehash(ol
20c70 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a  dnp->key) & (siz
20c80 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
20c90 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
20ca0 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
20cb0 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
20cc0 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
20cd0 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
20ce0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
20cf0 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
20d00 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
20d10 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
20d20 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
20d30 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
20d40 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
20d50 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
20d60 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
20d70 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
20d80 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
20d90 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x3a->tbl);.    *
20da0 78 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x3a = array;.  }
20db0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
20dc0 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
20dd0 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69   = ph & (x3a->si
20de0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
20df0 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f  x3a->tbl[x3a->co
20e00 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
20e10 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
20e20 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
20e30 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x3a->ht[h] ) 
20e40 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x3a->ht[h]->from
20e50 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
20e60 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61    np->next = x3a
20e70 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e  ->ht[h];.  x3a->
20e80 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
20e90 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e  ->from = &(x3a->
20ea0 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
20eb0 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
20ec0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
20ed0 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
20ee0 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
20ef0 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
20f00 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
20f10 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53  .struct state *S
20f20 74 61 74 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73  tate_find(key).s
20f30 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
20f40 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  y;.{.  int h;.  
20f50 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69  x3node *np;..  i
20f60 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
20f70 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61 74  rn 0;.  h = stat
20f80 65 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 33  ehash(key) & (x3
20f90 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
20fa0 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
20fb0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
20fc0 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e    if( statecmp(n
20fd0 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
20fe0 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
20ff0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
21000 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
21010 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
21020 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79   Return an array
21030 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
21040 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20  all data in the 
21050 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72  table..** The ar
21060 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ray is obtained 
21070 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65  from malloc.  Re
21080 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d  turn NULL if mem
21090 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
210a0 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69  * problems, or i
210b0 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65  f the array is e
210c0 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20  mpty. */.struct 
210d0 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72  state **State_ar
210e0 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75  rayof().{.  stru
210f0 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61 79  ct state **array
21100 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a  ;.  int i,size;.
21110 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72    if( x3a==0 ) r
21120 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20  eturn 0;.  size 
21130 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x3a->count;.  
21140 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20  array = (struct 
21150 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63 28  state **)malloc(
21160 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
21170 74 61 74 65 20 2a 29 2a 73 69 7a 65 20 29 3b 0a  tate *)*size );.
21180 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20    if( array ){. 
21190 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
211a0 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69  ze; i++) array[i
211b0 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e  ] = x3a->tbl[i].
211c0 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75  data;.  }.  retu
211d0 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20  rn array;.}../* 
211e0 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72 61  Hash a configura
211f0 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
21200 69 6e 74 20 63 6f 6e 66 69 67 68 61 73 68 28 61  int confighash(a
21210 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
21220 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b  *a;.{.  int h=0;
21230 0a 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61  .  h = h*571 + a
21240 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b  ->rp->index*37 +
21250 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72   a->dot;.  retur
21260 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65  n h;.}../* There
21270 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
21280 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
21290 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
212a0 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
212b0 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
212c0 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x4"..*/.struc
212d0 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73  t s_x4 {.  int s
212e0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
212f0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
21300 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
21310 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
21340 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
21350 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
21380 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
21390 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
213a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
213b0 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
213c0 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
213d0 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
213e0 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
213f0 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
21400 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
21410 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
21420 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
21430 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
21440 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
21450 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
21460 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
21470 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
21480 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
21490 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
214a0 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x4"..*/.typedef
214b0 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
214c0 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
214d0 69 67 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ig *data;       
214e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
214f0 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
21500 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78  ct s_x4node *nex
21510 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
21520 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
21530 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
21540 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x4node **fro
21550 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
21560 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65  link */.} x4node
21570 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
21580 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
21590 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
215a0 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
215b0 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
215c0 73 74 72 75 63 74 20 73 5f 78 34 20 2a 78 34 61  struct s_x4 *x4a
215d0 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
215e0 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
215f0 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43   array */.void C
21600 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28  onfigtable_init(
21610 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20 72  ){.  if( x4a ) r
21620 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28  eturn;.  x4a = (
21630 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c  struct s_x4*)mal
21640 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
21650 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69 66  ct s_x4) );.  if
21660 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34 61  ( x4a ){.    x4a
21670 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20  ->size = 64;.   
21680 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x4a->count = 0;
21690 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20  .    x4a->tbl = 
216a0 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x4node*)malloc(
216b0 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28   .      (sizeof(
216c0 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x4node) + sizeof
216d0 28 78 34 6e 6f 64 65 2a 29 29 2a 36 34 20 29 3b  (x4node*))*64 );
216e0 0a 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74 62  .    if( x4a->tb
216f0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
21700 65 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20 78  ee(x4a);.      x
21710 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  4a = 0;.    }els
21720 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
21730 20 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d 20        x4a->ht = 
21740 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d  (x4node**)&(x4a-
21750 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20  >tbl[64]);.     
21760 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20   for(i=0; i<64; 
21770 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20  i++) x4a->ht[i] 
21780 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
21790 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
217a0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
217b0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
217c0 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
217d0 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
217e0 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
217f0 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
21800 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f  ritten */.int Co
21810 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
21820 28 64 61 74 61 29 0a 73 74 72 75 63 74 20 63 6f  (data).struct co
21830 6e 66 69 67 20 2a 64 61 74 61 3b 0a 7b 0a 20 20  nfig *data;.{.  
21840 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e  x4node *np;.  in
21850 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a  t h;.  int ph;..
21860 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72    if( x4a==0 ) r
21870 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
21880 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61 29  confighash(data)
21890 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 34  ;.  h = ph & (x4
218a0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
218b0 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
218c0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
218d0 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
218e0 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d  np->data,data)==
218f0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
21900 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
21910 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
21920 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
21930 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
21940 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
21950 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
21960 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
21970 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
21980 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
21990 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x4a->count>=
219a0 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x4a->size ){.   
219b0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
219c0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
219d0 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
219e0 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74  t i,size;.    st
219f0 72 75 63 74 20 73 5f 78 34 20 61 72 72 61 79 3b  ruct s_x4 array;
21a00 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
21a10 3d 20 73 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69  = size = x4a->si
21a20 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
21a30 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75  count = x4a->cou
21a40 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
21a50 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c  l = (x4node*)mal
21a60 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65  loc(.      (size
21a70 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x4node) + siz
21a80 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 73 69  eof(x4node*))*si
21a90 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72  ze );.    if( ar
21aa0 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
21ab0 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
21ac0 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
21ad0 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
21ae0 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a  ay.ht = (x4node*
21af0 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
21b00 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
21b10 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
21b20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
21b30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21b40 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x4a->count; i++)
21b50 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20 2a  {.      x4node *
21b60 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
21b70 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
21b80 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  4a->tbl[i]);.   
21b90 20 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73     h = confighas
21ba0 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26  h(oldnp->data) &
21bb0 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
21bc0 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
21bd0 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
21be0 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
21bf0 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
21c00 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
21c10 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
21c20 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
21c30 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
21c40 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70  np->data = oldnp
21c50 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65  ->data;.      ne
21c60 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72  wnp->from = &(ar
21c70 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20  ray.ht[h]);.    
21c80 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20    array.ht[h] = 
21c90 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20  newnp;.    }.   
21ca0 20 66 72 65 65 28 78 34 61 2d 3e 74 62 6c 29 3b   free(x4a->tbl);
21cb0 0a 20 20 20 20 2a 78 34 61 20 3d 20 61 72 72 61  .    *x4a = arra
21cc0 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65  y;.  }.  /* Inse
21cd0 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20  rt the new data 
21ce0 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  */.  h = ph & (x
21cf0 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
21d00 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 78  p = &(x4a->tbl[x
21d10 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20  4a->count++]);. 
21d20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
21d30 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e 68 74 5b  ;.  if( x4a->ht[
21d40 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d 2d  h] ) x4a->ht[h]-
21d50 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
21d60 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
21d70 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x4a->ht[h];.  
21d80 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x4a->ht[h] = np;
21d90 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
21da0 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x4a->ht[h]);.  r
21db0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
21dc0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
21dd0 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
21de0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
21df0 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
21e00 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
21e10 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  y. */.struct con
21e20 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65  fig *Configtable
21e30 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74 72 75 63  _find(key).struc
21e40 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b  t config *key;.{
21e50 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f  .  int h;.  x4no
21e60 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
21e70 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  4a==0 ) return 0
21e80 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61  ;.  h = configha
21e90 73 68 28 6b 65 79 29 20 26 20 28 78 34 61 2d 3e  sh(key) & (x4a->
21ea0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
21eb0 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x4a->ht[h];.  wh
21ec0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
21ed0 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d  f( Configcmp(np-
21ee0 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20  >data,key)==0 ) 
21ef0 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
21f00 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
21f10 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
21f20 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
21f30 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20  Remove all data 
21f40 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20  from the table. 
21f50 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61 20   Pass each data 
21f60 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
21f70 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73 20  "f".** as it is 
21f80 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20 6d  removed.  ("f" m
21f90 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76  ay be null to av
21fa0 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29 20  oid this step.) 
21fb0 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  */.void Configta
21fc0 62 6c 65 5f 63 6c 65 61 72 28 66 29 0a 69 6e 74  ble_clear(f).int
21fd0 28 2a 66 29 28 2f 2a 20 73 74 72 75 63 74 20 63  (*f)(/* struct c
21fe0 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 7b 0a 20  onfig * */);.{. 
21ff0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 78 34   int i;.  if( x4
22000 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f 75  a==0 || x4a->cou
22010 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  nt==0 ) return;.
22020 20 20 69 66 28 20 66 20 29 20 66 6f 72 28 69 3d    if( f ) for(i=
22030 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b  0; i<x4a->count;
22040 20 69 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d 3e   i++) (*f)(x4a->
22050 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20 20  tbl[i].data);.  
22060 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e  for(i=0; i<x4a->
22070 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d 3e  size; i++) x4a->
22080 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34 61  ht[i] = 0;.  x4a
22090 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 72  ->count = 0;.  r
220a0 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.