/ Hex Artifact Content
Login

Artifact ee5e39ce2b344ce7c81306b27a59da7698114a2d:


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 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 69 66 6e 64 65 66 20 5f 5f 57 49 4e 33 32  .#ifndef __WIN32
01b0: 5f 5f 0a 23 20 20 20 69 66 20 64 65 66 69 6e 65  __.#   if define
01c0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
01d0: 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 09 64 65  ined(WIN32).#.de
01e0: 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  fine __WIN32__.#
01f0: 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a     endif.#endif.
0200: 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f  .#ifdef __WIN32_
0210: 5f 0a 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63  _.extern int acc
0220: 65 73 73 28 29 3b 0a 23 65 6c 73 65 0a 23 69 6e  ess();.#else.#in
0230: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
0240: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66  .#endif../* #def
0250: 69 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74  ine PRIVATE stat
0260: 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  ic */.#define PR
0270: 49 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45  IVATE..#ifdef TE
0280: 53 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48  ST.#define MAXRH
0290: 53 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74  S 5       /* Set
02a0: 20 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65   low to exercise
02b0: 20 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20   exception code 
02c0: 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  */.#else.#define
02d0: 20 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e   MAXRHS 1000.#en
02e0: 64 69 66 0a 0a 73 74 61 74 69 63 20 63 68 61 72  dif..static char
02f0: 20 2a 6d 73 6f 72 74 28 63 68 61 72 2a 2c 63 68   *msort(char*,ch
0300: 61 72 2a 2a 2c 69 6e 74 28 2a 29 28 63 6f 6e 73  ar**,int(*)(cons
0310: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
0320: 61 72 2a 29 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ar*));../*.** Co
0330: 6d 70 69 6c 65 72 73 20 61 72 65 20 67 65 74 74  mpilers are gett
0340: 69 6e 67 20 69 6e 63 72 65 61 73 69 6e 67 6c 79  ing increasingly
0350: 20 70 65 64 61 6e 74 69 63 20 61 62 6f 75 74 20   pedantic about 
0360: 74 79 70 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73  type conversions
0370: 0a 2a 2a 20 61 73 20 43 20 65 76 6f 6c 76 65 73  .** as C evolves
0380: 20 65 76 65 72 20 63 6c 6f 73 65 72 20 74 6f 20   ever closer to 
0390: 41 64 61 2e 2e 2e 2e 20 20 54 6f 20 77 6f 72 6b  Ada....  To work
03a0: 20 61 72 6f 75 6e 64 20 74 68 65 20 6c 61 74 65   around the late
03b0: 73 74 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a 20 77  st problems.** w
03c0: 65 20 68 61 76 65 20 74 6f 20 64 65 66 69 6e 65  e have to define
03d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
03e0: 61 72 69 61 6e 74 20 6f 66 20 73 74 72 6c 65 6e  ariant of strlen
03f0: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 6c  ()..*/.#define l
0400: 65 6d 6f 6e 53 74 72 6c 65 6e 28 58 29 20 20 20  emonStrlen(X)   
0410: 28 28 69 6e 74 29 73 74 72 6c 65 6e 28 58 29 29  ((int)strlen(X))
0420: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
0430: 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e  action *Action_n
0440: 65 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63  ew(void);.static
0450: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
0460: 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75  Action_sort(stru
0470: 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f  ct action *);../
0480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
0490: 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e  the file "build.
04a0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
04b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04c0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69  *******/.void Fi
04d0: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
04e0: 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 69  s();.void FindFi
04f0: 72 73 74 53 65 74 73 28 29 3b 0a 76 6f 69 64 20  rstSets();.void 
0500: 46 69 6e 64 53 74 61 74 65 73 28 29 3b 0a 76 6f  FindStates();.vo
0510: 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a  id FindLinks();.
0520: 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  void FindFollowS
0530: 65 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64  ets();.void Find
0540: 41 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a  Actions();../***
0550: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
0560: 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74  file "configlist
0570: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
0580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0590: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  *****/.void Conf
05a0: 69 67 6c 69 73 74 5f 69 6e 69 74 28 2f 2a 20 76  iglist_init(/* v
05b0: 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  oid */);.struct 
05c0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
05d0: 73 74 5f 61 64 64 28 2f 2a 20 73 74 72 75 63 74  st_add(/* struct
05e0: 20 72 75 6c 65 20 2a 2c 20 69 6e 74 20 2a 2f 29   rule *, int */)
05f0: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
0600: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62  *Configlist_addb
0610: 61 73 69 73 28 2f 2a 20 73 74 72 75 63 74 20 72  asis(/* struct r
0620: 75 6c 65 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a  ule *, int */);.
0630: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
0640: 63 6c 6f 73 75 72 65 28 2f 2a 20 76 6f 69 64 20  closure(/* void 
0650: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0660: 6c 69 73 74 5f 73 6f 72 74 28 2f 2a 20 76 6f 69  list_sort(/* voi
0670: 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  d */);.void Conf
0680: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
0690: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74  (/* void */);.st
06a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
06b0: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 2f  figlist_return(/
06c0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75  * void */);.stru
06d0: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
06e0: 67 6c 69 73 74 5f 62 61 73 69 73 28 2f 2a 20 76  glist_basis(/* v
06f0: 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f  oid */);.void Co
0700: 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 2f 2a 20  nfiglist_eat(/* 
0710: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
0720: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0730: 6c 69 73 74 5f 72 65 73 65 74 28 2f 2a 20 76 6f  list_reset(/* vo
0740: 69 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  id */);../******
0750: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0760: 65 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a  e "error.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: 2a 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d  ***/.void ErrorM
07a0: 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  sg(const char *,
07b0: 20 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 20   int,const char 
07c0: 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  *, ...);../*****
07d0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
07e0: 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a  "option.h" *****
07f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0810: 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  *****/.struct s_
0820: 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d  options {.  enum
0830: 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c 20 20   { OPT_FLAG=1,  
0840: 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f 44 42  OPT_INT,  OPT_DB
0850: 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20 20 20  L,  OPT_STR,.   
0860: 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41 47 2c        OPT_FFLAG,
0870: 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54 5f 46   OPT_FINT, OPT_F
0880: 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d 20 74  DBL, OPT_FSTR} t
0890: 79 70 65 3b 0a 20 20 63 68 61 72 20 2a 6c 61 62  ype;.  char *lab
08a0: 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b  el;.  char *arg;
08b0: 0a 20 20 63 68 61 72 20 2a 6d 65 73 73 61 67 65  .  char *message
08c0: 3b 0a 7d 3b 0a 69 6e 74 20 20 20 20 4f 70 74 49  ;.};.int    OptI
08d0: 6e 69 74 28 2f 2a 20 63 68 61 72 2a 2a 2c 73 74  nit(/* char**,st
08e0: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 2a 2c  ruct s_options*,
08f0: 46 49 4c 45 2a 20 2a 2f 29 3b 0a 69 6e 74 20 20  FILE* */);.int  
0900: 20 20 4f 70 74 4e 41 72 67 73 28 2f 2a 20 76 6f    OptNArgs(/* vo
0910: 69 64 20 2a 2f 29 3b 0a 63 68 61 72 20 20 2a 4f  id */);.char  *O
0920: 70 74 41 72 67 28 2f 2a 20 69 6e 74 20 2a 2f 29  ptArg(/* int */)
0930: 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45 72 72 28  ;.void   OptErr(
0940: 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64  /* int */);.void
0950: 20 20 20 4f 70 74 50 72 69 6e 74 28 2f 2a 20 76     OptPrint(/* v
0960: 6f 69 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  oid */);../*****
0970: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0980: 65 20 22 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a  e "parse.h" ****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09b0: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73  *****/.void Pars
09c0: 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  e(/* struct lemo
09d0: 6e 20 2a 6c 65 6d 70 20 2a 2f 29 3b 0a 0a 2f 2a  n *lemp */);../*
09e0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
09f0: 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68 22  e file "plink.h"
0a00: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
0a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a20: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74  ********/.struct
0a30: 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65   plink *Plink_ne
0a40: 77 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76  w(/* void */);.v
0a50: 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 2f 2a  oid Plink_add(/*
0a60: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a   struct plink **
0a70: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
0a80: 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e  * */);.void Plin
0a90: 6b 5f 63 6f 70 79 28 2f 2a 20 73 74 72 75 63 74  k_copy(/* struct
0aa0: 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63   plink **, struc
0ab0: 74 20 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a 76  t plink * */);.v
0ac0: 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65  oid Plink_delete
0ad0: 28 2f 2a 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  (/* struct plink
0ae0: 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a   * */);../******
0af0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
0b00: 6c 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a  le "report.h" **
0b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b30: 2a 2a 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e  ***/.void Reprin
0b40: 74 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  t(/* struct lemo
0b50: 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65  n * */);.void Re
0b60: 70 6f 72 74 4f 75 74 70 75 74 28 2f 2a 20 73 74  portOutput(/* st
0b70: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29  ruct lemon * */)
0b80: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62  ;.void ReportTab
0b90: 6c 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d  le(/* struct lem
0ba0: 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52  on * */);.void R
0bb0: 65 70 6f 72 74 48 65 61 64 65 72 28 2f 2a 20 73  eportHeader(/* s
0bc0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f  truct lemon * */
0bd0: 29 3b 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73  );.void Compress
0be0: 54 61 62 6c 65 73 28 2f 2a 20 73 74 72 75 63 74  Tables(/* struct
0bf0: 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f   lemon * */);.vo
0c00: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
0c10: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
0c20: 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  * */);../*******
0c30: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0c40: 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  e "set.h" ******
0c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c70: 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a  **/.void  SetSiz
0c80: 65 28 2f 2a 20 69 6e 74 20 4e 20 2a 2f 29 3b 20  e(/* int N */); 
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0ca0: 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62 65 20  ll sets will be 
0cb0: 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63 68 61  of size N */.cha
0cc0: 72 20 2a 53 65 74 4e 65 77 28 2f 2a 20 76 6f 69  r *SetNew(/* voi
0cd0: 64 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20  d */);          
0ce0: 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65       /* A new se
0cf0: 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e  t for element 0.
0d00: 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46  .N */.void  SetF
0d10: 72 65 65 28 2f 2a 20 63 68 61 72 2a 20 2a 2f 29  ree(/* char* */)
0d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0d30: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65   Deallocate a se
0d40: 74 20 2a 2f 0a 0a 69 6e 74 20 53 65 74 41 64 64  t */..int SetAdd
0d50: 28 2f 2a 20 63 68 61 72 2a 2c 69 6e 74 20 2a 2f  (/* char*,int */
0d60: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
0d70: 20 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20   Add element to 
0d80: 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74  a set */.int Set
0d90: 55 6e 69 6f 6e 28 2f 2a 20 63 68 61 72 20 2a 41  Union(/* char *A
0da0: 2c 63 68 61 72 20 2a 42 20 2a 2f 29 3b 20 20 20  ,char *B */);   
0db0: 20 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20   /* A <- A U B, 
0dc0: 74 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a  thru element N *
0dd0: 2f 0a 0a 23 64 65 66 69 6e 65 20 53 65 74 46 69  /..#define SetFi
0de0: 6e 64 28 58 2c 59 29 20 28 58 5b 59 5d 29 20 20  nd(X,Y) (X[Y])  
0df0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0e00: 59 20 69 73 20 69 6e 20 73 65 74 20 58 20 2a 2f  Y is in set X */
0e10: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
0e20: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 74 72  om the file "str
0e30: 75 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  uct.h" *********
0e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
0e60: 0a 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20 64 61  .** Principal da
0e70: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  ta structures fo
0e80: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
0e90: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
0ea0: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
0eb0: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c  LEMON_FALSE=0, L
0ec0: 45 4d 4f 4e 5f 54 52 55 45 7d 20 42 6f 6f 6c 65  EMON_TRUE} Boole
0ed0: 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20  an;../* Symbols 
0ee0: 28 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e  (terminals and n
0ef0: 6f 6e 74 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20  onterminals) of 
0f00: 74 68 65 20 67 72 61 6d 6d 61 72 20 61 72 65 20  the grammar are 
0f10: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
0f20: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73   following: */.s
0f30: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
0f40: 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20   char *name;    
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
0f60: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
0f70: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f90: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
0fa0: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
0fb0: 0a 20 20 65 6e 75 6d 20 7b 0a 20 20 20 20 54 45  .  enum {.    TE
0fc0: 52 4d 49 4e 41 4c 2c 0a 20 20 20 20 4e 4f 4e 54  RMINAL,.    NONT
0fd0: 45 52 4d 49 4e 41 4c 2c 0a 20 20 20 20 4d 55 4c  ERMINAL,.    MUL
0fe0: 54 49 54 45 52 4d 49 4e 41 4c 0a 20 20 7d 20 74  TITERMINAL.  } t
0ff0: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
1000: 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73        /* Symbols
1010: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
1020: 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73  TERMINALS or NTs
1030: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
1040: 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f  e *rule;       /
1050: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1060: 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20 28   rules of this (
1070: 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 73  if an NT) */.  s
1080: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61  truct symbol *fa
1090: 6c 6c 62 61 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62  llback; /* fallb
10a0: 61 63 6b 20 74 6f 6b 65 6e 20 69 6e 20 63 61 73  ack token in cas
10b0: 65 20 74 68 69 73 20 74 6f 6b 65 6e 20 64 6f 65  e this token doe
10c0: 73 6e 27 74 20 70 61 72 73 65 20 2a 2f 0a 20 20  sn't parse */.  
10d0: 69 6e 74 20 70 72 65 63 3b 20 20 20 20 20 20 20  int prec;       
10e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63           /* Prec
10f0: 65 64 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65  edence if define
1100: 64 20 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29  d (-1 otherwise)
1110: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73   */.  enum e_ass
1120: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1130: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1140: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 20 20 7d 20  NE,.    UNK.  } 
1150: 61 73 73 6f 63 3b 20 20 20 20 20 20 20 20 20 20  assoc;          
1160: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
1170: 61 74 69 76 69 74 79 20 69 66 20 70 72 65 63 65  ativity if prece
1180: 64 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64  dence is defined
1190: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73   */.  char *firs
11a0: 74 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  tset;          /
11b0: 2a 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20  * First-set for 
11c0: 61 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69  all rules of thi
11d0: 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f  s symbol */.  Bo
11e0: 6f 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20  olean lambda;   
11f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1200: 66 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e  f NT and can gen
1210: 65 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73  erate an empty s
1220: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75  tring */.  int u
1230: 73 65 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20  seCnt;          
1240: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1250: 20 74 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20   times used */. 
1260: 20 63 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f   char *destructo
1270: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64  r;        /* Cod
1280: 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1290: 20 77 68 65 6e 65 76 65 72 20 74 68 69 73 20 73   whenever this s
12a0: 79 6d 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20  ymbol is.       
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72      ** popped fr
12d0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 64 75 72  om the stack dur
12e0: 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73  ing error proces
12f0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sing */.  int de
1300: 73 74 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20  stLineno;       
1310: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
1320: 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64  r for start of d
1330: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63  estructor */.  c
1340: 68 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20 20  har *datatype;  
1350: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1360: 61 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66 6f  ata type of info
1370: 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79 20  rmation held by 
1380: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79 20  ** object. Only 
13b0: 75 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e 4f  used if type==NO
13c0: 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69  NTERMINAL */.  i
13d0: 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20 20  nt dtnum;       
13e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
13f0: 61 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72 2e  ata type number.
1400: 20 20 49 6e 20 74 68 65 20 70 61 72 73 65 72 2c    In the parser,
1410: 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20 69        ** stack i
1440: 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65 20  s a union.  The 
1450: 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f 66  .yy%d element of
1460: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68 65   ** union is the
1490: 20 63 6f 72 72 65 63 74 20 64 61 74 61 20 74 79   correct data ty
14a0: 70 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a 65  pe for this obje
14b0: 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68 65 20 66  ct */.  /* The f
14c0: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
14d0: 61 72 65 20 75 73 65 64 20 62 79 20 4d 55 4c 54  are used by MULT
14e0: 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e 6c 79 20  ITERMINALs only 
14f0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62 73 79 6d  */.  int nsubsym
1500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1510: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1520: 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 69  ituent symbols i
1530: 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a 2f 0a 20  n the MULTI */. 
1540: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1550: 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20 41 72 72  *subsym;  /* Arr
1560: 61 79 20 6f 66 20 63 6f 6e 73 74 69 74 75 65 6e  ay of constituen
1570: 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 7d 3b 0a  t symbols */.};.
1580: 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64 75 63 74  ./* Each product
1590: 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ion rule in the 
15a0: 67 72 61 6d 6d 61 72 20 69 73 20 73 74 6f 72 65  grammar is store
15b0: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d in the followi
15c0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
15d0: 20 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c 65    */.struct rule
15e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62   {.  struct symb
15f0: 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f 2a  ol *lhs;      /*
1600: 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   Left-hand side 
1610: 6f 66 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20  of the rule */. 
1620: 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b   char *lhsalias;
1630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69            /* Ali
1640: 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 28  as for the LHS (
1650: 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f  NULL if none) */
1660: 0a 20 20 69 6e 74 20 6c 68 73 53 74 61 72 74 3b  .  int lhsStart;
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1680: 72 75 65 20 69 66 20 6c 65 66 74 2d 68 61 6e 64  rue if left-hand
1690: 20 73 69 64 65 20 69 73 20 74 68 65 20 73 74 61   side is the sta
16a0: 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69  rt symbol */.  i
16b0: 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20 20  nt ruleline;    
16c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
16d0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
16e0: 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  ule */.  int nrh
16f0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1700: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
1710: 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  HS symbols */.  
1720: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
1730: 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rhs;     /* The 
1740: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
1750: 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69 61 73   char **rhsalias
1760: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
1770: 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20 52  alias for each R
1780: 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c 20  HS symbol (NULL 
1790: 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e  if none) */.  in
17a0: 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  t line;         
17b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
17c0: 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63  umber at which c
17d0: 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ode begins */.  
17e0: 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20 20 20  char *code;     
17f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1800: 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77 68  code executed wh
1810: 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73 20  en this rule is 
1820: 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74 72  reduced */.  str
1830: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63  uct symbol *prec
1840: 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65 64 65  sym;  /* Precede
1850: 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74  nce symbol for t
1860: 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e  his rule */.  in
1870: 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20  t index;        
1880: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1890: 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ex number for th
18a0: 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 42 6f 6f  is rule */.  Boo
18b0: 6c 65 61 6e 20 63 61 6e 52 65 64 75 63 65 3b 20  lean canReduce; 
18c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
18d0: 20 74 68 69 73 20 72 75 6c 65 20 69 73 20 65 76   this rule is ev
18e0: 65 72 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  er reduced */.  
18f0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
1900: 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65 78 74  tlhs;    /* Next
1910: 20 72 75 6c 65 20 77 69 74 68 20 74 68 65 20 73   rule with the s
1920: 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73 74 72  ame LHS */.  str
1930: 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 3b 20  uct rule *next; 
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 75        /* Next ru
1950: 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c  le in the global
1960: 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   list */.};../* 
1970: 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  A configuration 
1980: 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  is a production 
1990: 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72 61 6d  rule of the gram
19a0: 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77 69 74  mar together wit
19b0: 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64 6f 74  h.** a mark (dot
19c0: 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20 6d 75  ) showing how mu
19d0: 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c 65 20  ch of that rule 
19e0: 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73 73  has been process
19f0: 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20 43 6f  ed so far..** Co
1a00: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 6c 73  nfigurations als
1a10: 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f 6c 6c  o contain a foll
1a20: 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69 73 20  ow-set which is 
1a30: 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69 6e  a list of termin
1a40: 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20 77 68  al.** symbols wh
1a50: 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ich are allowed 
1a60: 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  to immediately f
1a70: 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20 6f 66  ollow the end of
1a80: 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20 45 76   the rule..** Ev
1a90: 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ery configuratio
1aa0: 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 73  n is recorded as
1ab0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1ac0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
1ad0: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
1ae0: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
1af0: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
1b00: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
1b10: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
1b20: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
1b30: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
1b60: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b80: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
1b90: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
1ba0: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
1bb0: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
1bc0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
1bd0: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
1be0: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
1bf0: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
1c00: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
1c10: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
1c20: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
1c30: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
1c40: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
1c50: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1c60: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
1c70: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
1c80: 20 65 6e 75 6d 20 7b 0a 20 20 20 20 43 4f 4d 50   enum {.    COMP
1c90: 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20 20  LETE,           
1ca0: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 75 73     /* The status
1cb0: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
1cc0: 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20 2a 2f  followset and */
1cd0: 0a 20 20 20 20 49 4e 43 4f 4d 50 4c 45 54 45 20  .    INCOMPLETE 
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1cf0: 20 20 73 68 69 66 74 20 63 6f 6d 70 75 74 61 74    shift computat
1d00: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 20 73 74 61 74  ions */.  } stat
1d10: 75 73 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  us;.  struct con
1d20: 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f  fig *next;     /
1d30: 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75 72 61  * Next configura
1d40: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74  tion in the stat
1d50: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  e */.  struct co
1d60: 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20  nfig *bp;       
1d70: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61 73 69  /* The next basi
1d80: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
1d90: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
1da0: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
1db0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
1dc0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
1dd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
1de0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
1df0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1e00: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
1e10: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
1e20: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
1e30: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 53 48 49 46  ction {.    SHIF
1e40: 54 2c 0a 20 20 20 20 41 43 43 45 50 54 2c 0a 20  T,.    ACCEPT,. 
1e50: 20 20 20 52 45 44 55 43 45 2c 0a 20 20 20 20 45     REDUCE,.    E
1e60: 52 52 4f 52 2c 0a 20 20 20 20 53 53 43 4f 4e 46  RROR,.    SSCONF
1e70: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
1e80: 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68     /* A shift/sh
1e90: 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ift conflict */.
1ea0: 20 20 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20      SRCONFLICT, 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec0: 57 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75  Was a reduce, bu
1ed0: 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66  t part of a conf
1ee0: 6c 69 63 74 20 2a 2f 0a 20 20 20 20 52 52 43 4f  lict */.    RRCO
1ef0: 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20  NFLICT,         
1f00: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65       /* Was a re
1f10: 64 75 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f  duce, but part o
1f20: 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  f a conflict */.
1f30: 20 20 20 20 53 48 5f 52 45 53 4f 4c 56 45 44 2c      SH_RESOLVED,
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f50: 57 61 73 20 61 20 73 68 69 66 74 2e 20 20 50 72  Was a shift.  Pr
1f60: 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65  ecedence resolve
1f70: 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  d conflict */.  
1f80: 20 20 52 44 5f 52 45 53 4f 4c 56 45 44 2c 20 20    RD_RESOLVED,  
1f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
1fa0: 73 20 72 65 64 75 63 65 2e 20 20 50 72 65 63 65  s reduce.  Prece
1fb0: 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63  dence resolved c
1fc0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 4e  onflict */.    N
1fd0: 4f 54 5f 55 53 45 44 20 20 20 20 20 20 20 20 20  OT_USED         
1fe0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1ff0: 65 64 20 62 79 20 63 6f 6d 70 72 65 73 73 69 6f  ed by compressio
2000: 6e 20 2a 2f 0a 20 20 7d 20 74 79 70 65 3b 0a 20  n */.  } type;. 
2010: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72   union {.    str
2020: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
2030: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 73      /* The new s
2040: 74 61 74 65 2c 20 69 66 20 61 20 73 68 69 66 74  tate, if a shift
2050: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 72   */.    struct r
2060: 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 2f  ule *rp;       /
2070: 2a 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20 61  * The rule, if a
2080: 20 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78   reduce */.  } x
2090: 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
20a0: 6e 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20  n *next;     /* 
20b0: 4e 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  Next action for 
20c0: 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20  this state */.  
20d0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 63  struct action *c
20e0: 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78 74  ollide;  /* Next
20f0: 20 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65   action with the
2100: 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d 3b   same hash */.};
2110: 0a 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65 20  ../* Each state 
2120: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2130: 20 70 61 72 73 65 72 27 73 20 66 69 6e 69 74 65   parser's finite
2140: 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 2a   state machine.*
2150: 2a 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20  * is encoded as 
2160: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2170: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2180: 75 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75 63  ucture. */.struc
2190: 74 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72 75  t state {.  stru
21a0: 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20  ct config *bp;  
21b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73 69       /* The basi
21c0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  s configurations
21d0: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20   for this state 
21e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
21f0: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
2200: 20 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   All configurati
2210: 6f 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74 20  ons in this set 
2220: 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74 65 6e 75  */.  int statenu
2230: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m;            /*
2240: 20 53 65 71 75 65 6e 74 69 61 6c 20 6e 75 6d 62   Sequential numb
2250: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
2260: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63  e */.  struct ac
2270: 74 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20 20  tion *ap;       
2280: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
2290: 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74 61  ons for this sta
22a0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6b 6e  te */.  int nTkn
22b0: 41 63 74 2c 20 6e 4e 74 41 63 74 3b 20 20 20 20  Act, nNtAct;    
22c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63   /* Number of ac
22d0: 74 69 6f 6e 73 20 6f 6e 20 74 65 72 6d 69 6e 61  tions on termina
22e0: 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  ls and nontermin
22f0: 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6b  als */.  int iTk
2300: 6e 4f 66 73 74 2c 20 69 4e 74 4f 66 73 74 3b 20  nOfst, iNtOfst; 
2310: 20 20 2f 2a 20 79 79 5f 61 63 74 69 6f 6e 5b 5d    /* yy_action[]
2320: 20 6f 66 66 73 65 74 20 66 6f 72 20 74 65 72 6d   offset for term
2330: 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72  inals and nonter
2340: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 66 6c  ms */.  int iDfl
2350: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2360: 20 2f 2a 20 44 65 66 61 75 6c 74 20 61 63 74 69   /* Default acti
2370: 6f 6e 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  on */.};.#define
2380: 20 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31 34   NO_OFFSET (-214
2390: 37 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66  7483647)../* A f
23a0: 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67 61  ollowset propaga
23b0: 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61  tion link indica
23c0: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
23d0: 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20  tents of one.** 
23e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f  configuration fo
23f0: 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20 62  llowset should b
2400: 65 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f 20  e propagated to 
2410: 61 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65 72  another whenever
2420: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 68  .** the first ch
2430: 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74  anges. */.struct
2440: 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63   plink {.  struc
2450: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
2460: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69      /* The confi
2470: 67 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69 63  guration to whic
2480: 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74  h linked */.  st
2490: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74  ruct plink *next
24a0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;      /* The ne
24b0: 78 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e  xt propagate lin
24c0: 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20  k */.};../* The 
24d0: 73 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72  state vector for
24e0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 73   the entire pars
24f0: 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73 20  er generator is 
2500: 72 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66  recorded as.** f
2510: 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20  ollows.  (LEMON 
2520: 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76  uses no global v
2530: 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b  ariables and mak
2540: 65 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f 66  es little use of
2550: 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61  .** static varia
2560: 62 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69 6e  bles.  Fields in
2570: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2580: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
2590: 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73  thought.** of as
25a0: 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61   begin global va
25b0: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70  riables in the p
25c0: 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75  rogram.) */.stru
25d0: 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72  ct lemon {.  str
25e0: 75 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72 74  uct state **sort
25f0: 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f  ed;   /* Table o
2600: 66 20 73 74 61 74 65 73 20 73 6f 72 74 65 64 20  f states sorted 
2610: 62 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20  by state number 
2620: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
2630: 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a   *rule;       /*
2640: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c   List of all rul
2650: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 74 61  es */.  int nsta
2660: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2670: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74   /* Number of st
2680: 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 72  ates */.  int nr
2690: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
26a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26b0: 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rules */.  int n
26c0: 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20 20  symbol;         
26d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26e0: 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f   terminal and no
26f0: 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  nterminal symbol
2700: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74 65 72 6d  s */.  int nterm
2710: 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  inal;           
2720: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
2730: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f  minal symbols */
2740: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2750: 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20 53   **symbols; /* S
2760: 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66 20 70  orted array of p
2770: 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d 62 6f  ointers to symbo
2780: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ls */.  int erro
2790: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rcnt;           
27a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
27b0: 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  rors */.  struct
27c0: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b   symbol *errsym;
27d0: 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
27e0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
27f0: 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64 63  ct symbol *wildc
2800: 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74 68  ard; /* Token th
2810: 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  at matches anyth
2820: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e  ing */.  char *n
2830: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2840: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2850: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
2860: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  r */.  char *arg
2870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2880: 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f  /* Declaration o
2890: 66 20 74 68 65 20 33 74 68 20 61 72 67 75 6d 65  f the 3th argume
28a0: 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a  nt to parser */.
28b0: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70    char *tokentyp
28c0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79  e;         /* Ty
28d0: 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73  pe of terminal s
28e0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 70 61  ymbols in the pa
28f0: 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  rser stack */.  
2900: 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b 20 20  char *vartype;  
2910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2920: 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f 66 20  default type of 
2930: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d  non-terminal sym
2940: 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  bols */.  char *
2950: 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  start;          
2960: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2970: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 66  e start symbol f
2980: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  or the grammar *
2990: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63 6b 73  /.  char *stacks
29a0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
29b0: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73  Size of the pars
29c0: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  er stack */.  ch
29d0: 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20  ar *include;    
29e0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
29f0: 6f 20 70 75 74 20 61 74 20 74 68 65 20 73 74 61  o put at the sta
2a00: 72 74 20 6f 66 20 74 68 65 20 43 20 66 69 6c 65  rt of the C file
2a10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72 6f   */.  char *erro
2a20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
2a30: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
2a40: 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  e when an error 
2a50: 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 63 68 61  is seen */.  cha
2a60: 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20  r *overflow;    
2a70: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
2a80: 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73 74   execute on a st
2a90: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a  ack overflow */.
2aa0: 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b    char *failure;
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2ac0: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
2ad0: 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65 20   parser failure 
2ae0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65 70  */.  char *accep
2af0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2b00: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
2b10: 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
2b20: 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 63 68   excepts */.  ch
2b30: 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20  ar *extracode;  
2b40: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61         /* Code a
2b50: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67  ppended to the g
2b60: 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f  enerated file */
2b70: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65  .  char *tokende
2b80: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
2b90: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74  ode to execute t
2ba0: 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20  o destroy token 
2bb0: 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
2bc0: 76 61 72 64 65 73 74 3b 20 20 20 20 20 20 20 20  vardest;        
2bd0: 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74     /* Code for t
2be0: 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74  he default non-t
2bf0: 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75 63 74  erminal destruct
2c00: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69  or */.  char *fi
2c10: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2c20: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2c30: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
2c40: 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20  char *outname;  
2c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2c60: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2c70: 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20  output file */. 
2c80: 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66   char *tokenpref
2c90: 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70  ix;       /* A p
2ca0: 72 65 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  refix added to t
2cb0: 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68  oken names in th
2cc0: 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69  e .h file */.  i
2cd0: 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20  nt nconflict;   
2ce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2cf0: 72 20 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e  r of parsing con
2d00: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20  flicts */.  int 
2d10: 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20  tablesize;      
2d20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2d30: 74 68 65 20 70 61 72 73 65 20 74 61 62 6c 65 73  the parse tables
2d40: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66   */.  int basisf
2d50: 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lag;           /
2d60: 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73  * Print only bas
2d70: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
2d80: 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66  s */.  int has_f
2d90: 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  allback;        
2da0: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 25  /* True if any %
2db0: 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e  fallback is seen
2dc0: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
2dd0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e  */.  int nolinen
2de0: 6f 73 66 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  osflag;       /*
2df0: 20 54 72 75 65 20 69 66 20 23 6c 69 6e 65 20 73   True if #line s
2e00: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
2e10: 20 6e 6f 74 20 62 65 20 70 72 69 6e 74 65 64 20   not be printed 
2e20: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30  */.  char *argv0
2e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
2e50: 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  gram */.};..#def
2e60: 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ine MemoryCheck(
2e70: 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c  X) if((X)==0){ \
2e80: 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d  .  extern void m
2e90: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
2ea0: 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  .  memory_error(
2eb0: 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ); \.}../*******
2ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
2ed0: 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68  he file "table.h
2ee0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
2ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f00: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
2f10: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
2f20: 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
2f30: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
2f40: 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
2f50: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
2f60: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
2f70: 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
2f80: 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
2f90: 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
2fa0: 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
2fb0: 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
2fc0: 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
2fd0: 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
2fe0: 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
2ff0: 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
3000: 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
3010: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
3020: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
3030: 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
3040: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
3050: 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 6f 75 74 69  or..*/../* Routi
3060: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
3070: 20 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63   a strings */..c
3080: 68 61 72 20 2a 53 74 72 73 61 66 65 28 29 3b 0a  har *Strsafe();.
3090: 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e  .void Strsafe_in
30a0: 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  it(/* void */);.
30b0: 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
30c0: 72 74 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29  rt(/* char * */)
30d0: 3b 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  ;.char *Strsafe_
30e0: 66 69 6e 64 28 2f 2a 20 63 68 61 72 20 2a 20 2a  find(/* char * *
30f0: 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73  /);../* Routines
3100: 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73 79   for handling sy
3110: 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61  mbols of the gra
3120: 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20  mmar */..struct 
3130: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
3140: 65 77 28 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c  ew();.int Symbol
3150: 63 6d 70 70 28 2f 2a 20 73 74 72 75 63 74 20 73  cmpp(/* struct s
3160: 79 6d 62 6f 6c 20 2a 2a 2c 20 73 74 72 75 63 74  ymbol **, struct
3170: 20 73 79 6d 62 6f 6c 20 2a 2a 20 2a 2f 29 3b 0a   symbol ** */);.
3180: 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  void Symbol_init
3190: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e  (/* void */);.in
31a0: 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28  t Symbol_insert(
31b0: 2f 2a 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  /* struct symbol
31c0: 20 2a 2c 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a   *, char * */);.
31d0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
31e0: 79 6d 62 6f 6c 5f 66 69 6e 64 28 2f 2a 20 63 68  ymbol_find(/* ch
31f0: 61 72 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ar * */);.struct
3200: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
3210: 4e 74 68 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a  Nth(/* int */);.
3220: 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  int Symbol_count
3230: 28 2f 2a 20 20 2a 2f 29 3b 0a 73 74 72 75 63 74  (/*  */);.struct
3240: 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
3250: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
3260: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74  ;../* Routines t
3270: 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61  o manage the sta
3280: 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74  te table */..int
3290: 20 43 6f 6e 66 69 67 63 6d 70 28 2f 2a 20 73 74   Configcmp(/* st
32a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2c 20 73  ruct config *, s
32b0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a  truct config * *
32c0: 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  /);.struct state
32d0: 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 3b 0a 76   *State_new();.v
32e0: 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 2f  oid State_init(/
32f0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
3300: 53 74 61 74 65 5f 69 6e 73 65 72 74 28 2f 2a 20  State_insert(/* 
3310: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20  struct state *, 
3320: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
3330: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74  */);.struct stat
3340: 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 2f 2a  e *State_find(/*
3350: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
3360: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61   */);.struct sta
3370: 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79  te **State_array
3380: 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20  of(/*  */);../* 
3390: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 6f  Routines used fo
33a0: 72 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e 20  r efficiency in 
33b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20 2a  Configlist_add *
33c0: 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  /..void Configta
33d0: 62 6c 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  ble_init(/* void
33e0: 20 2a 2f 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67   */);.int Config
33f0: 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 2f 2a 20  table_insert(/* 
3400: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
3410: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  */);.struct conf
3420: 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ig *Configtable_
3430: 66 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63  find(/* struct c
3440: 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69  onfig * */);.voi
3450: 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c  d Configtable_cl
3460: 65 61 72 28 2f 2a 20 69 6e 74 28 2a 29 28 73 74  ear(/* int(*)(st
3470: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 2a  ruct config *) *
3480: 2f 29 3b 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /);./***********
3490: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
34a0: 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22   file "action.c"
34b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
34c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34d0: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
34e0: 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61 72 73   processing pars
34f0: 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68  er actions in th
3500: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
3510: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
3520: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
3530: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f  parser action */
3540: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
3550: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
3560: 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  w(void){.  stati
3570: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
3580: 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20  *freelist = 0;. 
3590: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
35a0: 6e 65 77 3b 0a 0a 20 20 69 66 28 20 66 72 65 65  new;..  if( free
35b0: 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
35c0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d  nt i;.    int am
35d0: 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66 72 65  t = 100;.    fre
35e0: 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
35f0: 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28  action *)calloc(
3600: 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  amt, sizeof(stru
3610: 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20 20 20  ct action));.   
3620: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
3630: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
3640: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
3650: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
3660: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61  ory for a new pa
3670: 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a  rser action.");.
3680: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
3690: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
36a0: 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
36b0: 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74  freelist[i].next
36c0: 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31   = &freelist[i+1
36d0: 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b  ];.    freelist[
36e0: 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b  amt-1].next = 0;
36f0: 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65  .  }.  new = fre
3700: 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73  elist;.  freelis
3710: 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65  t = freelist->ne
3720: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  xt;.  return new
3730: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
3740: 74 77 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20  two actions for 
3750: 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
3760: 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
3770: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20  ve, zero, or.** 
3780: 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
3790: 66 69 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20  first action is 
37a0: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
37b0: 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
37c0: 74 68 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73  than.** the firs
37d0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
37e0: 61 63 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72  actioncmp(.  str
37f0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c  uct action *ap1,
3800: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
3810: 20 2a 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72   *ap2.){.  int r
3820: 63 3b 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73  c;.  rc = ap1->s
3830: 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e  p->index - ap2->
3840: 73 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28  sp->index;.  if(
3850: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
3860: 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70   = (int)ap1->typ
3870: 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79  e - (int)ap2->ty
3880: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  pe;.  }.  if( rc
3890: 3d 3d 30 20 26 26 20 61 70 31 2d 3e 74 79 70 65  ==0 && ap1->type
38a0: 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  ==REDUCE ){.    
38b0: 72 63 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d 3e  rc = ap1->x.rp->
38c0: 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e 72  index - ap2->x.r
38d0: 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  p->index;.  }.  
38e0: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
38f0: 20 72 63 20 3d 20 61 70 32 20 2d 20 61 70 31 3b   rc = ap2 - ap1;
3900: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3910: 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70 61 72  ;.}../* Sort par
3920: 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 73  ser actions */.s
3930: 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74  tatic struct act
3940: 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74  ion *Action_sort
3950: 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  (.  struct actio
3960: 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20 3d 20  n *ap.){.  ap = 
3970: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
3980: 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29 61  )msort((char *)a
3990: 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70 2d 3e  p,(char **)&ap->
39a0: 6e 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20  next,.          
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39c0: 20 20 20 20 28 69 6e 74 28 2a 29 28 63 6f 6e 73      (int(*)(cons
39d0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
39e0: 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70 29 3b  ar*))actioncmp);
39f0: 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a  .  return ap;.}.
3a00: 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64 64  .void Action_add
3a10: 28 61 70 70 2c 74 79 70 65 2c 73 70 2c 61 72 67  (app,type,sp,arg
3a20: 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ).struct action 
3a30: 2a 2a 61 70 70 3b 0a 65 6e 75 6d 20 65 5f 61 63  **app;.enum e_ac
3a40: 74 69 6f 6e 20 74 79 70 65 3b 0a 73 74 72 75 63  tion type;.struc
3a50: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 63 68  t symbol *sp;.ch
3a60: 61 72 20 2a 61 72 67 3b 0a 7b 0a 20 20 73 74 72  ar *arg;.{.  str
3a70: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b  uct action *new;
3a80: 0a 20 20 6e 65 77 20 3d 20 41 63 74 69 6f 6e 5f  .  new = Action_
3a90: 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65  new();.  new->ne
3aa0: 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70  xt = *app;.  *ap
3ab0: 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e  p = new;.  new->
3ac0: 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e  type = type;.  n
3ad0: 65 77 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69  ew->sp = sp;.  i
3ae0: 66 28 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29  f( type==SHIFT )
3af0: 7b 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 73 74 70  {.    new->x.stp
3b00: 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65   = (struct state
3b10: 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b   *)arg;.  }else{
3b20: 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 72 70 20 3d  .    new->x.rp =
3b30: 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29   (struct rule *)
3b40: 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a  arg;.  }.}./****
3b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b60: 2a 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f 20 69  ** New code to i
3b70: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 61 63  mplement the "ac
3b80: 74 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a  ttab" module ***
3b90: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
3ba0: 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70 6c  This module impl
3bb0: 65 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65 73 20  ements routines 
3bc0: 75 73 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  use to construct
3bd0: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
3be0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   table..*/../*.*
3bf0: 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74  * The state of t
3c00: 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62  he yy_action tab
3c10: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
3c20: 63 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74  ction is an inst
3c30: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ance of.** the f
3c40: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
3c50: 72 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  re.*/.typedef st
3c60: 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74 74  ruct acttab actt
3c70: 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61  ab;.struct actta
3c80: 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f  b {.  int nActio
3c90: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3ca0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3cb0: 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41  used slots in aA
3cc0: 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ction[] */.  int
3cd0: 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20   nActionAlloc;  
3ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f            /* Slo
3cf0: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ts allocated for
3d00: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
3d10: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 69 6e 74  struct {.    int
3d20: 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20   lookahead;     
3d30: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
3d40: 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   of the lookahea
3d50: 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 69  d token */.    i
3d60: 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20 20  nt action;      
3d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74            /* Act
3d80: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74  ion to take on t
3d90: 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65  he given lookahe
3da0: 61 64 20 2a 2f 0a 20 20 7d 20 2a 61 41 63 74 69  ad */.  } *aActi
3db0: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
3dc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61       /* The yy_a
3dd0: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e  ction[] table un
3de0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
3df0: 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68   */.    *aLookah
3e00: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3e10: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e     /* A single n
3e20: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  ew transaction s
3e30: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f  et */.  int mnLo
3e40: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
3e50: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
3e60: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f  aLookahead[].loo
3e70: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
3e80: 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  mnAction;       
3e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69           /* Acti
3ea0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
3eb0: 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a  th mnLookahead *
3ec0: 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68  /.  int mxLookah
3ed0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3ee0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f   /* Maximum aLoo
3ef0: 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65  kahead[].lookahe
3f00: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ad */.  int nLoo
3f10: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
3f20: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f       /* Used slo
3f30: 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64  ts in aLookahead
3f40: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  [] */.  int nLoo
3f50: 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20  kaheadAlloc;    
3f60: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c       /* Slots al
3f70: 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b  located in aLook
3f80: 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  ahead[] */.};../
3f90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
3fa0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3fb0: 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  n the yy_action 
3fc0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
3fd0: 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58 29 20   acttab_size(X) 
3fe0: 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a  ((X)->nAction)..
3ff0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72  /* The value for
4000: 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20   the N-th entry 
4010: 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a  in yy_action */.
4020: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
4030: 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28  yaction(X,N)  ((
4040: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61  X)->aAction[N].a
4050: 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76  ction)../* The v
4060: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74  alue for the N-t
4070: 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f  h entry in yy_lo
4080: 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69  okahead */.#defi
4090: 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b  ne acttab_yylook
40a0: 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29  ahead(X,N)  ((X)
40b0: 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f  ->aAction[N].loo
40c0: 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65  kahead)../* Free
40d0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
40e0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
40f0: 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a  given acttab */.
4100: 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72 65 65  void acttab_free
4110: 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66  (acttab *p){.  f
4120: 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20  ree( p->aAction 
4130: 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c  );.  free( p->aL
4140: 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72  ookahead );.  fr
4150: 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41  ee( p );.}../* A
4160: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63  llocate a new ac
4170: 74 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a  ttab structure *
4180: 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74 61 62  /.acttab *acttab
4190: 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20  _alloc(void){.  
41a0: 61 63 74 74 61 62 20 2a 70 20 3d 20 63 61 6c 6c  acttab *p = call
41b0: 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70  oc( 1, sizeof(*p
41c0: 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
41d0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
41e0: 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f  tderr,"Unable to
41f0: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
4200: 20 66 6f 72 20 61 20 6e 65 77 20 61 63 74 74 61   for a new actta
4210: 62 2e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  b.");.    exit(1
4220: 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  );.  }.  memset(
4230: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
4240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
4250: 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 61  ../* Add a new a
4260: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 75 72  ction to the cur
4270: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
4280: 20 73 65 74 0a 2a 2f 0a 76 6f 69 64 20 61 63 74   set.*/.void act
4290: 74 61 62 5f 61 63 74 69 6f 6e 28 61 63 74 74 61  tab_action(actta
42a0: 62 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68  b *p, int lookah
42b0: 65 61 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29  ead, int action)
42c0: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b  {.  if( p->nLook
42d0: 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61  ahead>=p->nLooka
42e0: 68 65 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  headAlloc ){.   
42f0: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c   p->nLookaheadAl
4300: 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70  loc += 25;.    p
4310: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 72  ->aLookahead = r
4320: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b  ealloc( p->aLook
4330: 61 68 65 61 64 2c 0a 20 20 20 20 20 20 20 20 20  ahead,.         
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c      sizeof(p->aL
4360: 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e  ookahead[0])*p->
4370: 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20  nLookaheadAlloc 
4380: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4c  );.    if( p->aL
4390: 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20  ookahead==0 ){. 
43a0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
43b0: 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
43c0: 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ed\n");.      ex
43d0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  it(1);.    }.  }
43e0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61  .  if( p->nLooka
43f0: 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70  head==0 ){.    p
4400: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mxLookahead = 
4410: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70  lookahead;.    p
4420: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mnLookahead = 
4430: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70  lookahead;.    p
4440: 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74  ->mnAction = act
4450: 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ion;.  }else{.  
4460: 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61    if( p->mxLooka
4470: 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29  head<lookahead )
4480: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20   p->mxLookahead 
4490: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
44a0: 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68   if( p->mnLookah
44b0: 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b  ead>lookahead ){
44c0: 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b  .      p->mnLook
44d0: 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61  ahead = lookahea
44e0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63  d;.      p->mnAc
44f0: 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20  tion = action;. 
4500: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c     }.  }.  p->aL
4510: 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f  ookahead[p->nLoo
4520: 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61  kahead].lookahea
4530: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
4540: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70   p->aLookahead[p
4550: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63  ->nLookahead].ac
4560: 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20  tion = action;. 
4570: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b   p->nLookahead++
4580: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
4590: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
45a0: 65 74 20 62 75 69 6c 74 20 75 70 20 77 69 74 68  et built up with
45b0: 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20   prior calls to 
45c0: 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a  acttab_action().
45d0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  ** into the curr
45e0: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
45f0: 2e 20 20 54 68 65 6e 20 72 65 73 65 74 20 74 68  .  Then reset th
4600: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
4610: 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20  t back.** to an 
4620: 65 6d 70 74 79 20 73 65 74 20 69 6e 20 70 72 65  empty set in pre
4630: 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e  paration for a n
4640: 65 77 20 72 6f 75 6e 64 20 6f 66 20 61 63 74 74  ew round of actt
4650: 61 62 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c  ab_action() call
4660: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
4670: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
4680: 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
4690: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 72 61 6e   of the new tran
46a0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
46b0: 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 61 63  acttab_insert(ac
46c0: 74 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20  ttab *p){.  int 
46d0: 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73  i, j, k, n;.  as
46e0: 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68  sert( p->nLookah
46f0: 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ead>0 );..  /* M
4700: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
4710: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
4720: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 61 6e 64   hold the expand
4730: 65 64 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a  ed action table.
4740: 20 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f 72 73    ** in the wors
4750: 74 20 63 61 73 65 2e 20 20 54 68 65 20 77 6f 72  t case.  The wor
4760: 73 74 20 63 61 73 65 20 6f 63 63 75 72 73 20 69  st case occurs i
4770: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
4780: 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20  n set.  ** must 
4790: 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
47a0: 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f  he current actio
47b0: 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e  n table.  */.  n
47c0: 20 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61   = p->mxLookahea
47d0: 64 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e  d + 1;.  if( p->
47e0: 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70  nAction + n >= p
47f0: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29  ->nActionAlloc )
4800: 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c  {.    int oldAll
4810: 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41  oc = p->nActionA
4820: 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63  lloc;.    p->nAc
4830: 74 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  tionAlloc = p->n
4840: 41 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e  Action + n + p->
4850: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32  nActionAlloc + 2
4860: 30 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  0;.    p->aActio
4870: 6e 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e  n = realloc( p->
4880: 61 41 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  aAction,.       
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48a0: 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63     sizeof(p->aAc
48b0: 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74  tion[0])*p->nAct
48c0: 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69  ionAlloc);.    i
48d0: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30  f( p->aAction==0
48e0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
48f0: 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63  f(stderr,"malloc
4900: 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20   failed\n");.   
4910: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
4920: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41  }.    for(i=oldA
4930: 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69  lloc; i<p->nActi
4940: 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20  onAlloc; i++){. 
4950: 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b       p->aAction[
4960: 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d  i].lookahead = -
4970: 31 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74  1;.      p->aAct
4980: 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20  ion[i].action = 
4990: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  -1;.    }.  }.. 
49a0: 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 65 78 69   /* Scan the exi
49b0: 73 74 69 6e 67 20 61 63 74 69 6f 6e 20 74 61 62  sting action tab
49c0: 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  le looking for a
49d0: 6e 20 6f 66 66 73 65 74 20 77 68 65 72 65 20 77  n offset where w
49e0: 65 20 63 61 6e 0a 20 20 2a 2a 20 69 6e 73 65 72  e can.  ** inser
49f0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
4a00: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20  ansaction set.  
4a10: 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20  Fall out of the 
4a20: 6c 6f 6f 70 20 77 68 65 6e 20 74 68 61 74 0a 20  loop when that. 
4a30: 20 2a 2a 20 6f 66 66 73 65 74 20 69 73 20 66 6f   ** offset is fo
4a40: 75 6e 64 2e 20 20 49 6e 20 74 68 65 20 77 6f 72  und.  In the wor
4a50: 73 74 20 63 61 73 65 2c 20 77 65 20 66 61 6c 6c  st case, we fall
4a60: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
4a70: 20 77 68 65 6e 0a 20 20 2a 2a 20 69 20 72 65 61   when.  ** i rea
4a80: 63 68 65 73 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c  ches p->nAction,
4a90: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 77 65 20   which means we 
4aa0: 61 70 70 65 6e 64 20 74 68 65 20 6e 65 77 20 74  append the new t
4ab0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a  ransaction set..
4ac0: 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74    **.  ** i is t
4ad0: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61  he index in p->a
4ae0: 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70  Action[] where p
4af0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73  ->mnLookahead is
4b00: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
4b10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
4b20: 6e 41 63 74 69 6f 6e 2b 70 2d 3e 6d 6e 4c 6f 6f  nAction+p->mnLoo
4b30: 6b 61 68 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20  kahead; i++){.  
4b40: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
4b50: 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20  [i].lookahead<0 
4b60: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
4b70: 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ; j<p->nLookahea
4b80: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
4b90: 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65   k = p->aLookahe
4ba0: 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  ad[j].lookahead 
4bb0: 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  - p->mnLookahead
4bc0: 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66   + i;.        if
4bd0: 28 20 6b 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20  ( k<0 ) break;. 
4be0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41         if( p->aA
4bf0: 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65  ction[k].lookahe
4c00: 61 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ad>=0 ) break;. 
4c10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4c20: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
4c30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4c40: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
4c50: 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a  >nAction; j++){.
4c60: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
4c70: 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68  Action[j].lookah
4c80: 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b  ead==j+p->mnLook
4c90: 61 68 65 61 64 2d 69 20 29 20 62 72 65 61 6b 3b  ahead-i ) break;
4ca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4cb0: 66 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e  f( j==p->nAction
4cc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
4cd0: 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69 6e 20 65  k;  /* Fits in e
4ce0: 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20  mpty slots */.  
4cf0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
4d00: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69  if( p->aAction[i
4d10: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e  ].lookahead==p->
4d20: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20  mnLookahead ){. 
4d30: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
4d40: 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70  ion[i].action!=p
4d50: 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e  ->mnAction ) con
4d60: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
4d70: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
4d80: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
4d90: 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f       k = p->aLoo
4da0: 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68  kahead[j].lookah
4db0: 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ead - p->mnLooka
4dc0: 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20  head + i;.      
4dd0: 20 20 69 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d    if( k<0 || k>=
4de0: 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 62 72 65  p->nAction ) bre
4df0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ak;.        if( 
4e00: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
4e10: 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61  .lookahead!=p->a
4e20: 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68  Action[k].lookah
4e30: 65 61 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ead ) break;.   
4e40: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f       if( p->aLoo
4e50: 6b 61 68 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e  kahead[j].action
4e60: 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e  !=p->aAction[k].
4e70: 61 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a  action ) break;.
4e80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4e90: 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ( j<p->nLookahea
4ea0: 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  d ) continue;.  
4eb0: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
4ec0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
4ed0: 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Action; j++){.  
4ee0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
4ef0: 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[j].lookahea
4f00: 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  d<0 ) continue;.
4f10: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
4f20: 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68  Action[j].lookah
4f30: 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b  ead==j+p->mnLook
4f40: 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20  ahead-i ) n++;. 
4f50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4f60: 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61   n==p->nLookahea
4f70: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
4f80: 61 6b 3b 20 20 2f 2a 20 53 61 6d 65 20 61 73 20  ak;  /* Same as 
4f90: 61 20 70 72 69 6f 72 20 74 72 61 6e 73 61 63 74  a prior transact
4fa0: 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20 20 20 20  ion set */.     
4fb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
4fc0: 2a 20 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63  * Insert transac
4fd0: 74 69 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65  tion set at inde
4fe0: 78 20 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d  x i. */.  for(j=
4ff0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
5000: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20  ad; j++){.    k 
5010: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
5020: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
5030: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
5040: 69 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  i;.    p->aActio
5050: 6e 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61  n[k] = p->aLooka
5060: 68 65 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  head[j];.    if(
5070: 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29   k>=p->nAction )
5080: 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b   p->nAction = k+
5090: 31 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f  1;.  }.  p->nLoo
50a0: 6b 61 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f  kahead = 0;..  /
50b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
50c0: 73 65 74 20 74 68 61 74 20 69 73 20 61 64 64 65  set that is adde
50d0: 64 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65  d to the lookahe
50e0: 61 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ad in order to g
50f0: 65 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  et the.  ** inde
5100: 78 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e  x into yy_action
5110: 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a   of the action *
5120: 2f 0a 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70  /.  return i - p
5130: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d  ->mnLookahead;.}
5140: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
5150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
5160: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 63  he file "build.c
5170: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
5180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
5190: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
51a0: 74 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  to construction 
51b0: 74 68 65 20 66 69 6e 69 74 65 20 73 74 61 74 65  the finite state
51c0: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68 65   machine for the
51d0: 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72   LEMON.** parser
51e0: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
51f0: 2f 2a 20 46 69 6e 64 20 61 20 70 72 65 63 65 64  /* Find a preced
5200: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65  ence symbol of e
5210: 76 65 72 79 20 72 75 6c 65 20 69 6e 20 74 68 65  very rule in the
5220: 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a   grammar..** .**
5230: 20 54 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69   Those rules whi
5240: 63 68 20 68 61 76 65 20 61 20 70 72 65 63 65 64  ch have a preced
5250: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65  ence symbol code
5260: 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a  d in the input.*
5270: 2a 20 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20  * grammar using 
5280: 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63  the "[symbol]" c
5290: 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c  onstruct will al
52a0: 72 65 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a  ready have the.*
52b0: 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69  * rp->precsym fi
52c0: 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68  eld filled.  Oth
52d0: 65 72 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73  er rules take as
52e0: 20 74 68 65 69 72 20 70 72 65 63 65 64 65 6e 63   their precedenc
52f0: 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20  e.** symbol the 
5300: 66 69 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c  first RHS symbol
5310: 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20   with a defined 
5320: 70 72 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20  precedence.  If 
5330: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74  there.** are not
5340: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74   RHS symbols wit
5350: 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63  h a defined prec
5360: 65 64 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63  edence, the prec
5370: 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c  edence.** symbol
5380: 20 66 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62   field is left b
5390: 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  lank..*/.void Fi
53a0: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
53b0: 73 28 78 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  s(xp).struct lem
53c0: 6f 6e 20 2a 78 70 3b 0a 7b 0a 20 20 73 74 72 75  on *xp;.{.  stru
53d0: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 66  ct rule *rp;.  f
53e0: 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65 3b 20  or(rp=xp->rule; 
53f0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
5400: 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72  {.    if( rp->pr
5410: 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  ecsym==0 ){.    
5420: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
5430: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
5440: 3e 6e 72 68 73 20 26 26 20 72 70 2d 3e 70 72 65  >nrhs && rp->pre
5450: 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20  csym==0; i++){. 
5460: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
5470: 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
5480: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs[i];.        i
5490: 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  f( sp->type==MUL
54a0: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
54b0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
54c0: 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   j<sp->nsubsym; 
54d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
54e0: 20 20 69 66 28 20 73 70 2d 3e 73 75 62 73 79 6d    if( sp->subsym
54f0: 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a  [j]->prec>=0 ){.
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70                rp
5510: 2d 3e 70 72 65 63 73 79 6d 20 3d 20 73 70 2d 3e  ->precsym = sp->
5520: 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20  subsym[j];.     
5530: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
5540: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5550: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5560: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e    }else if( sp->
5570: 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  prec>=0 ){.     
5580: 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d       rp->precsym
5590: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 09   = rp->rhs[i];..
55a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
55b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
55c0: 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e  ./* Find all non
55d0: 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20  terminals which 
55e0: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68  will generate th
55f0: 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a  e empty string..
5600: 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b 20  ** Then go back 
5610: 61 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65 20  and compute the 
5620: 66 69 72 73 74 20 73 65 74 73 20 6f 66 20 65 76  first sets of ev
5630: 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  ery nonterminal.
5640: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73 65  .** The first se
5650: 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20  t is the set of 
5660: 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d  all terminal sym
5670: 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 62  bols which can b
5680: 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67  egin.** a string
5690: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68   generated by th
56a0: 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a  at nonterminal..
56b0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73  */.void FindFirs
56c0: 74 53 65 74 73 28 6c 65 6d 70 29 0a 73 74 72 75  tSets(lemp).stru
56d0: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
56e0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
56f0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
5700: 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b  .  int progress;
5710: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
5720: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
5730: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
5740: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61  mbols[i]->lambda
5750: 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a   = LEMON_FALSE;.
5760: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70    }.  for(i=lemp
5770: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c  ->nterminal; i<l
5780: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
5790: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
57a0: 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73  mbols[i]->firsts
57b0: 65 74 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20  et = SetNew();. 
57c0: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63   }..  /* First c
57d0: 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64  ompute all lambd
57e0: 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  as */.  do{.    
57f0: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
5800: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
5810: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
5820: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
5830: 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61   rp->lhs->lambda
5840: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5850: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
5860: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
5870: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
5880: 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
5890: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
58a0: 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 54 45  if( sp->type!=TE
58b0: 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 6c 61  RMINAL || sp->la
58c0: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
58d0: 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E ) break;.     
58e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d   }.      if( i==
58f0: 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20  rp->nrhs ){.    
5900: 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d      rp->lhs->lam
5910: 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45  bda = LEMON_TRUE
5920: 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 67 72 65  ;.        progre
5930: 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ss = 1;.      }.
5940: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
5950: 70 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20 2f  progress );..  /
5960: 2a 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61 6c  * Now compute al
5970: 6c 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a  l first sets */.
5980: 20 20 64 6f 7b 0a 20 20 20 20 73 74 72 75 63 74    do{.    struct
5990: 20 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73 32   symbol *s1, *s2
59a0: 3b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d  ;.    progress =
59b0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c   0;.    for(rp=l
59c0: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
59d0: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
59e0: 20 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73 3b     s1 = rp->lhs;
59f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
5a00: 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
5a10: 7b 0a 20 20 20 20 20 20 20 20 73 32 20 3d 20 72  {.        s2 = r
5a20: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
5a30: 20 20 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d     if( s2->type=
5a40: 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
5a50: 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20         progress 
5a60: 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69  += SetAdd(s1->fi
5a70: 72 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65 78  rstset,s2->index
5a80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
5a90: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
5aa0: 65 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d  e if( s2->type==
5ab0: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
5ac0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
5ad0: 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73 79  =0; j<s2->nsubsy
5ae0: 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
5af0: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d       progress +=
5b00: 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73   SetAdd(s1->firs
5b10: 74 73 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d 5b  tset,s2->subsym[
5b20: 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  j]->index);.    
5b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5b40: 20 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 20    break;..}else 
5b50: 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20  if( s1==s2 ){.  
5b60: 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e          if( s1->
5b70: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
5b80: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65  LSE ) break;..}e
5b90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
5ba0: 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 55 6e  rogress += SetUn
5bb0: 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73 65 74  ion(s1->firstset
5bc0: 2c 73 32 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a  ,s2->firstset);.
5bd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 32            if( s2
5be0: 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f  ->lambda==LEMON_
5bf0: 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09  FALSE ) break;..
5c00: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
5c10: 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65    }while( progre
5c20: 73 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ss );.  return;.
5c30: 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c  }../* Compute al
5c40: 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 20 66  l LR(0) states f
5c50: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20  or the grammar. 
5c60: 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61 64   Links.** are ad
5c70: 64 65 64 20 74 6f 20 62 65 74 77 65 65 6e 20 73  ded to between s
5c80: 6f 6d 65 20 73 74 61 74 65 73 20 73 6f 20 74 68  ome states so th
5c90: 61 74 20 74 68 65 20 4c 52 28 31 29 20 66 6f 6c  at the LR(1) fol
5ca0: 6c 6f 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e 20  low sets.** can 
5cb0: 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65  be computed late
5cc0: 72 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73 74  r..*/.PRIVATE st
5cd0: 72 75 63 74 20 73 74 61 74 65 20 2a 67 65 74 73  ruct state *gets
5ce0: 74 61 74 65 28 2f 2a 20 73 74 72 75 63 74 20 6c  tate(/* struct l
5cf0: 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 20 20 2f 2a 20  emon * */);  /* 
5d00: 66 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  forward referenc
5d10: 65 20 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 53 74  e */.void FindSt
5d20: 61 74 65 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  ates(lemp).struc
5d30: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
5d40: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
5d50: 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72   *sp;.  struct r
5d60: 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66  ule *rp;..  Conf
5d70: 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a 0a  iglist_init();..
5d80: 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 74    /* Find the st
5d90: 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  art symbol */.  
5da0: 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20  if( lemp->start 
5db0: 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62  ){.    sp = Symb
5dc0: 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74  ol_find(lemp->st
5dd0: 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70  art);.    if( sp
5de0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72  ==0 ){.      Err
5df0: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
5e00: 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70 65  name,0,."The spe
5e10: 63 69 66 69 65 64 20 73 74 61 72 74 20 73 79 6d  cified start sym
5e20: 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f  bol \"%s\" is no
5e30: 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72 6d  t \.in a nonterm
5e40: 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72 61 6d  inal of the gram
5e50: 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77 69 6c  mar.  \"%s\" wil
5e60: 6c 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  l be used as the
5e70: 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c 20   start \.symbol 
5e80: 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e  instead.",lemp->
5e90: 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65  start,lemp->rule
5ea0: 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
5eb0: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
5ec0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d  nt++;.      sp =
5ed0: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
5ee0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
5ef0: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
5f00: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a  rule->lhs;.  }..
5f10: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
5f20: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
5f30: 64 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e  doesn't occur on
5f40: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
5f50: 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79  side of.  ** any
5f60: 20 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20 61   rule.  Report a
5f70: 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 64 6f  n error if it do
5f80: 65 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c 64  es.  (YACC would
5f90: 20 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77 0a   generate a new.
5fa0: 20 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62 6f    ** start symbo
5fb0: 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 29  l in this case.)
5fc0: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
5fd0: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
5fe0: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
5ff0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
6000: 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
6010: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  ++){.      if( r
6020: 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b  p->rhs[i]==sp ){
6030: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 44     /* FIX ME:  D
6040: 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 74 65  eal with multite
6050: 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20 20  rminals */.     
6060: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
6070: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54  ->filename,0,."T
6080: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
6090: 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e  \"%s\" occurs on
60a0: 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e   the \.right-han
60b0: 64 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65  d side of a rule
60c0: 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75  . This will resu
60d0: 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72 20 77  lt in a parser w
60e0: 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20  hich \.does not 
60f0: 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c  work properly.",
6100: 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
6110: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
6120: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
6130: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
6140: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
6150: 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65  tion set for the
6160: 20 66 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a   first state.  *
6170: 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77  * is all rules w
6180: 68 69 63 68 20 68 61 76 65 20 74 68 65 20 73 74  hich have the st
6190: 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68  art symbol as th
61a0: 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61  eir.  ** left-ha
61b0: 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72  nd side */.  for
61c0: 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70  (rp=sp->rule; rp
61d0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73  ; rp=rp->nextlhs
61e0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f  ){.    struct co
61f0: 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20  nfig *newcfp;.  
6200: 20 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 3d    rp->lhsStart =
6210: 20 31 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d   1;.    newcfp =
6220: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62   Configlist_addb
6230: 61 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20  asis(rp,0);.    
6240: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
6250: 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ws,0);.  }..  /*
6260: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72   Compute the fir
6270: 73 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f  st state.  All o
6280: 74 68 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c  ther states will
6290: 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65   be.  ** compute
62a0: 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
62b0: 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75  during the compu
62c0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  tation of the fi
62d0: 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68  rst one..  ** Th
62e0: 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
62f0: 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  er to the first 
6300: 73 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65  state is not use
6310: 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  d. */.  (void)ge
6320: 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20  tstate(lemp);.  
6330: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
6340: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
6350: 6f 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  o a state which 
6360: 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20  is described by 
6370: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
6380: 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20  n.** list which 
6390: 68 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66  has been built f
63a0: 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e  rom calls to Con
63b0: 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a  figlist_add..*/.
63c0: 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69  PRIVATE void bui
63d0: 6c 64 73 68 69 66 74 73 28 2f 2a 20 73 74 72 75  ldshifts(/* stru
63e0: 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75  ct lemon *, stru
63f0: 63 74 20 73 74 61 74 65 20 2a 20 2a 2f 29 3b 20  ct state * */); 
6400: 2f 2a 20 46 6f 72 77 64 20 72 65 66 20 2a 2f 0a  /* Forwd ref */.
6410: 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73  PRIVATE struct s
6420: 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 6c  tate *getstate(l
6430: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
6440: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72  n *lemp;.{.  str
6450: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c  uct config *cfp,
6460: 20 2a 62 70 3b 0a 20 20 73 74 72 75 63 74 20 73   *bp;.  struct s
6470: 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a  tate *stp;..  /*
6480: 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6f 72   Extract the sor
6490: 74 65 64 20 62 61 73 69 73 20 6f 66 20 74 68 65  ted basis of the
64a0: 20 6e 65 77 20 73 74 61 74 65 2e 20 20 54 68 65   new state.  The
64b0: 20 62 61 73 69 73 20 77 61 73 20 63 6f 6e 73 74   basis was const
64c0: 72 75 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 70  ructed.  ** by p
64d0: 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 22 43  rior calls to "C
64e0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
64f0: 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66  is()". */.  Conf
6500: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
6510: 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f 6e 66 69  ();.  bp = Confi
6520: 67 6c 69 73 74 5f 62 61 73 69 73 28 29 3b 0a 0a  glist_basis();..
6530: 20 20 2f 2a 20 47 65 74 20 61 20 73 74 61 74 65    /* Get a state
6540: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 62   with the same b
6550: 61 73 69 73 20 2a 2f 0a 20 20 73 74 70 20 3d 20  asis */.  stp = 
6560: 53 74 61 74 65 5f 66 69 6e 64 28 62 70 29 3b 0a  State_find(bp);.
6570: 20 20 69 66 28 20 73 74 70 20 29 7b 0a 20 20 20    if( stp ){.   
6580: 20 2f 2a 20 41 20 73 74 61 74 65 20 77 69 74 68   /* A state with
6590: 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73 20   the same basis 
65a0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 21 20  already exists! 
65b0: 20 43 6f 70 79 20 61 6c 6c 20 74 68 65 20 66 6f   Copy all the fo
65c0: 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20 2a 2a 20  llow-set.    ** 
65d0: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
65e0: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65  s from the state
65f0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
6600: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20 20  ion into the.   
6610: 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20   ** preexisting 
6620: 73 74 61 74 65 2c 20 74 68 65 6e 20 72 65 74 75  state, then retu
6630: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
6640: 74 68 65 20 70 72 65 65 78 69 73 74 69 6e 67 20  the preexisting 
6650: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 72  state */.    str
6660: 75 63 74 20 63 6f 6e 66 69 67 20 2a 78 2c 20 2a  uct config *x, *
6670: 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d 62 70 2c  y;.    for(x=bp,
6680: 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78 20 26 26   y=stp->bp; x &&
6690: 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20 79 3d 79   y; x=x->bp, y=y
66a0: 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20 50 6c 69  ->bp){.      Pli
66b0: 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62 70 6c 70  nk_copy(&y->bplp
66c0: 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20 20 20 20  ,x->bplp);.     
66d0: 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 78 2d   Plink_delete(x-
66e0: 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20 20 78 2d  >fplp);.      x-
66f0: 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70 6c 70 20  >fplp = x->bplp 
6700: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  = 0;.    }.    c
6710: 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fp = Configlist_
6720: 72 65 74 75 72 6e 28 29 3b 0a 20 20 20 20 43 6f  return();.    Co
6730: 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 63 66 70  nfiglist_eat(cfp
6740: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6750: 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c 79 20 69  /* This really i
6760: 73 20 61 20 6e 65 77 20 73 74 61 74 65 2e 20 20  s a new state.  
6770: 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 74 68  Construct all th
6780: 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a 20 20 20  e details */.   
6790: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73   Configlist_clos
67a0: 75 72 65 28 6c 65 6d 70 29 3b 20 20 20 20 2f 2a  ure(lemp);    /*
67b0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   Compute the con
67c0: 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75  figuration closu
67d0: 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  re */.    Config
67e0: 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20 20 20 20  list_sort();    
67f0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 74         /* Sort t
6800: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
6810: 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20   closure */.    
6820: 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfp = Configlist
6830: 5f 72 65 74 75 72 6e 28 29 3b 20 20 20 2f 2a 20  _return();   /* 
6840: 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  Get a pointer to
6850: 20 74 68 65 20 63 6f 6e 66 69 67 20 6c 69 73 74   the config list
6860: 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 53 74   */.    stp = St
6870: 61 74 65 5f 6e 65 77 28 29 3b 20 20 20 20 20 20  ate_new();      
6880: 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 74       /* A new st
6890: 61 74 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ate structure */
68a0: 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b  .    MemoryCheck
68b0: 28 73 74 70 29 3b 0a 20 20 20 20 73 74 70 2d 3e  (stp);.    stp->
68c0: 62 70 20 3d 20 62 70 3b 20 20 20 20 20 20 20 20  bp = bp;        
68d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d          /* Remem
68e0: 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ber the configur
68f0: 61 74 69 6f 6e 20 62 61 73 69 73 20 2a 2f 0a 20  ation basis */. 
6900: 20 20 20 73 74 70 2d 3e 63 66 70 20 3d 20 63 66     stp->cfp = cf
6910: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
6920: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
6930: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c  configuration cl
6940: 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 73 74 70  osure */.    stp
6950: 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20 6c 65 6d  ->statenum = lem
6960: 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a 20  p->nstate++; /* 
6970: 45 76 65 72 79 20 73 74 61 74 65 20 67 65 74 73  Every state gets
6980: 20 61 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62   a sequence numb
6990: 65 72 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61  er */.    stp->a
69a0: 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
69b0: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 63 74         /* No act
69c0: 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a 20 20  ions, yet. */.  
69d0: 20 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73    State_insert(s
69e0: 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20 20 20 2f  tp,stp->bp);   /
69f0: 2a 20 41 64 64 20 74 6f 20 74 68 65 20 73 74 61  * Add to the sta
6a00: 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  te table */.    
6a10: 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65 6d 70  buildshifts(lemp
6a20: 2c 73 74 70 29 3b 20 20 20 20 20 20 20 2f 2a 20  ,stp);       /* 
6a30: 52 65 63 75 72 73 69 76 65 6c 79 20 63 6f 6d 70  Recursively comp
6a40: 75 74 65 20 73 75 63 63 65 73 73 6f 72 20 73 74  ute successor st
6a50: 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  ates */.  }.  re
6a60: 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a  turn stp;.}../*.
6a70: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
6a80: 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 61 72  f two symbols ar
6a90: 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 69  e the same..*/.i
6aa0: 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 61  nt same_symbol(a
6ab0: 2c 62 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  ,b).struct symbo
6ac0: 6c 20 2a 61 3b 0a 73 74 72 75 63 74 20 73 79 6d  l *a;.struct sym
6ad0: 62 6f 6c 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20  bol *b;.{.  int 
6ae0: 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20  i;.  if( a==b ) 
6af0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
6b00: 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45  a->type!=MULTITE
6b10: 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20  RMINAL ) return 
6b20: 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65  0;.  if( b->type
6b30: 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  !=MULTITERMINAL 
6b40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
6b50: 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d  ( a->nsubsym!=b-
6b60: 3e 6e 73 75 62 73 79 6d 20 29 20 72 65 74 75 72  >nsubsym ) retur
6b70: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
6b80: 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b  i<a->nsubsym; i+
6b90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73  +){.    if( a->s
6ba0: 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62  ubsym[i]!=b->sub
6bb0: 73 79 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  sym[i] ) return 
6bc0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
6bd0: 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75  1;.}../* Constru
6be0: 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72  ct all successor
6bf0: 20 73 74 61 74 65 73 20 74 6f 20 74 68 65 20 67   states to the g
6c00: 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22  iven state.  A "
6c10: 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74  successor".** st
6c20: 61 74 65 20 69 73 20 61 6e 79 20 73 74 61 74 65  ate is any state
6c30: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 72 65   which can be re
6c40: 61 63 68 65 64 20 62 79 20 61 20 73 68 69 66 74  ached by a shift
6c50: 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56   action..*/.PRIV
6c60: 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68  ATE void buildsh
6c70: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 0a 73  ifts(lemp,stp).s
6c80: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
6c90: 70 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  p;.struct state 
6ca0: 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  *stp;     /* The
6cb0: 20 73 74 61 74 65 20 66 72 6f 6d 20 77 68 69 63   state from whic
6cc0: 68 20 73 75 63 63 65 73 73 6f 72 73 20 61 72 65  h successors are
6cd0: 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 7b 0a 20   computed */.{. 
6ce0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
6cf0: 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  cfp;  /* For loo
6d00: 70 69 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f  ping thru the co
6d10: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
6d20: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
6d30: 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20  t config *bcfp; 
6d40: 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72  /* For the inner
6d50: 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20   loop on config 
6d60: 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22  closure of "stp"
6d70: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
6d80: 66 69 67 20 2a 6e 65 77 3b 20 20 2f 2a 20 2a 2f  fig *new;  /* */
6d90: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
6da0: 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f   *sp;   /* Symbo
6db0: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
6dc0: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
6dd0: 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20  tion "cfp" */.  
6de0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62  struct symbol *b
6df0: 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66  sp;  /* Symbol f
6e00: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74  ollowing the dot
6e10: 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   in configuratio
6e20: 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74  n "bcfp" */.  st
6e30: 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73  ruct state *news
6e40: 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  tp; /* A pointer
6e50: 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20   to a successor 
6e60: 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45  state */..  /* E
6e70: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
6e80: 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65  n becomes comple
6e90: 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74  te after it cont
6ea0: 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63 63  ibutes to a succ
6eb0: 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  essor.  ** state
6ec0: 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c  .  Initially, al
6ed0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  l configurations
6ee0: 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20   are incomplete 
6ef0: 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70  */.  for(cfp=stp
6f00: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
6f10: 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e  cfp->next) cfp->
6f20: 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c  status = INCOMPL
6f30: 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  ETE;..  /* Loop 
6f40: 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66  through all conf
6f50: 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  igurations of th
6f60: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f  e state "stp" */
6f70: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
6f80: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
6f90: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
6fa0: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
6fb0: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
6fc0: 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64  ue;    /* Alread
6fd0: 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20  y used by inner 
6fe0: 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  loop */.    if( 
6ff0: 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72  cfp->dot>=cfp->r
7000: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
7010: 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68  ue;  /* Can't sh
7020: 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ift this config 
7030: 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  */.    Configlis
7040: 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20 20  t_reset();      
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65 77  /* Reset the new
7070: 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20   config set */. 
7080: 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d     sp = cfp->rp-
7090: 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20  >rhs[cfp->dot]; 
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
70b0: 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20  ymbol after the 
70c0: 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  dot */..    /* F
70d0: 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75  or every configu
70e0: 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74  ration in the st
70f0: 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20  ate "stp" which 
7100: 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22  has the symbol "
7110: 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  sp".    ** follo
7120: 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64  wing its dot, ad
7130: 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69  d the same confi
7140: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
7150: 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a  basis set under.
7160: 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
7170: 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68 65  ion but with the
7180: 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65   dot shifted one
7190: 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72   symbol to the r
71a0: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ight. */.    for
71b0: 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b  (bcfp=cfp; bcfp;
71c0: 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74   bcfp=bcfp->next
71d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63 66  ){.      if( bcf
71e0: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
71f0: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ETE ) continue; 
7200: 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73     /* Already us
7210: 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
7220: 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d  bcfp->dot>=bcfp-
7230: 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  >rp->nrhs ) cont
7240: 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73  inue; /* Can't s
7250: 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f  hift this one */
7260: 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63 66  .      bsp = bcf
7270: 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d  p->rp->rhs[bcfp-
7280: 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20  >dot];          
7290: 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61   /* Get symbol a
72a0: 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20  fter dot */.    
72b0: 20 20 69 66 28 20 21 73 61 6d 65 5f 73 79 6d 62    if( !same_symb
72c0: 6f 6c 28 62 73 70 2c 73 70 29 20 29 20 63 6f 6e  ol(bsp,sp) ) con
72d0: 74 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20 4d  tinue;      /* M
72e0: 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20 66  ust be same as f
72f0: 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20  or "cfp" */.    
7300: 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d    bcfp->status =
7310: 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20   COMPLETE;      
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
7330: 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ark this config 
7340: 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  as used */.     
7350: 20 6e 65 77 20 3d 20 43 6f 6e 66 69 67 6c 69 73   new = Configlis
7360: 74 5f 61 64 64 62 61 73 69 73 28 62 63 66 70 2d  t_addbasis(bcfp-
7370: 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29  >rp,bcfp->dot+1)
7380: 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64  ;.      Plink_ad
7390: 64 28 26 6e 65 77 2d 3e 62 70 6c 70 2c 62 63 66  d(&new->bplp,bcf
73a0: 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  p);.    }..    /
73b0: 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20  * Get a pointer 
73c0: 74 6f 20 74 68 65 20 73 74 61 74 65 20 64 65 73  to the state des
73d0: 63 72 69 62 65 64 20 62 79 20 74 68 65 20 62 61  cribed by the ba
73e0: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
73f0: 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e  n set.    ** con
7400: 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 65 20  structed in the 
7410: 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a  preceding loop *
7420: 2f 0a 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67  /.    newstp = g
7430: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a  etstate(lemp);..
7440: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
7450: 20 22 6e 65 77 73 74 70 22 20 69 73 20 72 65 61   "newstp" is rea
7460: 63 68 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ched from the st
7470: 61 74 65 20 22 73 74 70 22 20 62 79 20 61 20 73  ate "stp" by a s
7480: 68 69 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20  hift action.    
7490: 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c  ** on the symbol
74a0: 20 22 73 70 22 20 2a 2f 0a 20 20 20 20 69 66 28   "sp" */.    if(
74b0: 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
74c0: 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
74d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
74e0: 6f 72 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73  or(i=0; i<sp->ns
74f0: 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubsym; i++){.   
7500: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
7510: 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73  &stp->ap,SHIFT,s
7520: 70 2d 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63 68  p->subsym[i],(ch
7530: 61 72 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20  ar*)newstp);.   
7540: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
7550: 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64        Action_add
7560: 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c  (&stp->ap,SHIFT,
7570: 73 70 2c 28 63 68 61 72 20 2a 29 6e 65 77 73 74  sp,(char *)newst
7580: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  p);.    }.  }.}.
7590: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
75a0: 20 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e   the propagation
75b0: 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46   links.*/.void F
75c0: 69 6e 64 4c 69 6e 6b 73 28 6c 65 6d 70 29 0a 73  indLinks(lemp).s
75d0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
75e0: 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p;.{.  int i;.  
75f0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
7600: 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74  fp, *other;.  st
7610: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
7620: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
7630: 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73  *plp;..  /* Hous
7640: 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a  ekeeping detail:
7650: 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65  .  ** Add to eve
7660: 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e  ry propagate lin
7670: 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b  k a pointer back
7680: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f   to the state to
7690: 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20  .  ** which the 
76a0: 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64  link is attached
76b0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
76c0: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
76d0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
76e0: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
76f0: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
7700: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
7710: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
7720: 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70    cfp->stp = stp
7730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7740: 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61  * Convert all ba
7750: 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72  cklinks into for
7760: 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c  ward links.  Onl
7770: 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20  y the forward.  
7780: 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65  ** links are use
7790: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d  d in the follow-
77a0: 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e  set computation.
77b0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
77c0: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
77d0: 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
77e0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
77f0: 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d      for(cfp=stp-
7800: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
7810: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
7820: 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70   for(plp=cfp->bp
7830: 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70  lp; plp; plp=plp
7840: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
7850: 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66   other = plp->cf
7860: 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b  p;.        Plink
7870: 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c  _add(&other->fpl
7880: 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a  p,cfp);.      }.
7890: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20      }.  }.}../* 
78a0: 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c  Compute all foll
78b0: 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20  owsets..**.** A 
78c0: 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65  followset is the
78d0: 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62   set of all symb
78e0: 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f  ols which can co
78f0: 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  me immediately.*
7900: 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67  * after a config
7910: 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  uration..*/.void
7920: 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28   FindFollowSets(
7930: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
7940: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
7950: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  t i;.  struct co
7960: 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
7970: 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
7980: 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a    int progress;.
7990: 20 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20    int change;.. 
79a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
79b0: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
79c0: 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70      for(cfp=lemp
79d0: 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70  ->sorted[i]->cfp
79e0: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
79f0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70  next){.      cfp
7a00: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
7a10: 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  PLETE;.    }.  }
7a20: 0a 20 20 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72  .  .  do{.    pr
7a30: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
7a40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7a50: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
7a60: 20 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d       for(cfp=lem
7a70: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66  p->sorted[i]->cf
7a80: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
7a90: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
7aa0: 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d  if( cfp->status=
7ab0: 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74  =COMPLETE ) cont
7ac0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  inue;.        fo
7ad0: 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b  r(plp=cfp->fplp;
7ae0: 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e   plp; plp=plp->n
7af0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
7b00: 63 68 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f  change = SetUnio
7b10: 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c  n(plp->cfp->fws,
7b20: 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20  cfp->fws);.     
7b30: 20 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 20       if( change 
7b40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
7b50: 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20  lp->cfp->status 
7b60: 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20  = INCOMPLETE;.  
7b70: 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65            progre
7b80: 73 73 20 3d 20 31 3b 0a 09 20 20 7d 0a 09 7d 0a  ss = 1;..  }..}.
7b90: 20 20 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61          cfp->sta
7ba0: 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a  tus = COMPLETE;.
7bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7bc0: 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73  }while( progress
7bd0: 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e   );.}..static in
7be0: 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69  t resolve_confli
7bf0: 63 74 28 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74  ct();../* Comput
7c00: 65 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  e the reduce act
7c10: 69 6f 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76  ions, and resolv
7c20: 65 20 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a  e conflicts..*/.
7c30: 76 6f 69 64 20 46 69 6e 64 41 63 74 69 6f 6e 73  void FindActions
7c40: 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
7c50: 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
7c60: 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63 74  nt i,j;.  struct
7c70: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20   config *cfp;.  
7c80: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
7c90: 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  p;.  struct symb
7ca0: 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74  ol *sp;.  struct
7cb0: 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f 2a   rule *rp;..  /*
7cc0: 20 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65 20   Add all of the 
7cd0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 0a  reduce actions .
7ce0: 20 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61 63    ** A reduce ac
7cf0: 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66 6f  tion is added fo
7d00: 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f  r each element o
7d10: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20  f the followset 
7d20: 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67  of.  ** a config
7d30: 75 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68 61  uration which ha
7d40: 73 20 69 74 73 20 64 6f 74 20 61 74 20 74 68 65  s its dot at the
7d50: 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e 0a   extreme right..
7d60: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
7d70: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
7d80: 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20  i++){   /* Loop 
7d90: 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20  over all states 
7da0: 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  */.    stp = lem
7db0: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
7dc0: 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63    for(cfp=stp->c
7dd0: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
7de0: 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f  ->next){  /* Loo
7df0: 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69  p over all confi
7e00: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  gurations */.   
7e10: 20 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e     if( cfp->rp->
7e20: 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29  nrhs==cfp->dot )
7e30: 7b 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 64  {        /* Is d
7e40: 6f 74 20 61 74 20 65 78 74 72 65 6d 65 20 72 69  ot at extreme ri
7e50: 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  ght? */.        
7e60: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d  for(j=0; j<lemp-
7e70: 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29  >nterminal; j++)
7e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
7e90: 53 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77 73  SetFind(cfp->fws
7ea0: 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ,j) ){.         
7eb0: 20 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64 75     /* Add a redu
7ec0: 63 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  ce action to the
7ed0: 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69   state "stp" whi
7ee0: 63 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20 62  ch will reduce b
7ef0: 79 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  y the.          
7f00: 20 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e    ** rule "cfp->
7f10: 72 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61  rp" if the looka
7f20: 68 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20 22  head symbol is "
7f30: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
7f40: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  " */.           
7f50: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70   Action_add(&stp
7f60: 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70  ->ap,REDUCE,lemp
7f70: 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68  ->symbols[j],(ch
7f80: 61 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20  ar *)cfp->rp);. 
7f90: 20 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20           }..}.  
7fa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7fb0: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61 63  .  /* Add the ac
7fc0: 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f  cepting token */
7fd0: 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61  .  if( lemp->sta
7fe0: 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53  rt ){.    sp = S
7ff0: 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d  ymbol_find(lemp-
8000: 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28  >start);.    if(
8010: 20 73 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65   sp==0 ) sp = le
8020: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
8030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d   }else{.    sp =
8040: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
8050: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74  ;.  }.  /* Add t
8060: 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  o the first stat
8070: 65 20 28 77 68 69 63 68 20 69 73 20 61 6c 77 61  e (which is alwa
8080: 79 73 20 74 68 65 20 73 74 61 72 74 69 6e 67 20  ys the starting 
8090: 73 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20 2a  state of the.  *
80a0: 2a 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  * finite state m
80b0: 61 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69 6f  achine) an actio
80c0: 6e 20 74 6f 20 41 43 43 45 50 54 20 69 66 20 74  n to ACCEPT if t
80d0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20  he lookahead is 
80e0: 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e  the.  ** start n
80f0: 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a  onterminal.  */.
8100: 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65    Action_add(&le
8110: 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61  mp->sorted[0]->a
8120: 70 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a  p,ACCEPT,sp,0);.
8130: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f  .  /* Resolve co
8140: 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72  nflicts */.  for
8150: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
8160: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
8170: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
8180: 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74 72  p, *nap;.    str
8190: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
81a0: 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
81b0: 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 2f  sorted[i];.    /
81c0: 2a 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61  * assert( stp->a
81d0: 70 20 29 3b 20 2a 2f 0a 20 20 20 20 73 74 70 2d  p ); */.    stp-
81e0: 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72  >ap = Action_sor
81f0: 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20  t(stp->ap);.    
8200: 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
8210: 61 70 20 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20  ap && ap->next; 
8220: 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
8230: 20 20 20 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e      for(nap=ap->
8240: 6e 65 78 74 3b 20 6e 61 70 20 26 26 20 6e 61 70  next; nap && nap
8250: 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61  ->sp==ap->sp; na
8260: 70 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=nap->next){.  
8270: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77         /* The tw
8280: 6f 20 61 63 74 69 6f 6e 73 20 22 61 70 22 20 61  o actions "ap" a
8290: 6e 64 20 22 6e 61 70 22 20 68 61 76 65 20 74 68  nd "nap" have th
82a0: 65 20 73 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64  e same lookahead
82b0: 2e 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 46 69  ..         ** Fi
82c0: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
82d0: 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ne should be use
82e0: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 6c 65  d */.         le
82f0: 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d  mp->nconflict +=
8300: 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63   resolve_conflic
8310: 74 28 61 70 2c 6e 61 70 2c 6c 65 6d 70 2d 3e 65  t(ap,nap,lemp->e
8320: 72 72 73 79 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  rrsym);.      }.
8330: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8340: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
8350: 66 6f 72 20 65 61 63 68 20 72 75 6c 65 20 74 68  for each rule th
8360: 61 74 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20  at can never be 
8370: 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f  reduced. */.  fo
8380: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
8390: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
83a0: 29 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20  ) rp->canReduce 
83b0: 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20  = LEMON_FALSE;. 
83c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
83d0: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
83e0: 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f      struct actio
83f0: 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28 61  n *ap;.    for(a
8400: 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  p=lemp->sorted[i
8410: 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  ]->ap; ap; ap=ap
8420: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
8430: 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
8440: 55 43 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e  UCE ) ap->x.rp->
8450: 63 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f  canReduce = LEMO
8460: 4e 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  N_TRUE;.    }.  
8470: 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  }.  for(rp=lemp-
8480: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
8490: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
84a0: 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 29   rp->canReduce )
84b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45   continue;.    E
84c0: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
84d0: 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
84e0: 69 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20 63  ine,"This rule c
84f0: 61 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63 65  an not be reduce
8500: 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70  d.\n");.    lemp
8510: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
8520: 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20  }.}../* Resolve 
8530: 61 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77 65  a conflict betwe
8540: 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e  en the two given
8550: 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68   actions.  If th
8560: 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61  e.** conflict ca
8570: 6e 27 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2c  n't be resolved,
8580: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
8590: 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45  ..**.** NO LONGE
85a0: 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20  R TRUE:.**   To 
85b0: 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69  resolve a confli
85c0: 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74  ct, first look t
85d0: 6f 20 73 65 65 20 69 66 20 65 69 74 68 65 72 20  o see if either 
85e0: 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f  action.**   is o
85f0: 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e  n an error rule.
8600: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20    In that case, 
8610: 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20  take the action 
8620: 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f  which.**   is no
8630: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
8640: 68 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65  h the error rule
8650: 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72  .  If neither or
8660: 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f   both.**   actio
8670: 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61 74 65  ns are associate
8680: 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
8690: 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74  rule, then try t
86a0: 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65  o.**   use prece
86b0: 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65  dence to resolve
86c0: 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a   the conflict..*
86d0: 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61  *.** If either a
86e0: 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54  ction is a SHIFT
86f0: 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62  , then it must b
8700: 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20  e apx.  This.** 
8710: 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77  function won't w
8720: 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65  ork if apx->type
8730: 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70 79  ==REDUCE and apy
8740: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a  ->type==SHIFT..*
8750: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
8760: 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70  olve_conflict(ap
8770: 78 2c 61 70 79 2c 65 72 72 73 79 6d 29 0a 73 74  x,apy,errsym).st
8780: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 78  ruct action *apx
8790: 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ;.struct action 
87a0: 2a 61 70 79 3b 0a 73 74 72 75 63 74 20 73 79 6d  *apy;.struct sym
87b0: 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f  bol *errsym;   /
87c0: 2a 20 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62  * The error symb
87d0: 6f 6c 20 28 69 66 20 64 65 66 69 6e 65 64 2e 20  ol (if defined. 
87e0: 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 29   NULL otherwise)
87f0: 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 73   */.{.  struct s
8800: 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79  ymbol *spx, *spy
8810: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
8820: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70   0;.  assert( ap
8830: 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29  x->sp==apy->sp )
8840: 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  ;  /* Otherwise 
8850: 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e  there would be n
8860: 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  o conflict */.  
8870: 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53  if( apx->type==S
8880: 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70  HIFT && apy->typ
8890: 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20  e==SHIFT ){.    
88a0: 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 53 43 4f  apy->type = SSCO
88b0: 4e 46 4c 49 43 54 3b 0a 20 20 20 20 65 72 72 63  NFLICT;.    errc
88c0: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nt++;.  }.  if( 
88d0: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apx->type==SHIFT
88e0: 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52   && apy->type==R
88f0: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78  EDUCE ){.    spx
8900: 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20   = apx->sp;.    
8910: 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d  spy = apy->x.rp-
8920: 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66  >precsym;.    if
8930: 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d  ( spy==0 || spx-
8940: 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e  >prec<0 || spy->
8950: 70 72 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  prec<0 ){.      
8960: 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72  /* Not enough pr
8970: 65 63 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61  ecedence informa
8980: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  tion. */.      a
8990: 70 79 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e  py->type = SRCON
89a0: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
89b0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
89c0: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
89d0: 70 79 2d 3e 70 72 65 63 20 29 7b 20 20 20 20 2f  py->prec ){    /
89e0: 2a 20 4c 6f 77 65 72 20 70 72 65 63 65 64 65 6e  * Lower preceden
89f0: 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20 20  ce wins */.     
8a00: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
8a10: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
8a20: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
8a30: 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c<spy->prec ){. 
8a40: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
8a50: 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   SH_RESOLVED;.  
8a60: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
8a70: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
8a80: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
8a90: 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65 20  RIGHT ){ /* Use 
8aa0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
8ab0: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
8ac0: 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20 20  _RESOLVED;      
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ae0: 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63 69         /* associ
8af0: 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20 7d  ativity */.    }
8b00: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
8b10: 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26  ec==spy->prec &&
8b20: 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46   spx->assoc==LEF
8b30: 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65 61  T ){  /* to brea
8b40: 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20 61  k tie */.      a
8b50: 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45  px->type = SH_RE
8b60: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SOLVED;.    }els
8b70: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
8b80: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
8b90: 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73  >prec && spx->as
8ba0: 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20  soc==NONE );.   
8bb0: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53     apy->type = S
8bc0: 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20  RCONFLICT;.     
8bd0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
8be0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78  .  }else if( apx
8bf0: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
8c00: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44  & apy->type==RED
8c10: 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d  UCE ){.    spx =
8c20: 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apx->x.rp->prec
8c30: 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61  sym;.    spy = a
8c40: 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  py->x.rp->precsy
8c50: 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d  m;.    if( spx==
8c60: 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73  0 || spy==0 || s
8c70: 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20  px->prec<0 ||.  
8c80: 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c    spy->prec<0 ||
8c90: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
8ca0: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
8cb0: 70 79 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f 4e  py->type = RRCON
8cc0: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
8cd0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
8ce0: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
8cf0: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
8d00: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
8d10: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
8d20: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
8d30: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
8d40: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
8d50: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
8d60: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
8d70: 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
8d80: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52   apx->type==SH_R
8d90: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
8da0: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52   apx->type==RD_R
8db0: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
8dc0: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43 4f   apx->type==SSCO
8dd0: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
8de0: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e  apx->type==SRCON
8df0: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
8e00: 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46  px->type==RRCONF
8e10: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
8e20: 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f  y->type==SH_RESO
8e30: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
8e40: 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f  y->type==RD_RESO
8e50: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
8e60: 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c  y->type==SSCONFL
8e70: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
8e80: 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49  ->type==SRCONFLI
8e90: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  CT ||.      apy-
8ea0: 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43  >type==RRCONFLIC
8eb0: 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20  T.    );.    /* 
8ec0: 54 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54  The REDUCE/SHIFT
8ed0: 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70   case cannot hap
8ee0: 70 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46  pen because SHIF
8ef0: 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20  Ts come before. 
8f00: 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e     ** REDUCEs on
8f10: 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77   the list.  If w
8f20: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
8f30: 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65  nt it must be be
8f40: 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
8f50: 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74   parser conflict
8f60: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
8f70: 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20  n resolved. */. 
8f80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
8f90: 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  nt;.}./*********
8fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
8fb0: 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66  m the file "conf
8fc0: 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  iglist.c" ******
8fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8fe0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
8ff0: 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e  nes to processin
9000: 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  g a configuratio
9010: 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64  n list and build
9020: 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69  ing a state.** i
9030: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
9040: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
9050: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
9060: 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74  config *freelist
9070: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69   = 0;      /* Li
9080: 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69  st of free confi
9090: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  gurations */.sta
90a0: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
90b0: 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20  g *current = 0; 
90c0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
90d0: 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72  list of configur
90e0: 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
90f0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9100: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b  *currentend = 0;
9110: 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69     /* Last on li
9120: 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f  st of configs */
9130: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
9140: 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30  onfig *basis = 0
9150: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  ;         /* Top
9160: 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69   of list of basi
9170: 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61  s configs */.sta
9180: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
9190: 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30  g **basisend = 0
91a0: 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20  ;     /* End of 
91b0: 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f  list of basis co
91c0: 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74  nfigs */../* Ret
91d0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
91e0: 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61   a new configura
91f0: 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
9200: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
9210: 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74  ewconfig(){.  st
9220: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
9230: 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74  ;.  if( freelist
9240: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
9250: 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
9260: 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20  3;.    freelist 
9270: 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
9280: 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20   *)calloc( amt, 
9290: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 63 6f  sizeof(struct co
92a0: 6e 66 69 67 29 20 29 3b 0a 20 20 20 20 69 66 28  nfig) );.    if(
92b0: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
92c0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
92d0: 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20  derr,"Unable to 
92e0: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
92f0: 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66 69 67  for a new config
9300: 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20  uration.");.    
9310: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
9320: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9330: 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65  amt-1; i++) free
9340: 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26  list[i].next = &
9350: 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
9360: 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d     freelist[amt-
9370: 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  1].next = 0;.  }
9380: 0a 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73  .  new = freelis
9390: 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20  t;.  freelist = 
93a0: 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
93b0: 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a    return new;.}.
93c0: 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72  ./* The configur
93d0: 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e  ation "old" is n
93e0: 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f  o longer used */
93f0: 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 64 65  .PRIVATE void de
9400: 6c 65 74 65 63 6f 6e 66 69 67 28 6f 6c 64 29 0a  leteconfig(old).
9410: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f  struct config *o
9420: 6c 64 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78  ld;.{.  old->nex
9430: 74 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20  t = freelist;.  
9440: 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a  freelist = old;.
9450: 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  }../* Initialize
9460: 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  d the configurat
9470: 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72  ion list builder
9480: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
9490: 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75  ist_init(){.  cu
94a0: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72  rrent = 0;.  cur
94b0: 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65  rentend = &curre
94c0: 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b  nt;.  basis = 0;
94d0: 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62  .  basisend = &b
94e0: 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61  asis;.  Configta
94f0: 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65  ble_init();.  re
9500: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74  turn;.}../* Init
9510: 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66  ialized the conf
9520: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62  iguration list b
9530: 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43  uilder */.void C
9540: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
9550: 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30  ){.  current = 0
9560: 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d  ;.  currentend =
9570: 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73   &current;.  bas
9580: 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65  is = 0;.  basise
9590: 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43  nd = &basis;.  C
95a0: 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72  onfigtable_clear
95b0: 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  (0);.  return;.}
95c0: 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72  ../* Add another
95d0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
95e0: 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  o the configurat
95f0: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75  ion list */.stru
9600: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
9610: 67 6c 69 73 74 5f 61 64 64 28 72 70 2c 64 6f 74  glist_add(rp,dot
9620: 29 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72  ).struct rule *r
9630: 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c  p;    /* The rul
9640: 65 20 2a 2f 0a 69 6e 74 20 64 6f 74 3b 20 20 20  e */.int dot;   
9650: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9660: 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f  x into the RHS o
9670: 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72 65  f the rule where
9680: 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f   the dot goes */
9690: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
96a0: 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a  ig *cfp, model;.
96b0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65  .  assert( curre
96c0: 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f  ntend!=0 );.  mo
96d0: 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d  del.rp = rp;.  m
96e0: 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a  odel.dot = dot;.
96f0: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61    cfp = Configta
9700: 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29  ble_find(&model)
9710: 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29  ;.  if( cfp==0 )
9720: 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63  {.    cfp = newc
9730: 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70  onfig();.    cfp
9740: 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63  ->rp = rp;.    c
9750: 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  fp->dot = dot;. 
9760: 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65     cfp->fws = Se
9770: 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d  tNew();.    cfp-
9780: 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  >stp = 0;.    cf
9790: 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62  p->fplp = cfp->b
97a0: 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  plp = 0;.    cfp
97b0: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
97c0: 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20  cfp->bp = 0;.   
97d0: 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63   *currentend = c
97e0: 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65  fp;.    currente
97f0: 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b  nd = &cfp->next;
9800: 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65  .    Configtable
9810: 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20  _insert(cfp);.  
9820: 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a  }.  return cfp;.
9830: 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73 69  }../* Add a basi
9840: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
9850: 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  to the configura
9860: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72  tion list */.str
9870: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
9880: 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28  iglist_addbasis(
9890: 72 70 2c 64 6f 74 29 0a 73 74 72 75 63 74 20 72  rp,dot).struct r
98a0: 75 6c 65 20 2a 72 70 3b 0a 69 6e 74 20 64 6f 74  ule *rp;.int dot
98b0: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
98c0: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
98d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 62 61 73 69  ..  assert( basi
98e0: 73 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  send!=0 );.  ass
98f0: 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21  ert( currentend!
9900: 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70  =0 );.  model.rp
9910: 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64   = rp;.  model.d
9920: 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20  ot = dot;.  cfp 
9930: 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69  = Configtable_fi
9940: 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66  nd(&model);.  if
9950: 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ( cfp==0 ){.    
9960: 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28  cfp = newconfig(
9970: 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d  );.    cfp->rp =
9980: 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f   rp;.    cfp->do
9990: 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70  t = dot;.    cfp
99a0: 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29  ->fws = SetNew()
99b0: 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d  ;.    cfp->stp =
99c0: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c   0;.    cfp->fpl
99d0: 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20  p = cfp->bplp = 
99e0: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74  0;.    cfp->next
99f0: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62   = 0;.    cfp->b
9a00: 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72  p = 0;.    *curr
9a10: 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20  entend = cfp;.  
9a20: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26    currentend = &
9a30: 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a  cfp->next;.    *
9a40: 62 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a  basisend = cfp;.
9a50: 20 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26      basisend = &
9a60: 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e  cfp->bp;.    Con
9a70: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
9a80: 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  cfp);.  }.  retu
9a90: 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f  rn cfp;.}../* Co
9aa0: 6d 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75 72  mpute the closur
9ab0: 65 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  e of the configu
9ac0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
9ad0: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63  oid Configlist_c
9ae0: 6c 6f 73 75 72 65 28 6c 65 6d 70 29 0a 73 74 72  losure(lemp).str
9af0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
9b00: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
9b10: 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70  ig *cfp, *newcfp
9b20: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
9b30: 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73  *rp, *newrp;.  s
9b40: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
9b50: 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c  , *xsp;.  int i,
9b60: 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28   dot;..  assert(
9b70: 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29   currentend!=0 )
9b80: 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72  ;.  for(cfp=curr
9b90: 65 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  ent; cfp; cfp=cf
9ba0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70  p->next){.    rp
9bb0: 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20   = cfp->rp;.    
9bc0: 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a  dot = cfp->dot;.
9bd0: 20 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d      if( dot>=rp-
9be0: 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65  >nrhs ) continue
9bf0: 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72  ;.    sp = rp->r
9c00: 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28  hs[dot];.    if(
9c10: 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45   sp->type==NONTE
9c20: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
9c30: 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20  if( sp->rule==0 
9c40: 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72  && sp!=lemp->err
9c50: 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45  sym ){.        E
9c60: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
9c70: 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c  lename,rp->line,
9c80: 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25  "Nonterminal \"%
9c90: 73 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73  s\" has no rules
9ca0: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70  .",.          sp
9cb0: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
9cc0: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
9cd0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
9ce0: 20 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72   for(newrp=sp->r
9cf0: 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72  ule; newrp; newr
9d00: 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73  p=newrp->nextlhs
9d10: 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66  ){.        newcf
9d20: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61  p = Configlist_a
9d30: 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20  dd(newrp,0);.   
9d40: 20 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31       for(i=dot+1
9d50: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
9d60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73  +){.          xs
9d70: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
9d80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73            if( xs
9d90: 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
9da0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
9db0: 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e   SetAdd(newcfp->
9dc0: 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b  fws,xsp->index);
9dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
9de0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ak;.          }e
9df0: 6c 73 65 20 69 66 28 20 78 73 70 2d 3e 74 79 70  lse if( xsp->typ
9e00: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
9e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9e20: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20  int k;.         
9e30: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78 73     for(k=0; k<xs
9e40: 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29  p->nsubsym; k++)
9e50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9e60: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
9e70: 77 73 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d 5b  ws, xsp->subsym[
9e80: 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  k]->index);.    
9e90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ea0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 20 20        break;..  
9eb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9ec0: 20 20 20 53 65 74 55 6e 69 6f 6e 28 6e 65 77 63     SetUnion(newc
9ed0: 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 66 69 72  fp->fws,xsp->fir
9ee0: 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  stset);.        
9ef0: 20 20 20 20 69 66 28 20 78 73 70 2d 3e 6c 61 6d      if( xsp->lam
9f00: 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45  bda==LEMON_FALSE
9f10: 20 29 20 62 72 65 61 6b 3b 0a 09 20 20 7d 0a 09   ) break;..  }..
9f20: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  }.        if( i=
9f30: 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c 69 6e  =rp->nrhs ) Plin
9f40: 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66 70 6c 70  k_add(&cfp->fplp
9f50: 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20 20 20 20  ,newcfp);.      
9f60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
9f70: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  turn;.}../* Sort
9f80: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
9f90: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
9fa0: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28  Configlist_sort(
9fb0: 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28  ){.  current = (
9fc0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
9fd0: 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75  msort((char *)cu
9fe0: 72 72 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26  rrent,(char **)&
9ff0: 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c  (current->next),
a000: 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75  Configcmp);.  cu
a010: 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20  rrentend = 0;.  
a020: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f  return;.}../* So
a030: 72 74 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e  rt the basis con
a040: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
a050: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
a060: 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 7b 0a  st_sortbasis(){.
a070: 20 20 62 61 73 69 73 20 3d 20 28 73 74 72 75 63    basis = (struc
a080: 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74  t config *)msort
a090: 28 28 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74  ((char *)current
a0a0: 2c 28 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72  ,(char **)&(curr
a0b0: 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66 69 67 63  ent->bp),Configc
a0c0: 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  mp);.  basisend 
a0d0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
a0e0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
a0f0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
a100: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
a110: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
a120: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
a130: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
a140: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72  ig *Configlist_r
a150: 65 74 75 72 6e 28 29 7b 0a 20 20 73 74 72 75 63  eturn(){.  struc
a160: 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20  t config *old;. 
a170: 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a   old = current;.
a180: 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20    current = 0;. 
a190: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b   currentend = 0;
a1a0: 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d  .  return old;.}
a1b0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
a1c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
a1d0: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
a1e0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
a1f0: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
a200: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
a210: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62  ig *Configlist_b
a220: 61 73 69 73 28 29 7b 0a 20 20 73 74 72 75 63 74  asis(){.  struct
a230: 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20   config *old;.  
a240: 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20 20 62  old = basis;.  b
a250: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
a260: 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  send = 0;.  retu
a270: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72  rn old;.}../* Fr
a280: 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20  ee all elements 
a290: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6e  of the given con
a2a0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
a2b0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
a2c0: 73 74 5f 65 61 74 28 63 66 70 29 0a 73 74 72 75  st_eat(cfp).stru
a2d0: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
a2e0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
a2f0: 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f  g *nextcfp;.  fo
a300: 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78  r(; cfp; cfp=nex
a310: 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63  tcfp){.    nextc
a320: 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a  fp = cfp->next;.
a330: 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d      assert( cfp-
a340: 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20  >fplp==0 );.    
a350: 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c  assert( cfp->bpl
a360: 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  p==0 );.    if( 
a370: 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72  cfp->fws ) SetFr
a380: 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ee(cfp->fws);.  
a390: 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63    deleteconfig(c
a3a0: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
a3b0: 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n;.}./**********
a3c0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
a3d0: 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20   file "error.c" 
a3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a400: 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
a410: 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72  r printing error
a420: 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 2f 2a   message..*/../*
a430: 20 46 69 6e 64 20 61 20 67 6f 6f 64 20 70 6c 61   Find a good pla
a440: 63 65 20 74 6f 20 62 72 65 61 6b 20 22 6d 73 67  ce to break "msg
a450: 22 20 73 6f 20 74 68 61 74 20 69 74 73 20 6c 65  " so that its le
a460: 6e 67 74 68 20 69 73 20 61 74 20 6c 65 61 73 74  ngth is at least
a470: 20 22 6d 69 6e 22 0a 2a 2a 20 62 75 74 20 6e 6f   "min".** but no
a480: 20 6d 6f 72 65 20 74 68 61 6e 20 22 6d 61 78 22   more than "max"
a490: 2e 20 20 4d 61 6b 65 20 74 68 65 20 70 6f 69 6e  .  Make the poin
a4a0: 74 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 6d 61  t as close to ma
a4b0: 78 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  x as possible..*
a4c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
a4d0: 64 62 72 65 61 6b 28 6d 73 67 2c 6d 69 6e 2c 6d  dbreak(msg,min,m
a4e0: 61 78 29 0a 63 68 61 72 20 2a 6d 73 67 3b 0a 69  ax).char *msg;.i
a4f0: 6e 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d 61 78 3b  nt min;.int max;
a500: 0a 7b 0a 20 20 69 6e 74 20 69 2c 73 70 6f 74 3b  .{.  int i,spot;
a510: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66 6f 72  .  char c;.  for
a520: 28 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20 69 3c 3d  (i=spot=min; i<=
a530: 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  max; i++){.    c
a540: 20 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20 20 20 69   = msg[i];.    i
a550: 66 28 20 63 3d 3d 27 5c 74 27 20 29 20 6d 73 67  f( c=='\t' ) msg
a560: 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69  [i] = ' ';.    i
a570: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 6d 73  f( c=='\n' ){ ms
a580: 67 5b 69 5d 20 3d 20 27 20 27 3b 20 73 70 6f 74  g[i] = ' '; spot
a590: 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20   = i; break; }. 
a5a0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 20 73     if( c==0 ){ s
a5b0: 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20  pot = i; break; 
a5c0: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2d 27  }.    if( c=='-'
a5d0: 20 26 26 20 69 3c 6d 61 78 2d 31 20 29 20 73 70   && i<max-1 ) sp
a5e0: 6f 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 69 66  ot = i+1;.    if
a5f0: 28 20 63 3d 3d 27 20 27 20 29 20 73 70 6f 74 20  ( c==' ' ) spot 
a600: 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
a610: 6e 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n spot;.}../*.**
a620: 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   The error messa
a630: 67 65 20 69 73 20 73 70 6c 69 74 20 61 63 72 6f  ge is split acro
a640: 73 73 20 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 65  ss multiple line
a650: 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  s if necessary. 
a660: 20 54 68 65 0a 2a 2a 20 73 70 6c 69 74 73 20 6f   The.** splits o
a670: 63 63 75 72 20 61 74 20 61 20 73 70 61 63 65 2c  ccur at a space,
a680: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 73   if there is a s
a690: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6e  pace available n
a6a0: 65 61 72 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f  ear the end.** o
a6b0: 66 20 74 68 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 23  f the line..*/.#
a6c0: 64 65 66 69 6e 65 20 45 52 52 4d 53 47 53 49 5a  define ERRMSGSIZ
a6d0: 45 20 20 31 30 30 30 30 20 2f 2a 20 48 6f 70 65  E  10000 /* Hope
a6e0: 20 74 68 69 73 20 69 73 20 62 69 67 20 65 6e 6f   this is big eno
a6f0: 75 67 68 2e 20 20 4e 6f 20 77 61 79 20 74 6f 20  ugh.  No way to 
a700: 65 72 72 6f 72 20 63 68 65 63 6b 20 2a 2f 0a 23  error check */.#
a710: 64 65 66 69 6e 65 20 4c 49 4e 45 57 49 44 54 48  define LINEWIDTH
a720: 20 20 20 20 20 20 37 39 20 2f 2a 20 4d 61 78 20        79 /* Max 
a730: 77 69 64 74 68 20 6f 66 20 61 6e 79 20 6f 75 74  width of any out
a740: 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66  put line */.#def
a750: 69 6e 65 20 50 52 45 46 49 58 4c 49 4d 49 54 20  ine PREFIXLIMIT 
a760: 20 20 20 33 30 20 2f 2a 20 4d 61 78 20 77 69 64     30 /* Max wid
a770: 74 68 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  th of the prefix
a780: 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f   on each line */
a790: 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63  .void ErrorMsg(c
a7a0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
a7b0: 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  ame, int lineno,
a7c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72   const char *for
a7d0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61  mat, ...){.  cha
a7e0: 72 20 65 72 72 6d 73 67 5b 45 52 52 4d 53 47 53  r errmsg[ERRMSGS
a7f0: 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 72 65  IZE];.  char pre
a800: 66 69 78 5b 50 52 45 46 49 58 4c 49 4d 49 54 2b  fix[PREFIXLIMIT+
a810: 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72 72 6d 73  10];.  int errms
a820: 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20 70 72 65  gsize;.  int pre
a830: 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e 74 20 61  fixsize;.  int a
a840: 76 61 69 6c 61 62 6c 65 77 69 64 74 68 3b 0a 20  vailablewidth;. 
a850: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
a860: 6e 74 20 65 6e 64 2c 20 72 65 73 74 61 72 74 2c  nt end, restart,
a870: 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f 73 74 61   base;..  va_sta
a880: 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a  rt(ap, format);.
a890: 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61 20 70    /* Prepare a p
a8a0: 72 65 66 69 78 20 74 6f 20 62 65 20 70 72 65 70  refix to be prep
a8b0: 65 6e 64 65 64 20 74 6f 20 65 76 65 72 79 20 6f  ended to every o
a8c0: 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 20 20  utput line */.  
a8d0: 69 66 28 20 6c 69 6e 65 6e 6f 3e 30 20 29 7b 0a  if( lineno>0 ){.
a8e0: 20 20 20 20 73 70 72 69 6e 74 66 28 70 72 65 66      sprintf(pref
a8f0: 69 78 2c 22 25 2e 2a 73 3a 25 64 3a 20 22 2c 50  ix,"%.*s:%d: ",P
a900: 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69  REFIXLIMIT-10,fi
a910: 6c 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29 3b 0a  lename,lineno);.
a920: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72    }else{.    spr
a930: 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a  intf(prefix,"%.*
a940: 73 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d 49 54  s: ",PREFIXLIMIT
a950: 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  -10,filename);. 
a960: 20 7d 0a 20 20 70 72 65 66 69 78 73 69 7a 65 20   }.  prefixsize 
a970: 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 72  = lemonStrlen(pr
a980: 65 66 69 78 29 3b 0a 20 20 61 76 61 69 6c 61 62  efix);.  availab
a990: 6c 65 77 69 64 74 68 20 3d 20 4c 49 4e 45 57 49  lewidth = LINEWI
a9a0: 44 54 48 20 2d 20 70 72 65 66 69 78 73 69 7a 65  DTH - prefixsize
a9b0: 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
a9c0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
a9d0: 67 65 20 2a 2f 0a 20 20 76 73 70 72 69 6e 74 66  ge */.  vsprintf
a9e0: 28 65 72 72 6d 73 67 2c 66 6f 72 6d 61 74 2c 61  (errmsg,format,a
a9f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
aa00: 3b 0a 20 20 65 72 72 6d 73 67 73 69 7a 65 20 3d  ;.  errmsgsize =
aa10: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 65 72 72   lemonStrlen(err
aa20: 6d 73 67 29 3b 0a 20 20 2f 2a 20 52 65 6d 6f 76  msg);.  /* Remov
aa30: 65 20 74 72 61 69 6c 69 6e 67 20 27 5c 6e 27 73  e trailing '\n's
aa40: 20 66 72 6f 6d 20 74 68 65 20 65 72 72 6f 72 20   from the error 
aa50: 6d 65 73 73 61 67 65 2e 20 2a 2f 0a 20 20 77 68  message. */.  wh
aa60: 69 6c 65 28 20 65 72 72 6d 73 67 73 69 7a 65 3e  ile( errmsgsize>
aa70: 30 20 26 26 20 65 72 72 6d 73 67 5b 65 72 72 6d  0 && errmsg[errm
aa80: 73 67 73 69 7a 65 2d 31 5d 3d 3d 27 5c 6e 27 20  sgsize-1]=='\n' 
aa90: 29 7b 0a 20 20 20 20 20 65 72 72 6d 73 67 5b 2d  ){.     errmsg[-
aaa0: 2d 65 72 72 6d 73 67 73 69 7a 65 5d 20 3d 20 30  -errmsgsize] = 0
aab0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e  ;.  }..  /* Prin
aac0: 74 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  t the error mess
aad0: 61 67 65 20 2a 2f 0a 20 20 62 61 73 65 20 3d 20  age */.  base = 
aae0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 65 72 72 6d  0;.  while( errm
aaf0: 73 67 5b 62 61 73 65 5d 21 3d 30 20 29 7b 0a 20  sg[base]!=0 ){. 
ab00: 20 20 20 65 6e 64 20 3d 20 72 65 73 74 61 72 74     end = restart
ab10: 20 3d 20 66 69 6e 64 62 72 65 61 6b 28 26 65 72   = findbreak(&er
ab20: 72 6d 73 67 5b 62 61 73 65 5d 2c 30 2c 61 76 61  rmsg[base],0,ava
ab30: 69 6c 61 62 6c 65 77 69 64 74 68 29 3b 0a 20 20  ilablewidth);.  
ab40: 20 20 72 65 73 74 61 72 74 20 2b 3d 20 62 61 73    restart += bas
ab50: 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 65 72  e;.    while( er
ab60: 72 6d 73 67 5b 72 65 73 74 61 72 74 5d 3d 3d 27  rmsg[restart]=='
ab70: 20 27 20 29 20 72 65 73 74 61 72 74 2b 2b 3b 0a   ' ) restart++;.
ab80: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f      fprintf(stdo
ab90: 75 74 2c 22 25 73 25 2e 2a 73 5c 6e 22 2c 70 72  ut,"%s%.*s\n",pr
aba0: 65 66 69 78 2c 65 6e 64 2c 26 65 72 72 6d 73 67  efix,end,&errmsg
abb0: 5b 62 61 73 65 5d 29 3b 0a 20 20 20 20 62 61 73  [base]);.    bas
abc0: 65 20 3d 20 72 65 73 74 61 72 74 3b 0a 20 20 7d  e = restart;.  }
abd0: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
abe0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
abf0: 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a  le "main.c" ****
ac00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac20: 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f  /./*.** Main pro
ac30: 67 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74 68  gram file for th
ac40: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
ac50: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
ac60: 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d 6f   Report an out-o
ac70: 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74 69  f-memory conditi
ac80: 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20 54  on and abort.  T
ac90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
aca0: 69 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20 62  is used mostly b
acb0: 79 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68 65  y the "MemoryChe
acc0: 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74 72  ck" macro in str
acd0: 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65  uct.h.*/.void me
ace0: 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a 20 20  mory_error(){.  
acf0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
ad00: 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 20  Out of memory.  
ad10: 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29 3b  Aborting...\n");
ad20: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 73  .  exit(1);.}..s
ad30: 74 61 74 69 63 20 69 6e 74 20 6e 44 65 66 69 6e  tatic int nDefin
ad40: 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  e = 0;      /* N
ad50: 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f 70 74 69  umber of -D opti
ad60: 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61  ons on the comma
ad70: 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74 61 74 69  nd line */.stati
ad80: 63 20 63 68 61 72 20 2a 2a 61 7a 44 65 66 69 6e  c char **azDefin
ad90: 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d 65 20  e = 0;  /* Name 
ada0: 6f 66 20 74 68 65 20 2d 44 20 6d 61 63 72 6f 73  of the -D macros
adb0: 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 72 6f 75   */../* This rou
adc0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
add0: 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e 74  ith the argument
ade0: 20 74 6f 20 65 61 63 68 20 2d 44 20 63 6f 6d 6d   to each -D comm
adf0: 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e  and-line option.
ae00: 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d 61 63 72  .** Add the macr
ae10: 6f 20 64 65 66 69 6e 65 64 20 74 6f 20 74 68 65  o defined to the
ae20: 20 61 7a 44 65 66 69 6e 65 20 61 72 72 61 79 2e   azDefine array.
ae30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ae40: 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 28  handle_D_option(
ae50: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61 72  char *z){.  char
ae60: 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65 66 69 6e   **paz;.  nDefin
ae70: 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69 6e 65 20  e++;.  azDefine 
ae80: 3d 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66 69  = realloc(azDefi
ae90: 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65 66  ne, sizeof(azDef
aea0: 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65 29  ine[0])*nDefine)
aeb0: 3b 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e 65  ;.  if( azDefine
aec0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
aed0: 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f  tf(stderr,"out o
aee0: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
aef0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
af00: 20 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e 65   paz = &azDefine
af10: 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20 2a  [nDefine-1];.  *
af20: 70 61 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65  paz = malloc( le
af30: 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29  monStrlen(z)+1 )
af40: 3b 0a 20 20 69 66 28 20 2a 70 61 7a 3d 3d 30 20  ;.  if( *paz==0 
af50: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
af60: 74 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65  tderr,"out of me
af70: 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mory\n");.    ex
af80: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74 72  it(1);.  }.  str
af90: 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20  cpy(*paz, z);.  
afa0: 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26  for(z=*paz; *z &
afb0: 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b  & *z!='='; z++){
afc0: 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 0a  }.  *z = 0;.}...
afd0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f 67  /* The main prog
afe0: 72 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65 20  ram.  Parse the 
aff0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64  command line and
b000: 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74   do it... */.int
b010: 20 6d 61 69 6e 28 61 72 67 63 2c 61 72 67 76 29   main(argc,argv)
b020: 0a 69 6e 74 20 61 72 67 63 3b 0a 63 68 61 72 20  .int argc;.char 
b030: 2a 2a 61 72 67 76 3b 0a 7b 0a 20 20 73 74 61 74  **argv;.{.  stat
b040: 69 63 20 69 6e 74 20 76 65 72 73 69 6f 6e 20 3d  ic int version =
b050: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
b060: 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73   rpflag = 0;.  s
b070: 74 61 74 69 63 20 69 6e 74 20 62 61 73 69 73 66  tatic int basisf
b080: 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  lag = 0;.  stati
b090: 63 20 69 6e 74 20 63 6f 6d 70 72 65 73 73 20 3d  c int compress =
b0a0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
b0b0: 20 71 75 69 65 74 20 3d 20 30 3b 0a 20 20 73 74   quiet = 0;.  st
b0c0: 61 74 69 63 20 69 6e 74 20 73 74 61 74 69 73 74  atic int statist
b0d0: 69 63 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ics = 0;.  stati
b0e0: 63 20 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20 30  c int mhflag = 0
b0f0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.  static int n
b100: 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 30  olinenosflag = 0
b110: 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
b120: 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69  t s_options opti
b130: 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f  ons[] = {.    {O
b140: 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28 63  PT_FLAG, "b", (c
b150: 68 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67 2c  har*)&basisflag,
b160: 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65   "Print only the
b170: 20 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72 74   basis in report
b180: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
b190: 41 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a 29  AG, "c", (char*)
b1a0: 26 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27  &compress, "Don'
b1b0: 74 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20 61  t compress the a
b1c0: 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a  ction table."},.
b1d0: 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22      {OPT_FSTR, "
b1e0: 44 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c  D", (char*)handl
b1f0: 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65 66  e_D_option, "Def
b200: 69 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d 61  ine an %ifdef ma
b210: 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  cro."},.    {OPT
b220: 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61  _FLAG, "g", (cha
b230: 72 2a 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69  r*)&rpflag, "Pri
b240: 6e 74 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f  nt grammar witho
b250: 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20  ut actions."},. 
b260: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d     {OPT_FLAG, "m
b270: 22 2c 20 28 63 68 61 72 2a 29 26 6d 68 66 6c 61  ", (char*)&mhfla
b280: 67 2c 20 22 4f 75 74 70 75 74 20 61 20 6d 61 6b  g, "Output a mak
b290: 65 68 65 61 64 65 72 73 20 63 6f 6d 70 61 74 69  eheaders compati
b2a0: 62 6c 65 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20  ble file."},.   
b2b0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6c 22 2c   {OPT_FLAG, "l",
b2c0: 20 28 63 68 61 72 2a 29 26 6e 6f 6c 69 6e 65 6e   (char*)&nolinen
b2d0: 6f 73 66 6c 61 67 2c 20 22 44 6f 20 6e 6f 74 20  osflag, "Do not 
b2e0: 70 72 69 6e 74 20 23 6c 69 6e 65 20 73 74 61 74  print #line stat
b2f0: 65 6d 65 6e 74 73 2e 22 7d 2c 0a 20 20 20 20 7b  ements."},.    {
b300: 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28  OPT_FLAG, "q", (
b310: 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28  char*)&quiet, "(
b320: 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69  Quiet) Don't pri
b330: 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66 69  nt the report fi
b340: 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  le."},.    {OPT_
b350: 46 4c 41 47 2c 20 22 73 22 2c 20 28 63 68 61 72  FLAG, "s", (char
b360: 2a 29 26 73 74 61 74 69 73 74 69 63 73 2c 0a 20  *)&statistics,. 
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 22 50 72 69 6e 74 20 70 61 72 73 65 72 20    "Print parser 
b3a0: 73 74 61 74 73 20 74 6f 20 73 74 61 6e 64 61 72  stats to standar
b3b0: 64 20 6f 75 74 70 75 74 2e 22 7d 2c 0a 20 20 20  d output."},.   
b3c0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 78 22 2c   {OPT_FLAG, "x",
b3d0: 20 28 63 68 61 72 2a 29 26 76 65 72 73 69 6f 6e   (char*)&version
b3e0: 2c 20 22 50 72 69 6e 74 20 74 68 65 20 76 65 72  , "Print the ver
b3f0: 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a  sion number."},.
b400: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c      {OPT_FLAG,0,
b410: 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  0,0}.  };.  int 
b420: 69 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  i;.  struct lemo
b430: 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69  n lem;..  OptIni
b440: 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73  t(argv,options,s
b450: 74 64 65 72 72 29 3b 0a 20 20 69 66 28 20 76 65  tderr);.  if( ve
b460: 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72  rsion ){.     pr
b470: 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73  intf("Lemon vers
b480: 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20 20  ion 1.0\n");.   
b490: 20 20 65 78 69 74 28 30 29 3b 20 0a 20 20 7d 0a    exit(0); .  }.
b4a0: 20 20 69 66 28 20 4f 70 74 4e 41 72 67 73 28 29    if( OptNArgs()
b4b0: 21 3d 31 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  !=1 ){.    fprin
b4c0: 74 66 28 73 74 64 65 72 72 2c 22 45 78 61 63 74  tf(stderr,"Exact
b4d0: 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65 20  ly one filename 
b4e0: 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65 71 75  argument is requ
b4f0: 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  ired.\n");.    e
b500: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65  xit(1);.  }.  me
b510: 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c 20 73 69  mset(&lem, 0, si
b520: 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20 20 6c 65  zeof(lem));.  le
b530: 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a  m.errorcnt = 0;.
b540: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
b550: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a   the machine */.
b560: 20 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29    Strsafe_init()
b570: 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28  ;.  Symbol_init(
b580: 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69 74 28  );.  State_init(
b590: 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d  );.  lem.argv0 =
b5a0: 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e   argv[0];.  lem.
b5b0: 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72  filename = OptAr
b5c0: 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69  g(0);.  lem.basi
b5d0: 73 66 6c 61 67 20 3d 20 62 61 73 69 73 66 6c 61  sflag = basisfla
b5e0: 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65 6e  g;.  lem.nolinen
b5f0: 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65 6e  osflag = nolinen
b600: 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f 6c  osflag;.  Symbol
b610: 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20 6c 65 6d  _new("$");.  lem
b620: 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c  .errsym = Symbol
b630: 5f 6e 65 77 28 22 65 72 72 6f 72 22 29 3b 0a 20  _new("error");. 
b640: 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e 75 73 65   lem.errsym->use
b650: 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50  Cnt = 0;..  /* P
b660: 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 66  arse the input f
b670: 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26  ile */.  Parse(&
b680: 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e  lem);.  if( lem.
b690: 65 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28  errorcnt ) exit(
b6a0: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20  lem.errorcnt);. 
b6b0: 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d 3d   if( lem.nrule==
b6c0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
b6d0: 28 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20 67  (stderr,"Empty g
b6e0: 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20  rammar.\n");.   
b6f0: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20   exit(1);.  }.. 
b700: 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e   /* Count and in
b710: 64 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  dex the symbols 
b720: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  of the grammar *
b730: 2f 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20  /.  lem.nsymbol 
b740: 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29  = Symbol_count()
b750: 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22  ;.  Symbol_new("
b760: 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c  {default}");.  l
b770: 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d  em.symbols = Sym
b780: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20  bol_arrayof();. 
b790: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d   for(i=0; i<=lem
b7a0: 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c  .nsymbol; i++) l
b7b0: 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69  em.symbols[i]->i
b7c0: 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72  ndex = i;.  qsor
b7d0: 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65  t(lem.symbols,le
b7e0: 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65  m.nsymbol+1,size
b7f0: 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
b800: 2a 29 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74  *),.        (int
b810: 28 2a 29 28 29 29 53 79 6d 62 6f 6c 63 6d 70 70  (*)())Symbolcmpp
b820: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
b830: 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  =lem.nsymbol; i+
b840: 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  +) lem.symbols[i
b850: 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20  ]->index = i;.  
b860: 66 6f 72 28 69 3d 31 3b 20 69 73 75 70 70 65 72  for(i=1; isupper
b870: 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  (lem.symbols[i]-
b880: 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b  >name[0]); i++);
b890: 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c  .  lem.nterminal
b8a0: 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65   = i;..  /* Gene
b8b0: 72 61 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f  rate a reprint o
b8c0: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69  f the grammar, i
b8d0: 66 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74  f requested on t
b8e0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
b8f0: 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20  */.  if( rpflag 
b900: 29 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26  ){.    Reprint(&
b910: 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lem);.  }else{. 
b920: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
b930: 20 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c   the size for al
b940: 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72  l follow and fir
b950: 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53  st sets */.    S
b960: 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d  etSize(lem.nterm
b970: 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a  inal+1);..    /*
b980: 20 46 69 6e 64 20 74 68 65 20 70 72 65 63 65 64   Find the preced
b990: 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20 70  ence for every p
b9a0: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28  roduction rule (
b9b0: 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f  that has one) */
b9c0: 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65  .    FindRulePre
b9d0: 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a  cedences(&lem);.
b9e0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
b9f0: 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65  the lambda-nonte
ba00: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20  rminals and the 
ba10: 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65  first-sets for e
ba20: 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74  very.    ** nont
ba30: 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46  erminal */.    F
ba40: 69 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c 65  indFirstSets(&le
ba50: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
ba60: 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74  ute all LR(0) st
ba70: 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f  ates.  Also reco
ba80: 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  rd follow-set pr
ba90: 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  opagation.    **
baa0: 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74   links so that t
bab0: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61  he follow-set ca
bac0: 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61  n be computed la
bad0: 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e  ter */.    lem.n
bae0: 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46  state = 0;.    F
baf0: 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b  indStates(&lem);
bb00: 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20  .    lem.sorted 
bb10: 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  = State_arrayof(
bb20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75  );..    /* Tie u
bb30: 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20  p loose ends on 
bb40: 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  the propagation 
bb50: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e  links */.    Fin
bb60: 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20  dLinks(&lem);.. 
bb70: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
bb80: 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20  e follow set of 
bb90: 65 76 65 72 79 20 72 65 64 75 63 69 62 6c 65 20  every reducible 
bba0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
bbb0: 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  .    FindFollowS
bbc0: 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ets(&lem);..    
bbd0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  /* Compute the a
bbe0: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
bbf0: 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28      FindActions(
bc00: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
bc10: 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69  ompress the acti
bc20: 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  on tables */.   
bc30: 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30   if( compress==0
bc40: 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65   ) CompressTable
bc50: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
bc60: 20 52 65 6f 72 64 65 72 20 61 6e 64 20 72 65 6e   Reorder and ren
bc70: 75 6d 62 65 72 20 74 68 65 20 73 74 61 74 65 73  umber the states
bc80: 20 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20   so that states 
bc90: 77 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63  with fewer choic
bca0: 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20  es.    ** occur 
bcb0: 61 74 20 74 68 65 20 65 6e 64 2e 20 2a 2f 0a 20  at the end. */. 
bcc0: 20 20 20 52 65 73 6f 72 74 53 74 61 74 65 73 28     ResortStates(
bcd0: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  &lem);..    /* G
bce0: 65 6e 65 72 61 74 65 20 61 20 72 65 70 6f 72 74  enerate a report
bcf0: 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 67   of the parser g
bd00: 65 6e 65 72 61 74 65 64 2e 20 20 28 74 68 65 20  enerated.  (the 
bd10: 22 79 2e 6f 75 74 70 75 74 22 20 66 69 6c 65 29  "y.output" file)
bd20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69   */.    if( !qui
bd30: 65 74 20 29 20 52 65 70 6f 72 74 4f 75 74 70 75  et ) ReportOutpu
bd40: 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  t(&lem);..    /*
bd50: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 6f   Generate the so
bd60: 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68  urce code for th
bd70: 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 20 20  e parser */.    
bd80: 52 65 70 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d  ReportTable(&lem
bd90: 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20  , mhflag);..    
bda0: 2f 2a 20 50 72 6f 64 75 63 65 20 61 20 68 65 61  /* Produce a hea
bdb0: 64 65 72 20 66 69 6c 65 20 66 6f 72 20 75 73 65  der file for use
bdc0: 20 62 79 20 74 68 65 20 73 63 61 6e 6e 65 72 2e   by the scanner.
bdd0: 20 20 28 54 68 69 73 20 73 74 65 70 20 69 73 0a    (This step is.
bde0: 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69      ** omitted i
bdf0: 66 20 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f  f the "-m" optio
be00: 6e 20 69 73 20 75 73 65 64 20 62 65 63 61 75 73  n is used becaus
be10: 65 20 6d 61 6b 65 68 65 61 64 65 72 73 20 77 69  e makeheaders wi
be20: 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61  ll.    ** genera
be30: 74 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  te the file for 
be40: 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28 20  us.) */.    if( 
be50: 21 6d 68 66 6c 61 67 20 29 20 52 65 70 6f 72 74  !mhflag ) Report
be60: 48 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20  Header(&lem);.  
be70: 7d 0a 20 20 69 66 28 20 73 74 61 74 69 73 74 69  }.  if( statisti
be80: 63 73 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  cs ){.    printf
be90: 28 22 50 61 72 73 65 72 20 73 74 61 74 69 73 74  ("Parser statist
bea0: 69 63 73 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c  ics: %d terminal
beb0: 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61  s, %d nontermina
bec0: 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c  ls, %d rules\n",
bed0: 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d  .      lem.nterm
bee0: 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f  inal, lem.nsymbo
bef0: 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  l - lem.ntermina
bf00: 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20  l, lem.nrule);. 
bf10: 20 20 20 70 72 69 6e 74 66 28 22 20 20 20 20 20     printf("     
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
bf30: 20 73 74 61 74 65 73 2c 20 25 64 20 70 61 72 73   states, %d pars
bf40: 65 72 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  er table entries
bf50: 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e  , %d conflicts\n
bf60: 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74  ",.      lem.nst
bf70: 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69  ate, lem.tablesi
bf80: 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63  ze, lem.nconflic
bf90: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  t);.  }.  if( le
bfa0: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 29 7b 0a 20  m.nconflict ){. 
bfb0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
bfc0: 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20 63 6f  r,"%d parsing co
bfd0: 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e  nflicts.\n",lem.
bfe0: 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a  nconflict);.  }.
bff0: 20 20 65 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72    exit(lem.error
c000: 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c  cnt + lem.nconfl
c010: 69 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ict);.  return (
c020: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 2b 20 6c  lem.errorcnt + l
c030: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 7d  em.nconflict);.}
c040: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
c050: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
c060: 66 69 6c 65 20 22 6d 73 6f 72 74 2e 63 22 20 2a  file "msort.c" *
c070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
c090: 2f 2a 0a 2a 2a 20 41 20 67 65 6e 65 72 69 63 20  /*.** A generic 
c0a0: 6d 65 72 67 65 2d 73 6f 72 74 20 70 72 6f 67 72  merge-sort progr
c0b0: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a  am..**.** USAGE:
c0c0: 0a 2a 2a 20 4c 65 74 20 22 70 74 72 22 20 62 65  .** Let "ptr" be
c0d0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f   a pointer to so
c0e0: 6d 65 20 73 74 72 75 63 74 75 72 65 20 77 68 69  me structure whi
c0f0: 63 68 20 69 73 20 61 74 20 74 68 65 20 68 65 61  ch is at the hea
c100: 64 20 6f 66 0a 2a 2a 20 61 20 6e 75 6c 6c 2d 74  d of.** a null-t
c110: 65 72 6d 69 6e 61 74 65 64 20 6c 69 73 74 2e 20  erminated list. 
c120: 20 54 68 65 6e 20 74 6f 20 73 6f 72 74 20 74 68   Then to sort th
c130: 65 20 6c 69 73 74 20 63 61 6c 6c 3a 0a 2a 2a 0a  e list call:.**.
c140: 2a 2a 20 20 20 20 20 70 74 72 20 3d 20 6d 73 6f  **     ptr = mso
c150: 72 74 28 70 74 72 2c 26 28 70 74 72 2d 3e 6e 65  rt(ptr,&(ptr->ne
c160: 78 74 29 2c 63 6d 70 66 6e 63 29 3b 0a 2a 2a 0a  xt),cmpfnc);.**.
c170: 2a 2a 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c  ** In the above,
c180: 20 22 63 6d 70 66 6e 63 22 20 69 73 20 61 20 70   "cmpfnc" is a p
c190: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
c1a0: 74 69 6f 6e 20 77 68 69 63 68 20 63 6f 6d 70 61  tion which compa
c1b0: 72 65 73 0a 2a 2a 20 74 77 6f 20 69 6e 73 74 61  res.** two insta
c1c0: 6e 63 65 73 20 6f 66 20 74 68 65 20 73 74 72 75  nces of the stru
c1d0: 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e  cture and return
c1e0: 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 73  s an integer, as
c1f0: 20 69 6e 0a 2a 2a 20 73 74 72 63 6d 70 2e 20 20   in.** strcmp.  
c200: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
c210: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
c220: 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20   to the pointer 
c230: 74 6f 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  to the.** second
c240: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
c250: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 54 68  linked list.  Th
c260: 69 73 20 61 64 64 72 65 73 73 20 69 73 20 75 73  is address is us
c270: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a  ed to compute.**
c280: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c290: 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20  he "next" field 
c2a0: 77 69 74 68 69 6e 20 74 68 65 20 73 74 72 75 63  within the struc
c2b0: 74 75 72 65 2e 20 20 54 68 65 20 6f 66 66 73 65  ture.  The offse
c2c0: 74 20 74 6f 0a 2a 2a 20 74 68 65 20 22 6e 65 78  t to.** the "nex
c2d0: 74 22 20 66 69 65 6c 64 20 6d 75 73 74 20 62 65  t" field must be
c2e0: 20 63 6f 6e 73 74 61 6e 74 20 66 6f 72 20 61 6c   constant for al
c2f0: 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  l structures in 
c300: 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  the list..**.** 
c310: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  The function ret
c320: 75 72 6e 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  urns a new point
c330: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c340: 68 65 61 64 20 6f 66 20 74 68 65 20 6c 69 73 74  head of the list
c350: 0a 2a 2a 20 61 66 74 65 72 20 73 6f 72 74 69 6e  .** after sortin
c360: 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54  g..**.** ALGORIT
c370: 48 4d 3a 0a 2a 2a 20 4d 65 72 67 65 2d 73 6f 72  HM:.** Merge-sor
c380: 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t..*/../*.** Ret
c390: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
c3a0: 20 74 68 65 20 6e 65 78 74 20 73 74 72 75 63 74   the next struct
c3b0: 75 72 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  ure in the linke
c3c0: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69  d list..*/.#defi
c3d0: 6e 65 20 4e 45 58 54 28 41 29 20 28 2a 28 63 68  ne NEXT(A) (*(ch
c3e0: 61 72 2a 2a 29 28 28 28 75 6e 73 69 67 6e 65 64  ar**)(((unsigned
c3f0: 20 6c 6f 6e 67 29 41 29 2b 6f 66 66 73 65 74 29   long)A)+offset)
c400: 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a  )../*.** Inputs:
c410: 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20 20 20 41  .**   a:       A
c420: 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65   sorted, null-te
c430: 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20  rminated linked 
c440: 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e  list.  (May be n
c450: 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20  ull)..**   b:   
c460: 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75      A sorted, nu
c470: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69  ll-terminated li
c480: 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79  nked list.  (May
c490: 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20   be null)..**   
c4a0: 63 6d 70 3a 20 20 20 20 20 41 20 70 6f 69 6e 74  cmp:     A point
c4b0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72  er to the compar
c4c0: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ison function..*
c4d0: 2a 20 20 20 6f 66 66 73 65 74 3a 20 20 4f 66 66  *   offset:  Off
c4e0: 73 65 74 20 69 6e 20 74 68 65 20 73 74 72 75 63  set in the struc
c4f0: 74 75 72 65 20 74 6f 20 74 68 65 20 22 6e 65 78  ture to the "nex
c500: 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  t" field..**.** 
c510: 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a  Return Value:.**
c520: 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20     A pointer to 
c530: 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f  the head of a so
c540: 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69  rted list contai
c550: 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74  ning the element
c560: 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20 61  s.**   of both a
c570: 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69   and b..**.** Si
c580: 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20  de effects:.**  
c590: 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e   The "next" poin
c5a0: 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74  ters for element
c5b0: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 73 20 61  s in the lists a
c5c0: 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20 20   and b are.**   
c5d0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
c5e0: 69 63 20 63 68 61 72 20 2a 6d 65 72 67 65 28 0a  ic char *merge(.
c5f0: 20 20 63 68 61 72 20 2a 61 2c 0a 20 20 63 68 61    char *a,.  cha
c600: 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d  r *b,.  int (*cm
c610: 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  p)(const char*,c
c620: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20 20 69  onst char*),.  i
c630: 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63  nt offset.){.  c
c640: 68 61 72 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b  har *ptr, *head;
c650: 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a  ..  if( a==0 ){.
c660: 20 20 20 20 68 65 61 64 20 3d 20 62 3b 0a 20 20      head = b;.  
c670: 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d 30 20 29  }else if( b==0 )
c680: 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 61 3b 0a  {.    head = a;.
c690: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
c6a0: 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20   (*cmp)(a,b)<=0 
c6b0: 29 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 61  ){.      ptr = a
c6c0: 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54  ;.      a = NEXT
c6d0: 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (a);.    }else{.
c6e0: 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20        ptr = b;. 
c6f0: 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29       b = NEXT(b)
c700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 65 61 64  ;.    }.    head
c710: 20 3d 20 70 74 72 3b 0a 20 20 20 20 77 68 69 6c   = ptr;.    whil
c720: 65 28 20 61 20 26 26 20 62 20 29 7b 0a 20 20 20  e( a && b ){.   
c730: 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c     if( (*cmp)(a,
c740: 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)<=0 ){.       
c750: 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a   NEXT(ptr) = a;.
c760: 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b          ptr = a;
c770: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e 45 58  .        a = NEX
c780: 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  T(a);.      }els
c790: 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28  e{.        NEXT(
c7a0: 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20 20 20  ptr) = b;.      
c7b0: 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20    ptr = b;.     
c7c0: 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a     b = NEXT(b);.
c7d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c7e0: 20 20 69 66 28 20 61 20 29 20 4e 45 58 54 28 70    if( a ) NEXT(p
c7f0: 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73  tr) = a;.    els
c800: 65 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d  e    NEXT(ptr) =
c810: 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   b;.  }.  return
c820: 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   head;.}../*.** 
c830: 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73  Inputs:.**   lis
c840: 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20  t:      Pointer 
c850: 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b  to a singly-link
c860: 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72 75 63  ed list of struc
c870: 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74  tures..**   next
c880: 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74  :      Pointer t
c890: 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  o pointer to the
c8a0: 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
c8b0: 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20  of the list..** 
c8c0: 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41 20 63    cmp:       A c
c8d0: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
c8e0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  on..**.** Return
c8f0: 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70   Value:.**   A p
c900: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
c910: 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c  ad of a sorted l
c920: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ist containing t
c930: 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20  he elements.**  
c940: 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69   orginally in li
c950: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65  st..**.** Side e
c960: 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65  ffects:.**   The
c970: 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73   "next" pointers
c980: 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e   for elements in
c990: 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e 67 65   list are change
c9a0: 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49  d..*/.#define LI
c9b0: 53 54 53 49 5a 45 20 33 30 0a 73 74 61 74 69 63  STSIZE 30.static
c9c0: 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20   char *msort(.  
c9d0: 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68  char *list,.  ch
c9e0: 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74  ar **next,.  int
c9f0: 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68   (*cmp)(const ch
ca00: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
ca10: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  .){.  unsigned l
ca20: 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20 63 68  ong offset;.  ch
ca30: 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a  ar *ep;.  char *
ca40: 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20  set[LISTSIZE];. 
ca50: 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65 74   int i;.  offset
ca60: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
ca70: 67 29 6e 65 78 74 20 2d 20 28 75 6e 73 69 67 6e  g)next - (unsign
ca80: 65 64 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20 20  ed long)list;.  
ca90: 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53  for(i=0; i<LISTS
caa0: 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d  IZE; i++) set[i]
cab0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c   = 0;.  while( l
cac0: 69 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20  ist ){.    ep = 
cad0: 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d  list;.    list =
cae0: 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20   NEXT(list);.   
caf0: 20 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20   NEXT(ep) = 0;. 
cb00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49     for(i=0; i<LI
cb10: 53 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b  STSIZE-1 && set[
cb20: 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i]!=0; i++){.   
cb30: 20 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70     ep = merge(ep
cb40: 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73  ,set[i],cmp,offs
cb50: 65 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69  et);.      set[i
cb60: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 0;.    }.   
cb70: 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20   set[i] = ep;.  
cb80: 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f  }.  ep = 0;.  fo
cb90: 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a  r(i=0; i<LISTSIZ
cba0: 45 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b  E; i++) if( set[
cbb0: 69 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28  i] ) ep = merge(
cbc0: 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66  set[i],ep,cmp,of
cbd0: 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  fset);.  return 
cbe0: 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ep;.}./*********
cbf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
cc00: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f  From the file "o
cc10: 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  ption.c" *******
cc20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc30: 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ***/.static char
cc40: 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20   **argv;.static 
cc50: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
cc60: 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c   *op;.static FIL
cc70: 45 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23  E *errstream;..#
cc80: 64 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20  define ISOPT(X) 
cc90: 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58  ((X)[0]=='-'||(X
cca0: 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68  )[0]=='+'||strch
ccb0: 72 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a  r((X),'=')!=0)..
ccc0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
ccd0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74  command line wit
cce0: 68 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74  h a carrot point
ccf0: 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20  ing to the k-th 
cd00: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20  character.** of 
cd10: 74 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a  the n-th field..
cd20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
cd30: 72 72 6c 69 6e 65 28 6e 2c 6b 2c 65 72 72 29 0a  rrline(n,k,err).
cd40: 69 6e 74 20 6e 3b 0a 69 6e 74 20 6b 3b 0a 46 49  int n;.int k;.FI
cd50: 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74  LE *err;.{.  int
cd60: 20 73 70 63 6e 74 2c 20 69 3b 0a 20 20 69 66 28   spcnt, i;.  if(
cd70: 20 61 72 67 76 5b 30 5d 20 29 20 66 70 72 69 6e   argv[0] ) fprin
cd80: 74 66 28 65 72 72 2c 22 25 73 22 2c 61 72 67 76  tf(err,"%s",argv
cd90: 5b 30 5d 29 3b 0a 20 20 73 70 63 6e 74 20 3d 20  [0]);.  spcnt = 
cda0: 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76  lemonStrlen(argv
cdb0: 5b 30 5d 29 20 2b 20 31 3b 0a 20 20 66 6f 72 28  [0]) + 1;.  for(
cdc0: 69 3d 31 3b 20 69 3c 6e 20 26 26 20 61 72 67 76  i=1; i<n && argv
cdd0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  [i]; i++){.    f
cde0: 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22  printf(err," %s"
cdf0: 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 73  ,argv[i]);.    s
ce00: 70 63 6e 74 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72  pcnt += lemonStr
ce10: 6c 65 6e 28 61 72 67 76 5b 69 5d 29 2b 31 3b 0a  len(argv[i])+1;.
ce20: 20 20 7d 0a 20 20 73 70 63 6e 74 20 2b 3d 20 6b    }.  spcnt += k
ce30: 3b 0a 20 20 66 6f 72 28 3b 20 61 72 67 76 5b 69  ;.  for(; argv[i
ce40: 5d 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74 66 28  ]; i++) fprintf(
ce50: 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69  err," %s",argv[i
ce60: 5d 29 3b 0a 20 20 69 66 28 20 73 70 63 6e 74 3c  ]);.  if( spcnt<
ce70: 32 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  20 ){.    fprint
ce80: 66 28 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d 2d 20  f(err,"\n%*s^-- 
ce90: 68 65 72 65 5c 6e 22 2c 73 70 63 6e 74 2c 22 22  here\n",spcnt,""
cea0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ceb0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25  fprintf(err,"\n%
cec0: 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c 73 70  *shere --^\n",sp
ced0: 63 6e 74 2d 37 2c 22 22 29 3b 0a 20 20 7d 0a 7d  cnt-7,"");.  }.}
cee0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
cef0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
cf00: 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69 74 63 68 20  N-th non-switch 
cf10: 61 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75 72  argument.  Retur
cf20: 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e 20 69 73 20  n -1.** if N is 
cf30: 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 0a 2a 2f  out of range..*/
cf40: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 67 69  .static int argi
cf50: 6e 64 65 78 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  ndex(n).int n;.{
cf60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
cf70: 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20  dashdash = 0;.  
cf80: 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 2a  if( argv!=0 && *
cf90: 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20 66  argv!=0 ){.    f
cfa0: 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b  or(i=1; argv[i];
cfb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
cfc0: 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53   dashdash || !IS
cfd0: 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a  OPT(argv[i]) ){.
cfe0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30          if( n==0
cff0: 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20   ) return i;.   
d000: 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20       n--;.      
d010: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  }.      if( strc
d020: 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29  mp(argv[i],"--")
d030: 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68 20 3d  ==0 ) dashdash =
d040: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
d050: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74  return -1;.}..st
d060: 61 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b 5d  atic char emsg[]
d070: 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e 65   = "Command line
d080: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20 22   syntax error: "
d090: 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  ;../*.** Process
d0a0: 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64 20   a flag command 
d0b0: 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  line argument..*
d0c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e  /.static int han
d0d0: 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 0a  dleflags(i,err).
d0e0: 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72  int i;.FILE *err
d0f0: 3b 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69  ;.{.  int v;.  i
d100: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
d110: 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d   int j;.  for(j=
d120: 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20  0; op[j].label; 
d130: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  j++){.    if( st
d140: 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31  rncmp(&argv[i][1
d150: 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65  ],op[j].label,le
d160: 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e  monStrlen(op[j].
d170: 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72 65  label))==0 ) bre
d180: 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72  ak;.  }.  v = ar
d190: 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20  gv[i][0]=='-' ? 
d1a0: 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b  1 : 0;.  if( op[
d1b0: 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20  j].label==0 ){. 
d1c0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
d1d0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
d1e0: 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74  "%sundefined opt
d1f0: 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ion.\n",emsg);. 
d200: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31       errline(i,1
d210: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
d220: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c   errcnt++;.  }el
d230: 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70  se if( op[j].typ
d240: 65 3d 3d 4f 50 54 5f 46 4c 41 47 20 29 7b 0a 20  e==OPT_FLAG ){. 
d250: 20 20 20 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d     *((int*)op[j]
d260: 2e 61 72 67 29 20 3d 20 76 3b 0a 20 20 7d 65 6c  .arg) = v;.  }el
d270: 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70  se if( op[j].typ
d280: 65 3d 3d 4f 50 54 5f 46 46 4c 41 47 20 29 7b 0a  e==OPT_FFLAG ){.
d290: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29      (*(void(*)()
d2a0: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29  )(op[j].arg))(v)
d2b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
d2c0: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53  [j].type==OPT_FS
d2d0: 54 52 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69  TR ){.    (*(voi
d2e0: 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72  d(*)())(op[j].ar
d2f0: 67 29 29 28 26 61 72 67 76 5b 69 5d 5b 32 5d 29  g))(&argv[i][2])
d300: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
d310: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
d320: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6d  fprintf(err,"%sm
d330: 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20  issing argument 
d340: 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d  on switch.\n",em
d350: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
d360: 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20  ne(i,1,err);.   
d370: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
d380: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
d390: 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rcnt;.}../*.** P
d3a0: 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64  rocess a command
d3b0: 20 6c 69 6e 65 20 73 77 69 74 63 68 20 77 68 69   line switch whi
d3c0: 63 68 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65  ch has an argume
d3d0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
d3e0: 74 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69  t handleswitch(i
d3f0: 2c 65 72 72 29 0a 69 6e 74 20 69 3b 0a 46 49 4c  ,err).int i;.FIL
d400: 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20  E *err;.{.  int 
d410: 6c 76 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65  lv = 0;.  double
d420: 20 64 76 20 3d 20 30 2e 30 3b 0a 20 20 63 68 61   dv = 0.0;.  cha
d430: 72 20 2a 73 76 20 3d 20 30 2c 20 2a 65 6e 64 3b  r *sv = 0, *end;
d440: 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 69  .  char *cp;.  i
d450: 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 65 72 72 63  nt j;.  int errc
d460: 6e 74 20 3d 20 30 3b 0a 20 20 63 70 20 3d 20 73  nt = 0;.  cp = s
d470: 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d  trchr(argv[i],'=
d480: 27 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 70  ');.  assert( cp
d490: 21 3d 30 20 29 3b 0a 20 20 2a 63 70 20 3d 20 30  !=0 );.  *cp = 0
d4a0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b  ;.  for(j=0; op[
d4b0: 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a  j].label; j++){.
d4c0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
d4d0: 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62  rgv[i],op[j].lab
d4e0: 65 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  el)==0 ) break;.
d4f0: 20 20 7d 0a 20 20 2a 63 70 20 3d 20 27 3d 27 3b    }.  *cp = '=';
d500: 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62  .  if( op[j].lab
d510: 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  el==0 ){.    if(
d520: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70   err ){.      fp
d530: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64  rintf(err,"%sund
d540: 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e  efined option.\n
d550: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65  ",emsg);.      e
d560: 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b  rrline(i,0,err);
d570: 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e  .    }.    errcn
d580: 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t++;.  }else{.  
d590: 20 20 63 70 2b 2b 3b 0a 20 20 20 20 73 77 69 74    cp++;.    swit
d5a0: 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29  ch( op[j].type )
d5b0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  {.      case OPT
d5c0: 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73  _FLAG:.      cas
d5d0: 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20  e OPT_FFLAG:.   
d5e0: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
d5f0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
d600: 66 28 65 72 72 2c 22 25 73 6f 70 74 69 6f 6e 20  f(err,"%soption 
d610: 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
d620: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
d630: 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e            errlin
d640: 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,0,err);.    
d650: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72      }.        er
d660: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
d670: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
d680: 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20  e OPT_DBL:.     
d690: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
d6a0: 20 20 20 20 20 20 20 20 64 76 20 3d 20 73 74 72          dv = str
d6b0: 74 6f 64 28 63 70 2c 26 65 6e 64 29 3b 0a 20 20  tod(cp,&end);.  
d6c0: 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29        if( *end )
d6d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
d6e0: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  err ){.         
d6f0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
d700: 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63  %sillegal charac
d710: 74 65 72 20 69 6e 20 66 6c 6f 61 74 69 6e 67 2d  ter in floating-
d720: 70 6f 69 6e 74 20 61 72 67 75 6d 65 6e 74 2e 5c  point argument.\
d730: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
d740: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
d750: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
d760: 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c  end)-(unsigned l
d770: 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72 29  ong)argv[i],err)
d780: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d790: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b          errcnt++
d7a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d7b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d7c0: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
d7d0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
d7e0: 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20 3d  NT:.        lv =
d7f0: 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64 2c   strtol(cp,&end,
d800: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
d810: 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  *end ){.        
d820: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
d830: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
d840: 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20  (err,"%sillegal 
d850: 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e 74  character in int
d860: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c 6e  eger argument.\n
d870: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  ",emsg);.       
d880: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28       errline(i,(
d890: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 65  (unsigned long)e
d8a0: 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f  nd)-(unsigned lo
d8b0: 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72 29 3b  ng)argv[i],err);
d8c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
d8d0: 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b         errcnt++;
d8e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d8f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d900: 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
d910: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54      case OPT_FST
d920: 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20 3d 20  R:.        sv = 
d930: 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  cp;.        brea
d940: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  k;.    }.    swi
d950: 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20  tch( op[j].type 
d960: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
d970: 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
d980: 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
d990: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d9a0: 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
d9b0: 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75 62 6c  .        *(doubl
d9c0: 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  e*)(op[j].arg) =
d9d0: 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65   dv;.        bre
d9e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
d9f0: 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
da00: 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f   (*(void(*)())(o
da10: 70 5b 6a 5d 2e 61 72 67 29 29 28 64 76 29 3b 0a  p[j].arg))(dv);.
da20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
da30: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
da40: 54 3a 0a 20 20 20 20 20 20 20 20 2a 28 69 6e 74  T:.        *(int
da50: 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20  *)(op[j].arg) = 
da60: 6c 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  lv;.        brea
da70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
da80: 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
da90: 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70  (*(void(*)())(op
daa0: 5b 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74 29 6c  [j].arg))((int)l
dab0: 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
dac0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
dad0: 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 20 20 2a  T_STR:.        *
dae0: 28 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e 61  (char**)(op[j].a
daf0: 72 67 29 20 3d 20 73 76 3b 0a 20 20 20 20 20 20  rg) = sv;.      
db00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
db10: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
db20: 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29        (*(void(*)
db30: 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28  ())(op[j].arg))(
db40: 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  sv);.        bre
db50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
db60: 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d  return errcnt;.}
db70: 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28 61 2c  ..int OptInit(a,
db80: 6f 2c 65 72 72 29 0a 63 68 61 72 20 2a 2a 61 3b  o,err).char **a;
db90: 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e  .struct s_option
dba0: 73 20 2a 6f 3b 0a 46 49 4c 45 20 2a 65 72 72 3b  s *o;.FILE *err;
dbb0: 0a 7b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20  .{.  int errcnt 
dbc0: 3d 20 30 3b 0a 20 20 61 72 67 76 20 3d 20 61 3b  = 0;.  argv = a;
dbd0: 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20 20 65 72 72  .  op = o;.  err
dbe0: 73 74 72 65 61 6d 20 3d 20 65 72 72 3b 0a 20 20  stream = err;.  
dbf0: 69 66 28 20 61 72 67 76 20 26 26 20 2a 61 72 67  if( argv && *arg
dc00: 76 20 26 26 20 6f 70 20 29 7b 0a 20 20 20 20 69  v && op ){.    i
dc10: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
dc20: 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  1; argv[i]; i++)
dc30: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72 67 76  {.      if( argv
dc40: 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c 7c 20 61  [i][0]=='+' || a
dc50: 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 29  rgv[i][0]=='-' )
dc60: 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  {.        errcnt
dc70: 20 2b 3d 20 68 61 6e 64 6c 65 66 6c 61 67 73 28   += handleflags(
dc80: 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 65  i,err);.      }e
dc90: 6c 73 65 20 69 66 28 20 73 74 72 63 68 72 28 61  lse if( strchr(a
dca0: 72 67 76 5b 69 5d 2c 27 3d 27 29 20 29 7b 0a 20  rgv[i],'=') ){. 
dcb0: 20 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b 3d         errcnt +=
dcc0: 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69 2c   handleswitch(i,
dcd0: 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  err);.      }.  
dce0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 72    }.  }.  if( er
dcf0: 72 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 66 70  rcnt>0 ){.    fp
dd00: 72 69 6e 74 66 28 65 72 72 2c 22 56 61 6c 69 64  rintf(err,"Valid
dd10: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70   command line op
dd20: 74 69 6f 6e 73 20 66 6f 72 20 5c 22 25 73 5c 22  tions for \"%s\"
dd30: 20 61 72 65 3a 5c 6e 22 2c 2a 61 29 3b 0a 20 20   are:\n",*a);.  
dd40: 20 20 4f 70 74 50 72 69 6e 74 28 29 3b 0a 20 20    OptPrint();.  
dd50: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
dd60: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e   return 0;.}..in
dd70: 74 20 4f 70 74 4e 41 72 67 73 28 29 7b 0a 20 20  t OptNArgs(){.  
dd80: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
dd90: 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
dda0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
ddb0: 61 72 67 76 21 3d 30 20 26 26 20 61 72 67 76 5b  argv!=0 && argv[
ddc0: 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  0]!=0 ){.    for
ddd0: 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69  (i=1; argv[i]; i
dde0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64  ++){.      if( d
ddf0: 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f 50  ashdash || !ISOP
de00: 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63 6e 74  T(argv[i]) ) cnt
de10: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ++;.      if( st
de20: 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d  rcmp(argv[i],"--
de30: 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68  ")==0 ) dashdash
de40: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
de50: 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d 0a    return cnt;.}.
de60: 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28 6e 29  .char *OptArg(n)
de70: 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20  .int n;.{.  int 
de80: 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65  i;.  i = arginde
de90: 78 28 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  x(n);.  return i
dea0: 3e 3d 30 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20  >=0 ? argv[i] : 
deb0: 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 45 72  0;.}..void OptEr
dec0: 72 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20  r(n).int n;.{.  
ded0: 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67  int i;.  i = arg
dee0: 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66 28 20  index(n);.  if( 
def0: 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65 28 69  i>=0 ) errline(i
df00: 2c 30 2c 65 72 72 73 74 72 65 61 6d 29 3b 0a 7d  ,0,errstream);.}
df10: 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e 74 28  ..void OptPrint(
df20: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
df30: 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61  t max, len;.  ma
df40: 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  x = 0;.  for(i=0
df50: 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69  ; op[i].label; i
df60: 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c  ++){.    len = l
df70: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d  emonStrlen(op[i]
df80: 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20  .label) + 1;.   
df90: 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74   switch( op[i].t
dfa0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
dfb0: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
dfc0: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
dfd0: 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  :.        break;
dfe0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
dff0: 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  INT:.      case 
e000: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
e010: 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20    len += 9;     
e020: 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22    /* length of "
e030: 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20  <integer>" */.  
e040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e050: 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
e060: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e070: 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65  FDBL:.        le
e080: 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a  n += 6;       /*
e090: 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61   length of "<rea
e0a0: 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  l>" */.        b
e0b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
e0c0: 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20   OPT_STR:.      
e0d0: 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20  case OPT_FSTR:. 
e0e0: 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b         len += 8;
e0f0: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
e100: 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a   of "<string>" *
e110: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
e120: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c  .    }.    if( l
e130: 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c  en>max ) max = l
e140: 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  en;.  }.  for(i=
e150: 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20  0; op[i].label; 
e160: 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68  i++){.    switch
e170: 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a  ( op[i].type ){.
e180: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e190: 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20  LAG:.      case 
e1a0: 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20  OPT_FFLAG:.     
e1b0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74     fprintf(errst
e1c0: 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25  ream,"  -%-*s  %
e1d0: 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c  s\n",max,op[i].l
e1e0: 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  abel,op[i].messa
e1f0: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
e200: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e210: 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61  PT_INT:.      ca
e220: 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20  se OPT_FINT:.   
e230: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
e240: 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e  stream,"  %s=<in
e250: 74 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22  teger>%*s  %s\n"
e260: 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20  ,op[i].label,.  
e270: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61          (int)(ma
e280: 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  x-lemonStrlen(op
e290: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22 22  [i].label)-9),""
e2a0: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
e2b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e2c0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
e2d0: 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  BL:.      case O
e2e0: 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
e2f0: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
e300: 61 6d 2c 22 20 20 25 73 3d 3c 72 65 61 6c 3e 25  am,"  %s=<real>%
e310: 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
e320: 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
e330: 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e   (int)(max-lemon
e340: 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62  Strlen(op[i].lab
e350: 65 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e  el)-6),"",op[i].
e360: 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
e370: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
e380: 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20  ase OPT_STR:.   
e390: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
e3a0: 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
e3b0: 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25  f(errstream,"  %
e3c0: 73 3d 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20 25  s=<string>%*s  %
e3d0: 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c  s\n",op[i].label
e3e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74  ,.          (int
e3f0: 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65  )(max-lemonStrle
e400: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38  n(op[i].label)-8
e410: 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  ),"",op[i].messa
e420: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
e430: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
e440: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
e450: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
e460: 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22  e file "parse.c"
e470: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
e480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
e490: 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20  *.** Input file 
e4a0: 70 61 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c  parser for the L
e4b0: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
e4c0: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68  rator..*/../* Th
e4d0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
e4e0: 61 72 73 65 72 20 2a 2f 0a 73 74 72 75 63 74 20  arser */.struct 
e4f0: 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72 20  pstate {.  char 
e500: 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  *filename;      
e510: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
e520: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
e530: 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  int tokenlineno;
e540: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d        /* Linenum
e550: 62 65 72 20 61 74 20 77 68 69 63 68 20 63 75 72  ber at which cur
e560: 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72 74  rent token start
e570: 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72  s */.  int error
e580: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  cnt;         /* 
e590: 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
e5a0: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61   so far */.  cha
e5b0: 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20 20  r *tokenstart;  
e5c0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63 75     /* Text of cu
e5d0: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20  rrent token */. 
e5e0: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67   struct lemon *g
e5f0: 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  p;     /* Global
e600: 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a 2f   state vector */
e610: 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65 20  .  enum e_state 
e620: 7b 0a 20 20 20 20 49 4e 49 54 49 41 4c 49 5a 45  {.    INITIALIZE
e630: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e640: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a  R_DECL_OR_RULE,.
e650: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
e660: 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20  DECL_KEYWORD,.  
e670: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
e680: 43 4c 5f 41 52 47 2c 0a 20 20 20 20 57 41 49 54  CL_ARG,.    WAIT
e690: 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
e6a0: 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57  CE_SYMBOL,.    W
e6b0: 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57  AITING_FOR_ARROW
e6c0: 2c 0a 20 20 20 20 49 4e 5f 52 48 53 2c 0a 20 20  ,.    IN_RHS,.  
e6d0: 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20    LHS_ALIAS_1,. 
e6e0: 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a     LHS_ALIAS_2,.
e6f0: 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c      LHS_ALIAS_3,
e700: 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 31  .    RHS_ALIAS_1
e710: 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f  ,.    RHS_ALIAS_
e720: 32 2c 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43  2,.    PRECEDENC
e730: 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 20 20 50 52  E_MARK_1,.    PR
e740: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c  ECEDENCE_MARK_2,
e750: 0a 20 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45  .    RESYNC_AFTE
e760: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20  R_RULE_ERROR,.  
e770: 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44    RESYNC_AFTER_D
e780: 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 20 20 57  ECL_ERROR,.    W
e790: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
e7a0: 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20  UCTOR_SYMBOL,.  
e7b0: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41    WAITING_FOR_DA
e7c0: 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20  TATYPE_SYMBOL,. 
e7d0: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46     WAITING_FOR_F
e7e0: 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 20 20  ALLBACK_ID,.    
e7f0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44  WAITING_FOR_WILD
e800: 43 41 52 44 5f 49 44 0a 20 20 7d 20 73 74 61 74  CARD_ID.  } stat
e810: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e820: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74       /* The stat
e830: 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  e of the parser 
e840: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
e850: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20 20  ol *fallback;   
e860: 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b 20  /* The fallback 
e870: 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63  token */.  struc
e880: 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20  t symbol *lhs;  
e890: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61        /* Left-ha
e8a0: 6e 64 20 73 69 64 65 20 6f 66 20 63 75 72 72 65  nd side of curre
e8b0: 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 68 61  nt rule */.  cha
e8c0: 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20  r *lhsalias;    
e8d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73          /* Alias
e8e0: 20 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f 0a   for the LHS */.
e8f0: 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20 20    int nrhs;     
e900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e910: 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74 2d  Number of right-
e920: 68 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f 6c  hand side symbol
e930: 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72 75  s seen */.  stru
e940: 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b 4d  ct symbol *rhs[M
e950: 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53 20  AXRHS];  /* RHS 
e960: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61  symbols */.  cha
e970: 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d  r *alias[MAXRHS]
e980: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73  ;       /* Alias
e990: 65 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20  es for each RHS 
e9a0: 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c 29  symbol (or NULL)
e9b0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
e9c0: 65 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20 20  e *prevrule;    
e9d0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75 6c   /* Previous rul
e9e0: 65 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63 68  e parsed */.  ch
e9f0: 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b  ar *declkeyword;
ea00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77           /* Keyw
ea10: 6f 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72 61  ord of a declara
ea20: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
ea30: 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20 20  *declargslot;   
ea40: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68       /* Where th
ea50: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 72  e declaration ar
ea60: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
ea70: 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 6e   put */.  int in
ea80: 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 3b 20 20  sertLineMacro;  
ea90: 20 20 20 20 20 2f 2a 20 41 64 64 20 23 6c 69 6e       /* Add #lin
eaa0: 65 20 62 65 66 6f 72 65 20 64 65 63 6c 61 72 61  e before declara
eab0: 74 69 6f 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20  tion insert */. 
eac0: 20 69 6e 74 20 2a 64 65 63 6c 6c 69 6e 65 6e 6f   int *decllineno
ead0: 73 6c 6f 74 3b 20 20 20 20 20 20 20 2f 2a 20 57  slot;       /* W
eae0: 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 64 65  here to write de
eaf0: 63 6c 61 72 61 74 69 6f 6e 20 6c 69 6e 65 20 6e  claration line n
eb00: 75 6d 62 65 72 20 2a 2f 0a 20 20 65 6e 75 6d 20  umber */.  enum 
eb10: 65 5f 61 73 73 6f 63 20 64 65 63 6c 61 73 73 6f  e_assoc declasso
eb20: 63 3b 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20  c;    /* Assign 
eb30: 74 68 69 73 20 61 73 73 6f 63 69 61 74 69 6f 6e  this association
eb40: 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e   to decl argumen
eb50: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63  ts */.  int prec
eb60: 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20  counter;        
eb70: 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69     /* Assign thi
eb80: 73 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20  s precedence to 
eb90: 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a  decl arguments *
eba0: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
ebb0: 2a 66 69 72 73 74 72 75 6c 65 3b 20 20 20 20 2f  *firstrule;    /
ebc0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72  * Pointer to fir
ebd0: 73 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  st rule in the g
ebe0: 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 73 74 72 75  rammar */.  stru
ebf0: 63 74 20 72 75 6c 65 20 2a 6c 61 73 74 72 75 6c  ct rule *lastrul
ec00: 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  e;     /* Pointe
ec10: 72 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  r to the most re
ec20: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 72 75  cently parsed ru
ec30: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72  le */.};../* Par
ec40: 73 65 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65  se a single toke
ec50: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
ec60: 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 70   parseonetoken(p
ec70: 73 70 29 0a 73 74 72 75 63 74 20 70 73 74 61 74  sp).struct pstat
ec80: 65 20 2a 70 73 70 3b 0a 7b 0a 20 20 63 68 61 72  e *psp;.{.  char
ec90: 20 2a 78 3b 0a 20 20 78 20 3d 20 53 74 72 73 61   *x;.  x = Strsa
eca0: 66 65 28 70 73 70 2d 3e 74 6f 6b 65 6e 73 74 61  fe(psp->tokensta
ecb0: 72 74 29 3b 20 20 20 20 20 2f 2a 20 53 61 76 65  rt);     /* Save
ecc0: 20 74 68 65 20 74 6f 6b 65 6e 20 70 65 72 6d 61   the token perma
ecd0: 6e 65 6e 74 6c 79 20 2a 2f 0a 23 69 66 20 30 0a  nently */.#if 0.
ece0: 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25 64 3a    printf("%s:%d:
ecf0: 20 54 6f 6b 65 6e 3d 5b 25 73 5d 20 73 74 61 74   Token=[%s] stat
ed00: 65 3d 25 64 5c 6e 22 2c 70 73 70 2d 3e 66 69 6c  e=%d\n",psp->fil
ed10: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
ed20: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 78 2c 70 73  lineno,.    x,ps
ed30: 70 2d 3e 73 74 61 74 65 29 3b 0a 23 65 6e 64 69  p->state);.#endi
ed40: 66 0a 20 20 73 77 69 74 63 68 28 20 70 73 70 2d  f.  switch( psp-
ed50: 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  >state ){.    ca
ed60: 73 65 20 49 4e 49 54 49 41 4c 49 5a 45 3a 0a 20  se INITIALIZE:. 
ed70: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
ed80: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73  le = 0;.      ps
ed90: 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 20 3d  p->preccounter =
eda0: 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 66   0;.      psp->f
edb0: 69 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e  irstrule = psp->
edc0: 6c 61 73 74 72 75 6c 65 20 3d 20 30 3b 0a 20 20  lastrule = 0;.  
edd0: 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75      psp->gp->nru
ede0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a  le = 0;.      /*
edf0: 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20 6e 65   Fall thru to ne
ee00: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 63  xt case */.    c
ee10: 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
ee20: 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3a 0a 20 20  DECL_OR_RULE:.  
ee30: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25      if( x[0]=='%
ee40: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
ee50: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
ee60: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f  G_FOR_DECL_KEYWO
ee70: 52 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  RD;.      }else 
ee80: 69 66 28 20 69 73 6c 6f 77 65 72 28 78 5b 30 5d  if( islower(x[0]
ee90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ) ){.        psp
eea0: 2d 3e 6c 68 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e  ->lhs = Symbol_n
eeb0: 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
eec0: 73 70 2d 3e 6e 72 68 73 20 3d 20 30 3b 0a 20 20  sp->nrhs = 0;.  
eed0: 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c        psp->lhsal
eee0: 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ias = 0;.       
eef0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
ef00: 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3b  ITING_FOR_ARROW;
ef10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ef20: 20 78 5b 30 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20   x[0]=='{' ){.  
ef30: 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 70        if( psp->p
ef40: 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20  revrule==0 ){.  
ef50: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
ef60: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
ef70: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
ef80: 0a 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72  ."There is no pr
ef90: 69 6f 72 20 72 75 6c 65 20 6f 70 6f 6e 20 77 68  ior rule opon wh
efa0: 69 63 68 20 74 6f 20 61 74 74 61 63 68 20 74 68  ich to attach th
efb0: 65 20 63 6f 64 65 20 5c 0a 66 72 61 67 6d 65 6e  e code \.fragmen
efc0: 74 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 6f  t which begins o
efd0: 6e 20 74 68 69 73 20 6c 69 6e 65 2e 22 29 3b 0a  n this line.");.
efe0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
eff0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73  rrorcnt++;..}els
f000: 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72  e if( psp->prevr
f010: 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a  ule->code!=0 ){.
f020: 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
f030: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f040: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f050: 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65 6e  o,."Code fragmen
f060: 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74  t beginning on t
f070: 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
f080: 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66  the first \.to f
f090: 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f  ollow the previo
f0a0: 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20  us rule.");.    
f0b0: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f0c0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
f0d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f0e0: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c  psp->prevrule->l
f0f0: 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e  ine = psp->token
f100: 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
f110: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
f120: 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 09  >code = &x[1];..
f130: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
f140: 28 20 78 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20  ( x[0]=='[' ){. 
f150: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f160: 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  e = PRECEDENCE_M
f170: 41 52 4b 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c  ARK_1;.      }el
f180: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
f190: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f1a0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f1b0: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
f1c0: 54 6f 6b 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f  Token \"%s\" sho
f1d0: 75 6c 64 20 62 65 20 65 69 74 68 65 72 20 5c 22  uld be either \"
f1e0: 25 25 5c 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72  %%\" or a nonter
f1f0: 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20  minal name.",.  
f200: 20 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20          x);.    
f210: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f220: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
f230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
f240: 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41  se PRECEDENCE_MA
f250: 52 4b 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20  RK_1:.      if( 
f260: 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29  !isupper(x[0]) )
f270: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f280: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f290: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f2a0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 68  o,.          "Th
f2b0: 65 20 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d  e precedence sym
f2c0: 62 6f 6c 20 6d 75 73 74 20 62 65 20 61 20 74 65  bol must be a te
f2d0: 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20  rminal.");.     
f2e0: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f2f0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
f300: 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
f310: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
f320: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f330: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f340: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
f350: 20 20 20 22 54 68 65 72 65 20 69 73 20 6e 6f 20     "There is no 
f360: 70 72 69 6f 72 20 72 75 6c 65 20 74 6f 20 61 73  prior rule to as
f370: 73 69 67 6e 20 70 72 65 63 65 64 65 6e 63 65 20  sign precedence 
f380: 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20  \"[%s]\".",x);. 
f390: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f3a0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65  rcnt++;.      }e
f3b0: 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65  lse if( psp->pre
f3c0: 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d  vrule->precsym!=
f3d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  0 ){.        Err
f3e0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f3f0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f400: 6e 65 6e 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63  neno,."Precedenc
f410: 65 20 6d 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c  e mark on this l
f420: 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66  ine is not the f
f430: 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77  irst \.to follow
f440: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 75   the previous ru
f450: 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  le.");.        p
f460: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f470: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f480: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
f490: 6c 65 2d 3e 70 72 65 63 73 79 6d 20 3d 20 53 79  le->precsym = Sy
f4a0: 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
f4b0: 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e     }.      psp->
f4c0: 73 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e  state = PRECEDEN
f4d0: 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20  CE_MARK_2;.     
f4e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
f4f0: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
f500: 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  _2:.      if( x[
f510: 30 5d 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  0]!=']' ){.     
f520: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f530: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f540: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f550: 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c        "Missing \
f560: 22 5d 5c 22 20 6f 6e 20 70 72 65 63 65 64 65 6e  "]\" on preceden
f570: 63 65 20 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20  ce mark.");.    
f580: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f590: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
f5a0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f5b0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
f5c0: 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20  _OR_RULE;.      
f5d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
f5e0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f  WAITING_FOR_ARRO
f5f0: 57 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  W:.      if( x[0
f600: 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d  ]==':' && x[1]==
f610: 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27  ':' && x[2]=='='
f620: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
f630: 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b  >state = IN_RHS;
f640: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f650: 20 78 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20   x[0]=='(' ){.  
f660: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f670: 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a   = LHS_ALIAS_1;.
f680: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f690: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f6a0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f6b0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f6c0: 20 20 20 20 20 20 20 20 22 45 78 70 65 63 74 65          "Expecte
f6d0: 64 20 74 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22  d to see a \":\"
f6e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c   following the L
f6f0: 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22  HS symbol \"%s\"
f700: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 73  .",.          ps
f710: 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
f720: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f730: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
f740: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
f750: 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
f760: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
f770: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
f780: 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a  ase LHS_ALIAS_1:
f790: 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c 70  .      if( isalp
f7a0: 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  ha(x[0]) ){.    
f7b0: 20 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61      psp->lhsalia
f7c0: 73 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70  s = x;.        p
f7d0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f  sp->state = LHS_
f7e0: 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d  ALIAS_2;.      }
f7f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
f800: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
f810: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f820: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
f830: 20 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20   "\"%s\" is not 
f840: 61 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f  a valid alias fo
f850: 72 20 74 68 65 20 4c 48 53 20 5c 22 25 73 5c 22  r the LHS \"%s\"
f860: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  \n",.          x
f870: 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  ,psp->lhs->name)
f880: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f890: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f8a0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f8b0: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
f8c0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
f8d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f8e0: 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53    case LHS_ALIAS
f8f0: 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  _2:.      if( x[
f900: 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20  0]==')' ){.     
f910: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f920: 4c 48 53 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20  LHS_ALIAS_3;.   
f930: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f940: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f950: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f960: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
f970: 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
f980: 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48  )\" following LH
f990: 53 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25  S alias name \"%
f9a0: 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c  s\".",psp->lhsal
f9b0: 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ias);.        ps
f9c0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f9d0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f9e0: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
f9f0: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
fa00: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
fa10: 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
fa20: 4c 49 41 53 5f 33 3a 0a 20 20 20 20 20 20 69 66  LIAS_3:.      if
fa30: 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78  ( x[0]==':' && x
fa40: 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d  [1]==':' && x[2]
fa50: 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='=' ){.       
fa60: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e   psp->state = IN
fa70: 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _RHS;.      }els
fa80: 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
fa90: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
faa0: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
fab0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d  no,.          "M
fac0: 69 73 73 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f  issing \"->\" fo
fad0: 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25 73 28 25 73  llowing: \"%s(%s
fae0: 29 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  )\".",.         
faf0: 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65    psp->lhs->name
fb00: 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  ,psp->lhsalias);
fb10: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
fb20: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
fb30: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
fb40: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
fb50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
fb60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fb70: 20 63 61 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20   case IN_RHS:.  
fb80: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
fb90: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ' ){.        str
fba0: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
fbb0: 20 20 20 20 20 20 72 70 20 3d 20 28 73 74 72 75        rp = (stru
fbc0: 63 74 20 72 75 6c 65 20 2a 29 63 61 6c 6c 6f 63  ct rule *)calloc
fbd0: 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
fbe0: 72 75 6c 65 29 20 2b 20 0a 20 20 20 20 20 20 20  rule) + .       
fbf0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72        sizeof(str
fc00: 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70  uct symbol*)*psp
fc10: 2d 3e 6e 72 68 73 20 2b 20 73 69 7a 65 6f 66 28  ->nrhs + sizeof(
fc20: 63 68 61 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73  char*)*psp->nrhs
fc30: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
fc40: 28 20 72 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( rp==0 ){.     
fc50: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
fc60: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
fc70: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
fc80: 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74            "Can't
fc90: 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68   allocate enough
fca0: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 69 73   memory for this
fcb0: 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   rule.");.      
fcc0: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
fcd0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
fce0: 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30  sp->prevrule = 0
fcf0: 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20  ;..}else{.      
fd00: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
fd10: 20 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e       rp->rulelin
fd20: 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  e = psp->tokenli
fd30: 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  neno;.          
fd40: 72 70 2d 3e 72 68 73 20 3d 20 28 73 74 72 75 63  rp->rhs = (struc
fd50: 74 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31  t symbol**)&rp[1
fd60: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  ];.          rp-
fd70: 3e 72 68 73 61 6c 69 61 73 20 3d 20 28 63 68 61  >rhsalias = (cha
fd80: 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70 73  r**)&(rp->rhs[ps
fd90: 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20 20  p->nrhs]);.     
fda0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
fdb0: 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  psp->nrhs; i++){
fdc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
fdd0: 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 72  >rhs[i] = psp->r
fde0: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
fdf0: 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
fe00: 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73 5b  i] = psp->alias[
fe10: 69 5d 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20  i];..  }.       
fe20: 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70     rp->lhs = psp
fe30: 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 20  ->lhs;.         
fe40: 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20   rp->lhsalias = 
fe50: 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20  psp->lhsalias;. 
fe60: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72 68           rp->nrh
fe70: 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20  s = psp->nrhs;. 
fe80: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f 64           rp->cod
fe90: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
fea0: 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 30   rp->precsym = 0
feb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
fec0: 69 6e 64 65 78 20 3d 20 70 73 70 2d 3e 67 70 2d  index = psp->gp-
fed0: 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20 20 20 20  >nrule++;.      
fee0: 20 20 20 20 72 70 2d 3e 6e 65 78 74 6c 68 73 20      rp->nextlhs 
fef0: 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b  = rp->lhs->rule;
ff00: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  .          rp->l
ff10: 68 73 2d 3e 72 75 6c 65 20 3d 20 72 70 3b 0a 20  hs->rule = rp;. 
ff20: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78           rp->nex
ff30: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
ff40: 20 69 66 28 20 70 73 70 2d 3e 66 69 72 73 74 72   if( psp->firstr
ff50: 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ule==0 ){.      
ff60: 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74        psp->first
ff70: 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74  rule = psp->last
ff80: 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d 65  rule = rp;..  }e
ff90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
ffa0: 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e   psp->lastrule->
ffb0: 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20  next = rp;.     
ffc0: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74         psp->last
ffd0: 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d 0a  rule = rp;..  }.
ffe0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
fff0: 72 65 76 72 75 6c 65 20 3d 20 72 70 3b 0a 09 7d  revrule = rp;..}
10000 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10010 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
10020 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
10030 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10040 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
10050 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
10060 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29  ->nrhs>=MAXRHS )
10070 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
10080 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
10090 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
100a0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
100b0 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f   "Too many symbo
100c0 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c  ls on RHS of rul
100d0 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c  e beginning at \
100e0 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  "%s\".",.       
100f0 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20       x);.       
10100 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10110 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
10120 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
10130 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
10140 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20  OR;..}else{.    
10150 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70        psp->rhs[p
10160 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53 79 6d 62  sp->nrhs] = Symb
10170 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
10180 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b       psp->alias[
10190 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 30 3b 0a  psp->nrhs] = 0;.
101a0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e            psp->n
101b0 72 68 73 2b 2b 3b 0a 09 7d 0a 20 20 20 20 20 20  rhs++;..}.      
101c0 7d 65 6c 73 65 20 69 66 28 20 28 78 5b 30 5d 3d  }else if( (x[0]=
101d0 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f  ='|' || x[0]=='/
101e0 27 29 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e  ') && psp->nrhs>
101f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  0 ){.        str
10200 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20  uct symbol *msp 
10210 3d 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e  = psp->rhs[psp->
10220 6e 72 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20  nrhs-1];.       
10230 20 69 66 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d   if( msp->type!=
10240 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
10250 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
10260 74 20 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70  t symbol *origsp
10270 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20   = msp;.        
10280 20 20 6d 73 70 20 3d 20 63 61 6c 6c 6f 63 28 31    msp = calloc(1
10290 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a  ,sizeof(*msp));.
102a0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
102b0 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (msp, 0, sizeof(
102c0 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20  *msp));.        
102d0 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55    msp->type = MU
102e0 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20  LTITERMINAL;.   
102f0 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62         msp->nsub
10300 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sym = 1;.       
10310 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d     msp->subsym =
10320 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66   calloc(1,sizeof
10330 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29  (struct symbol*)
10340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70  );.          msp
10350 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f 72  ->subsym[0] = or
10360 69 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20  igsp;.          
10370 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69 67  msp->name = orig
10380 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20  sp->name;.      
10390 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70      psp->rhs[psp
103a0 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70 3b  ->nrhs-1] = msp;
103b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
103c0 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b     msp->nsubsym+
103d0 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  +;.        msp->
103e0 73 75 62 73 79 6d 20 3d 20 72 65 61 6c 6c 6f 63  subsym = realloc
103f0 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 20 73 69  (msp->subsym, si
10400 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
10410 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79  ol*)*msp->nsubsy
10420 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  m);.        msp-
10430 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75  >subsym[msp->nsu
10440 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c  bsym-1] = Symbol
10450 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20  _new(&x[1]);.   
10460 20 20 20 20 20 69 66 28 20 69 73 6c 6f 77 65 72       if( islower
10470 28 78 5b 31 5d 29 20 7c 7c 20 69 73 6c 6f 77 65  (x[1]) || islowe
10480 72 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d  r(msp->subsym[0]
10490 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20  ->name[0]) ){.  
104a0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
104b0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
104c0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
104d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61  .            "Ca
104e0 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70  nnot form a comp
104f0 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ound containing 
10500 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29  a non-terminal")
10510 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10520 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
10540 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27  se if( x[0]=='('
10550 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
10560 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
10570 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41  state = RHS_ALIA
10580 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_1;.      }else
10590 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
105a0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
105b0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
105c0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
105d0 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
105e0 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20  on RHS of rule: 
105f0 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
10600 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
10610 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
10620 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
10630 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
10640 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
10650 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10660 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e RHS_ALIAS_1:. 
10670 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61       if( isalpha
10680 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
10690 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70    psp->alias[psp
106a0 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20  ->nrhs-1] = x;. 
106b0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
106c0 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b  e = RHS_ALIAS_2;
106d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
106e0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
106f0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10700 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
10710 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
10720 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
10730 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 48  alias for the RH
10740 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c  S symbol \"%s\"\
10750 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c  n",.          x,
10760 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
10770 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  hs-1]->name);.  
10780 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10790 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
107a0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
107b0 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
107c0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
107d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
107e0 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a  se RHS_ALIAS_2:.
107f0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
10800 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ')' ){.        p
10810 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
10820 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
10830 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
10840 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10850 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10860 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
10870 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
10880 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
10890 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
108a0 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
108b0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
108c0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
108d0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
108e0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
108f0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
10900 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10910 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
10920 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20  CL_KEYWORD:.    
10930 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b    if( isalpha(x[
10940 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
10950 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20  sp->declkeyword 
10960 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
10970 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10980 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
10990 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d  decllinenoslot =
109a0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
109b0 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
109c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73   = 1;.        ps
109d0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
109e0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
109f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
10a00 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30  cmp(x,"name")==0
10a10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10a20 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10a30 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65   &(psp->gp->name
10a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
10a50 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
10a60 6f 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 20 69 66  o = 0;..}else if
10a70 28 20 73 74 72 63 6d 70 28 78 2c 22 69 6e 63 6c  ( strcmp(x,"incl
10a80 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ude")==0 ){.    
10a90 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
10aa0 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
10ab0 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a 09 7d  gp->include);..}
10ac0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10ad0 78 2c 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a  x,"code")==0 ){.
10ae0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10af0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
10b00 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64  sp->gp->extracod
10b10 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  e);..}else if( s
10b20 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 64  trcmp(x,"token_d
10b30 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29  estructor")==0 )
10b40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10b50 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10b60 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65  psp->gp->tokende
10b70 73 74 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  st;..}else if( s
10b80 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75 6c 74  trcmp(x,"default
10b90 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  _destructor")==0
10ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10bb0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10bc0 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65   &psp->gp->varde
10bd0 73 74 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  st;..}else if( s
10be0 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 70  trcmp(x,"token_p
10bf0 72 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20  refix")==0 ){.  
10c00 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10c10 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d  largslot = &psp-
10c20 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  >gp->tokenprefix
10c30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10c40 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
10c50 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 20 69 66 28   = 0;..}else if(
10c60 20 73 74 72 63 6d 70 28 78 2c 22 73 79 6e 74 61   strcmp(x,"synta
10c70 78 5f 65 72 72 6f 72 22 29 3d 3d 30 20 29 7b 0a  x_error")==0 ){.
10c80 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10c90 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
10ca0 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 29 3b 0a  sp->gp->error);.
10cb0 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
10cc0 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70  p(x,"parse_accep
10cd0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
10ce0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10cf0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
10d00 2d 3e 61 63 63 65 70 74 29 3b 0a 09 7d 65 6c 73  ->accept);..}els
10d10 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10d20 70 61 72 73 65 5f 66 61 69 6c 75 72 65 22 29 3d  parse_failure")=
10d30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10d40 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10d50 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 66 61   = &(psp->gp->fa
10d60 69 6c 75 72 65 29 3b 0a 09 7d 65 6c 73 65 20 69  ilure);..}else i
10d70 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
10d80 63 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30  ck_overflow")==0
10d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10da0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10db0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72   &(psp->gp->over
10dc0 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  flow);.        }
10dd0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10de0 78 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e  x,"extra_argumen
10df0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
10e00 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10e10 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
10e20 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20  ->arg);.        
10e30 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e    psp->insertLin
10e40 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20  eMacro = 0;.    
10e50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
10e60 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79  rcmp(x,"token_ty
10e70 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
10e80 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10e90 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10ea0 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20  p->tokentype);. 
10eb0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
10ec0 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
10ed0 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
10ee0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64   if( strcmp(x,"d
10ef0 65 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30  efault_type")==0
10f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10f10 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10f20 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74   &(psp->gp->vart
10f30 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ype);.          
10f40 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
10f50 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
10f60 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10f70 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65  mp(x,"stack_size
10f80 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10f90 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10fa0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
10fb0 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20  >stacksize);.   
10fc0 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
10fd0 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
10fe0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10ff0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
11000 72 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29  rt_symbol")==0 )
11010 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11020 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
11030 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29  (psp->gp->start)
11040 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11050 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
11060 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
11070 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11080 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"left")==0 ){. 
11090 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
110a0 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  eccounter++;.   
110b0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
110c0 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20  assoc = LEFT;.  
110d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
110e0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
110f0 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
11100 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
11110 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11120 72 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20  right")==0 ){.  
11130 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
11140 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
11150 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11160 73 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20  ssoc = RIGHT;.  
11170 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11180 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11190 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
111a0 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
111b0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
111c0 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b  nonassoc")==0 ){
111d0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
111e0 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  preccounter++;. 
111f0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11200 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a  classoc = NONE;.
11210 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
11220 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11230 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
11240 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28  MBOL;..}else if(
11250 20 73 74 72 63 6d 70 28 78 2c 22 64 65 73 74 72   strcmp(x,"destr
11260 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20  uctor")==0 ){.  
11270 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11280 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11290 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42  _DESTRUCTOR_SYMB
112a0 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  OL;..}else if( s
112b0 74 72 63 6d 70 28 78 2c 22 74 79 70 65 22 29 3d  trcmp(x,"type")=
112c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
112d0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
112e0 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50  TING_FOR_DATATYP
112f0 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  E_SYMBOL;.      
11300 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11310 6d 70 28 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29  mp(x,"fallback")
11320 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11330 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d   psp->fallback =
11340 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73   0;.          ps
11350 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11360 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f  NG_FOR_FALLBACK_
11370 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
11380 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11390 77 69 6c 64 63 61 72 64 22 29 3d 3d 30 20 29 7b  wildcard")==0 ){
113a0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
113b0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
113c0 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b  FOR_WILDCARD_ID;
113d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
113e0 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
113f0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11400 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11410 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  o,.            "
11420 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74  Unknown declarat
11430 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25  ion keyword: \"%
11440 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20  %%s\".",x);.    
11450 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
11460 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
11470 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11480 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
11490 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 20 20  ERROR;..}.      
114a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
114b0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
114c0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
114d0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
114e0 20 20 22 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61    "Illegal decla
114f0 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
11500 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
11510 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11520 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11530 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11540 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
11550 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
11560 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11570 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
11580 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a  STRUCTOR_SYMBOL:
11590 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 61 6c  .      if( !isal
115a0 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
115b0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
115c0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
115d0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
115e0 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20          "Symbol 
115f0 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74  name missing aft
11600 65 72 20 25 64 65 73 74 72 75 63 74 6f 72 20 6b  er %destructor k
11610 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20  eyword");.      
11620 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11630 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
11640 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
11650 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
11660 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11670 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
11680 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c  bol *sp = Symbol
11690 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
116a0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
116b0 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63  t = &sp->destruc
116c0 74 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 73 70  tor;.        psp
116d0 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
116e0 20 3d 20 26 73 70 2d 3e 64 65 73 74 4c 69 6e 65   = &sp->destLine
116f0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  no;.        psp-
11700 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
11710 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73   = 1;.        ps
11720 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11730 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
11740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
11750 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
11760 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54  AITING_FOR_DATAT
11770 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20  YPE_SYMBOL:.    
11780 20 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 78    if( !isalpha(x
11790 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
117a0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
117b0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
117c0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
117d0 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20     "Symbol name 
117e0 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 64  missing after %d
117f0 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72  estructor keywor
11800 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  d");.        psp
11810 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11820 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11830 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
11840 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
11850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11860 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
11870 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
11880 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
11890 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
118a0 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20  sp->datatype;.  
118b0 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
118c0 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
118d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
118e0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
118f0 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20  _DECL_ARG;.     
11900 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11910 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
11920 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
11930 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
11940 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
11950 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11960 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11970 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
11980 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
11990 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  upper(x[0]) ){. 
119a0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
119b0 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20  mbol *sp;.      
119c0 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65    sp = Symbol_ne
119d0 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  w(x);.        if
119e0 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
119f0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
11a00 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11a10 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11a20 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11a30 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68  "Symbol \"%s\" h
11a40 61 73 20 61 6c 72 65 61 64 79 20 62 65 20 67 69  as already be gi
11a50 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ven a precedence
11a60 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20  .",x);.         
11a70 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11a80 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20  ;..}else{.      
11a90 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 70      sp->prec = p
11aa0 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b  sp->preccounter;
11ab0 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 61  .          sp->a
11ac0 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c  ssoc = psp->decl
11ad0 61 73 73 6f 63 3b 0a 09 7d 0a 20 20 20 20 20 20  assoc;..}.      
11ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
11af0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
11b00 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
11b10 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
11b20 20 20 22 43 61 6e 27 74 20 61 73 73 69 67 6e 20    "Can't assign 
11b30 61 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20  a precedence to 
11b40 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
11b50 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11b60 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
11b70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
11b80 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
11b90 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20 20  DECL_ARG:.      
11ba0 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 7c 7c  if( x[0]=='{' ||
11bb0 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 69   x[0]=='\"' || i
11bc0 73 61 6c 6e 75 6d 28 78 5b 30 5d 29 20 29 7b 0a  salnum(x[0]) ){.
11bd0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4f          char *zO
11be0 6c 64 2c 20 2a 7a 4e 65 77 2c 20 2a 7a 42 75 66  ld, *zNew, *zBuf
11bf0 2c 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e  , *z;.        in
11c00 74 20 6e 4f 6c 64 2c 20 6e 2c 20 6e 4c 69 6e 65  t nOld, n, nLine
11c10 2c 20 6e 4e 65 77 2c 20 6e 42 61 63 6b 3b 0a 20  , nNew, nBack;. 
11c20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 4c 69         int addLi
11c30 6e 65 4d 61 63 72 6f 3b 0a 20 20 20 20 20 20 20  neMacro;.       
11c40 20 63 68 61 72 20 7a 4c 69 6e 65 5b 35 30 5d 3b   char zLine[50];
11c50 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 20 3d 20  .        zNew = 
11c60 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  x;.        if( z
11c70 4e 65 77 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a  New[0]=='"' || z
11c80 4e 65 77 5b 30 5d 3d 3d 27 7b 27 20 29 20 7a 4e  New[0]=='{' ) zN
11c90 65 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 4e  ew++;.        nN
11ca0 65 77 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  ew = lemonStrlen
11cb0 28 7a 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (zNew);.        
11cc0 69 66 28 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72  if( *psp->declar
11cd0 67 73 6c 6f 74 20 29 7b 0a 20 20 20 20 20 20 20  gslot ){.       
11ce0 20 20 20 7a 4f 6c 64 20 3d 20 2a 70 73 70 2d 3e     zOld = *psp->
11cf0 64 65 63 6c 61 72 67 73 6c 6f 74 3b 0a 20 20 20  declargslot;.   
11d00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11d10 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 22 22 3b        zOld = "";
11d20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11d30 20 20 20 6e 4f 6c 64 20 3d 20 6c 65 6d 6f 6e 53     nOld = lemonS
11d40 74 72 6c 65 6e 28 7a 4f 6c 64 29 3b 0a 20 20 20  trlen(zOld);.   
11d50 20 20 20 20 20 6e 20 3d 20 6e 4f 6c 64 20 2b 20       n = nOld + 
11d60 6e 4e 65 77 20 2b 20 32 30 3b 0a 20 20 20 20 20  nNew + 20;.     
11d70 20 20 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20     addLineMacro 
11d80 3d 20 21 70 73 70 2d 3e 67 70 2d 3e 6e 6f 6c 69  = !psp->gp->noli
11d90 6e 65 6e 6f 73 66 6c 61 67 20 26 26 20 70 73 70  nenosflag && psp
11da0 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
11db0 6f 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  o &&.           
11dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 73               (ps
11dd0 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
11de0 74 3d 3d 30 20 7c 7c 20 70 73 70 2d 3e 64 65 63  t==0 || psp->dec
11df0 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 21 3d  llinenoslot[0]!=
11e00 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
11e10 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a  addLineMacro ){.
11e20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d            for(z=
11e30 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 6e  psp->filename, n
11e40 42 61 63 6b 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29  Back=0; *z; z++)
11e50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
11e60 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 20 6e 42 61  ( *z=='\\' ) nBa
11e70 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ck++;.          
11e80 7d 0a 20 20 20 20 20 20 20 20 20 20 73 70 72 69  }.          spri
11e90 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 23 6c 69 6e  ntf(zLine, "#lin
11ea0 65 20 25 64 20 22 2c 20 70 73 70 2d 3e 74 6f 6b  e %d ", psp->tok
11eb0 65 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  enlineno);.     
11ec0 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20 6c 65 6d       nLine = lem
11ed0 6f 6e 53 74 72 6c 65 6e 28 7a 4c 69 6e 65 29 3b  onStrlen(zLine);
11ee0 0a 20 20 20 20 20 20 20 20 20 20 6e 20 2b 3d 20  .          n += 
11ef0 6e 4c 69 6e 65 20 2b 20 6c 65 6d 6f 6e 53 74 72  nLine + lemonStr
11f00 6c 65 6e 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  len(psp->filenam
11f10 65 29 20 2b 20 6e 42 61 63 6b 3b 0a 20 20 20 20  e) + nBack;.    
11f20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
11f30 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
11f40 3d 20 7a 42 75 66 20 3d 20 72 65 61 6c 6c 6f 63  = zBuf = realloc
11f50 28 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c  (*psp->declargsl
11f60 6f 74 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  ot, n);.        
11f70 7a 42 75 66 20 2b 3d 20 6e 4f 6c 64 3b 0a 20 20  zBuf += nOld;.  
11f80 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e        if( addLin
11f90 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20  eMacro ){.      
11fa0 20 20 20 20 69 66 28 20 6e 4f 6c 64 20 26 26 20      if( nOld && 
11fb0 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29  zBuf[-1]!='\n' )
11fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  {.            *(
11fd0 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a  zBuf++) = '\n';.
11fe0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11ff0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
12000 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  f, zLine, nLine)
12010 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 42 75 66  ;.          zBuf
12020 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20 20 20 20   += nLine;.     
12030 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
12040 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '"';.          
12050 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e  for(z=psp->filen
12060 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ame; *z; z++){. 
12070 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a             if( *
12080 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  z=='\\' ){.     
12090 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
120a0 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20  +) = '\\';.     
120b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
120c0 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
120d0 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   *z;.          }
120e0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75  .          *(zBu
120f0 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20  f++) = '"';.    
12100 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
12110 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
12120 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  }.        if( ps
12130 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
12140 74 20 26 26 20 70 73 70 2d 3e 64 65 63 6c 6c 69  t && psp->declli
12150 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29  nenoslot[0]==0 )
12160 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12170 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
12180 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  0] = psp->tokenl
12190 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  ineno;.        }
121a0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
121b0 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77  zBuf, zNew, nNew
121c0 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20  );.        zBuf 
121d0 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20  += nNew;.       
121e0 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 20 20   *zBuf = 0;.    
121f0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12200 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
12210 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
12220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12230 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12240 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12250 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12260 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72 67 75     "Illegal argu
12270 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20 25 73  ment to %%%s: %s
12280 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f  ",psp->declkeywo
12290 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  rd,x);.        p
122a0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
122b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
122c0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
122d0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
122e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
122f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
12300 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b  ING_FOR_FALLBACK
12310 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78  _ID:.      if( x
12320 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
12330 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12340 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
12350 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
12360 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 75 70   }else if( !isup
12370 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  per(x[0]) ){.   
12380 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12390 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
123a0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
123b0 20 20 20 20 20 20 20 20 20 22 25 25 66 61 6c 6c           "%%fall
123c0 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 5c 22  back argument \"
123d0 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
123e0 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
123f0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12400 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
12410 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
12420 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
12430 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
12440 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66        if( psp->f
12450 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  allback==0 ){.  
12460 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
12470 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20 20 20  lback = sp;.    
12480 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
12490 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ->fallback ){.  
124a0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
124b0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
124c0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
124d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4d  ,.            "M
124e0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 61 6c  ore than one fal
124f0 6c 62 61 63 6b 20 61 73 73 69 67 6e 65 64 20 74  lback assigned t
12500 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78 29 3b  o token %s", x);
12510 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12520 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12540 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63       sp->fallbac
12550 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  k = psp->fallbac
12560 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  k;.          psp
12570 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  ->gp->has_fallba
12580 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ck = 1;.        
12590 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
125a0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
125b0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44  WAITING_FOR_WILD
125c0 43 41 52 44 5f 49 44 3a 0a 20 20 20 20 20 20 69  CARD_ID:.      i
125d0 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
125e0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
125f0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
12600 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
12610 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
12620 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b  isupper(x[0]) ){
12630 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
12640 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
12650 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
12660 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25  o,.          "%%
12670 77 69 6c 64 63 61 72 64 20 61 72 67 75 6d 65 6e  wildcard argumen
12680 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20  t \"%s\" should 
12690 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b  be a token", x);
126a0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
126b0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
126c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
126d0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
126e0 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
126f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  ;.        if( ps
12700 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72 64 3d  p->gp->wildcard=
12710 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12720 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72  psp->gp->wildcar
12730 64 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20  d = sp;.        
12740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12750 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12760 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
12770 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12780 20 20 20 20 20 20 20 22 45 78 74 72 61 20 77 69         "Extra wi
12790 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b 65 6e 3a  ldcard to token:
127a0 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20   %s", x);.      
127b0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
127c0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
127d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
127e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53  ak;.    case RES
127f0 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
12800 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66  RROR:./*      if
12810 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73  ( x[0]=='.' ) ps
12820 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
12830 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
12840 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65  ULE;.**      bre
12850 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ak; */.    case 
12860 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
12870 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69  L_ERROR:.      i
12880 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70  f( x[0]=='.' ) p
12890 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
128a0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
128b0 52 55 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20  RULE;.      if( 
128c0 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d  x[0]=='%' ) psp-
128d0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
128e0 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
128f0 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  D;.      break;.
12900 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68    }.}../* Run th
12910 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f  e preprocessor o
12920 76 65 72 20 74 68 65 20 69 6e 70 75 74 20 66 69  ver the input fi
12930 6c 65 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c  le text.  The gl
12940 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a  obal variables.*
12950 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68  * azDefine[0] th
12960 72 6f 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e  rough azDefine[n
12970 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69  Define-1] contai
12980 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
12990 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d  all defined.** m
129a0 61 63 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75  acros.  This rou
129b0 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22  tine looks for "
129c0 25 69 66 64 65 66 22 20 61 6e 64 20 22 25 69 66  %ifdef" and "%if
129d0 6e 64 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69  ndef" and "%endi
129e0 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e  f" and.** commen
129f0 74 73 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65  ts them out.  Te
12a00 78 74 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73  xt in between is
12a10 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20   also commented 
12a20 6f 75 74 20 61 73 20 61 70 70 72 6f 70 72 69 61  out as appropria
12a30 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
12a40 69 64 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e  id preprocess_in
12a50 70 75 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  put(char *z){.  
12a60 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a  int i, j, k, n;.
12a70 20 20 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20    int exclude = 
12a80 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  0;.  int start =
12a90 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f   0;.  int lineno
12aa0 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72   = 1;.  int star
12ab0 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20  t_lineno = 1;.  
12ac0 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
12ad0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
12ae0 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  ]=='\n' ) lineno
12af0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  ++;.    if( z[i]
12b00 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26  !='%' || (i>0 &&
12b10 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29   z[i-1]!='\n') )
12b20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
12b30 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d  f( strncmp(&z[i]
12b40 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20  ,"%endif",6)==0 
12b50 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 36  && isspace(z[i+6
12b60 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ]) ){.      if( 
12b70 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20  exclude ){.     
12b80 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20     exclude--;.  
12b90 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
12ba0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
12bb0 20 20 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a    for(j=start; j
12bc0 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a  <i; j++) if( z[j
12bd0 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d  ]!='\n' ) z[j] =
12be0 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
12bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
12c00 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a  r(j=i; z[j] && z
12c10 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20  [j]!='\n'; j++) 
12c20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  z[j] = ' ';.    
12c30 7d 65 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63  }else if( (strnc
12c40 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66  mp(&z[i],"%ifdef
12c50 22 2c 36 29 3d 3d 30 20 26 26 20 69 73 73 70 61  ",6)==0 && isspa
12c60 63 65 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20  ce(z[i+6])).    
12c70 20 20 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d        || (strncm
12c80 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66  p(&z[i],"%ifndef
12c90 22 2c 37 29 3d 3d 30 20 26 26 20 69 73 73 70 61  ",7)==0 && isspa
12ca0 63 65 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20  ce(z[i+7])) ){. 
12cb0 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65       if( exclude
12cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c   ){.        excl
12cd0 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ude++;.      }el
12ce0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
12cf0 6a 3d 69 2b 37 3b 20 69 73 73 70 61 63 65 28 7a  j=i+7; isspace(z
12d00 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  [j]); j++){}.   
12d10 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b       for(n=0; z[
12d20 6a 2b 6e 5d 20 26 26 20 21 69 73 73 70 61 63 65  j+n] && !isspace
12d30 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d  (z[j+n]); n++){}
12d40 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65  .        exclude
12d50 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 1;.        fo
12d60 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65  r(k=0; k<nDefine
12d70 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
12d80 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a    if( strncmp(az
12d90 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c  Define[k],&z[j],
12da0 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74  n)==0 && lemonSt
12db0 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d  rlen(azDefine[k]
12dc0 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  )==n ){.        
12dd0 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b      exclude = 0;
12de0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
12df0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
12e00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12e10 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e    if( z[i+3]=='n
12e20 27 20 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65  ' ) exclude = !e
12e30 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20  xclude;.        
12e40 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20  if( exclude ){. 
12e50 20 20 20 20 20 20 20 20 20 73 74 61 72 74 20 3d           start =
12e60 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   i;.          st
12e70 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e  art_lineno = lin
12e80 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eno;.        }. 
12e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
12ea0 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b  (j=i; z[j] && z[
12eb0 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a  j]!='\n'; j++) z
12ec0 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d  [j] = ' ';.    }
12ed0 0a 20 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75  .  }.  if( exclu
12ee0 64 65 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  de ){.    fprint
12ef0 66 28 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d  f(stderr,"unterm
12f00 69 6e 61 74 65 64 20 25 25 69 66 64 65 66 20 73  inated %%ifdef s
12f10 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20  tarting on line 
12f20 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e  %d\n", start_lin
12f30 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31  eno);.    exit(1
12f40 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20  );.  }.}../* In 
12f50 73 70 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d  spite of its nam
12f60 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
12f70 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
12f80 6e 6e 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a  nner.  It read.*
12f90 2a 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  * in the entire 
12fa0 69 6e 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20  input file (all 
12fb0 61 74 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f  at once) then to
12fc0 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63  kenizes it.  Eac
12fd0 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61  h.** token is pa
12fe0 73 73 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63  ssed to the func
12ff0 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f  tion "parseoneto
13000 6b 65 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64  ken" which build
13010 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70  s all.** the app
13020 72 6f 70 72 69 61 74 65 20 64 61 74 61 20 73 74  ropriate data st
13030 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
13040 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63  global state vec
13050 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69  tor "gp"..*/.voi
13060 64 20 50 61 72 73 65 28 67 70 29 0a 73 74 72 75  d Parse(gp).stru
13070 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 0a 7b 0a  ct lemon *gp;.{.
13080 20 20 73 74 72 75 63 74 20 70 73 74 61 74 65 20    struct pstate 
13090 70 73 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a  ps;.  FILE *fp;.
130a0 20 20 63 68 61 72 20 2a 66 69 6c 65 62 75 66 3b    char *filebuf;
130b0 0a 20 20 69 6e 74 20 66 69 6c 65 73 69 7a 65 3b  .  int filesize;
130c0 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20  .  int lineno;. 
130d0 20 69 6e 74 20 63 3b 0a 20 20 63 68 61 72 20 2a   int c;.  char *
130e0 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a 20 20 69  cp, *nextcp;.  i
130f0 6e 74 20 73 74 61 72 74 6c 69 6e 65 20 3d 20 30  nt startline = 0
13100 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 70 73 2c  ;..  memset(&ps,
13110 20 27 5c 30 27 2c 20 73 69 7a 65 6f 66 28 70 73   '\0', sizeof(ps
13120 29 29 3b 0a 20 20 70 73 2e 67 70 20 3d 20 67 70  ));.  ps.gp = gp
13130 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61 6d 65 20  ;.  ps.filename 
13140 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 0a  = gp->filename;.
13150 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 20 3d 20    ps.errorcnt = 
13160 30 3b 0a 20 20 70 73 2e 73 74 61 74 65 20 3d 20  0;.  ps.state = 
13170 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a 20 20 2f  INITIALIZE;..  /
13180 2a 20 42 65 67 69 6e 20 62 79 20 72 65 61 64 69  * Begin by readi
13190 6e 67 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  ng the input fil
131a0 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66 6f 70 65  e */.  fp = fope
131b0 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 22 72  n(ps.filename,"r
131c0 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30  b");.  if( fp==0
131d0 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
131e0 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22  (ps.filename,0,"
131f0 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 69 73 20  Can't open this 
13200 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67  file for reading
13210 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  .");.    gp->err
13220 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
13230 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b  urn;.  }.  fseek
13240 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66 69 6c 65  (fp,0,2);.  file
13250 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28 66 70 29  size = ftell(fp)
13260 3b 0a 20 20 72 65 77 69 6e 64 28 66 70 29 3b 0a  ;.  rewind(fp);.
13270 20 20 66 69 6c 65 62 75 66 20 3d 20 28 63 68 61    filebuf = (cha
13280 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66 69 6c 65  r *)malloc( file
13290 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69 66 28 20  size+1 );.  if( 
132a0 66 69 6c 65 62 75 66 3d 3d 30 20 29 7b 0a 20 20  filebuf==0 ){.  
132b0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
132c0 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20  lename,0,"Can't 
132d0 61 6c 6c 6f 63 61 74 65 20 25 64 20 6f 66 20 6d  allocate %d of m
132e0 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
132f0 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20  is file.",.     
13300 20 66 69 6c 65 73 69 7a 65 2b 31 29 3b 0a 20 20   filesize+1);.  
13310 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b    gp->errorcnt++
13320 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
13330 7d 0a 20 20 69 66 28 20 66 72 65 61 64 28 66 69  }.  if( fread(fi
13340 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73 69 7a 65  lebuf,1,filesize
13350 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a 65 20 29  ,fp)!=filesize )
13360 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70  {.    ErrorMsg(p
13370 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61  s.filename,0,"Ca
13380 6e 27 74 20 72 65 61 64 20 69 6e 20 61 6c 6c 20  n't read in all 
13390 25 64 20 62 79 74 65 73 20 6f 66 20 74 68 69 73  %d bytes of this
133a0 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66   file.",.      f
133b0 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20 66 72  ilesize);.    fr
133c0 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20 20 20  ee(filebuf);.   
133d0 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b   gp->errorcnt++;
133e0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
133f0 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20  .  fclose(fp);. 
13400 20 66 69 6c 65 62 75 66 5b 66 69 6c 65 73 69 7a   filebuf[filesiz
13410 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61  e] = 0;..  /* Ma
13420 6b 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 70 61  ke an initial pa
13430 73 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 66  ss through the f
13440 69 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 25 69  ile to handle %i
13450 66 64 65 66 20 61 6e 64 20 25 69 66 6e 64 65 66  fdef and %ifndef
13460 20 2a 2f 0a 20 20 70 72 65 70 72 6f 63 65 73 73   */.  preprocess
13470 5f 69 6e 70 75 74 28 66 69 6c 65 62 75 66 29 3b  _input(filebuf);
13480 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20  ..  /* Now scan 
13490 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
134a0 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
134b0 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f  lineno = 1;.  fo
134c0 72 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63  r(cp=filebuf; (c
134d0 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20  = *cp)!=0; ){.  
134e0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
134f0 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20  lineno++;       
13500 20 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74         /* Keep t
13510 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65  rack of the line
13520 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69   number */.    i
13530 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29 7b  f( isspace(c) ){
13540 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b   cp++; continue;
13550 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20   }  /* Skip all 
13560 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20  white space */. 
13570 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26     if( c=='/' &&
13580 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20   cp[1]=='/' ){  
13590 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
135a0 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  C++ style commen
135b0 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d  ts */.      cp+=
135c0 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
135d0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63  (c= *cp)!=0 && c
135e0 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20  !='\n' ) cp++;. 
135f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
13600 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d     }.    if( c==
13610 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a  '/' && cp[1]=='*
13620 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ' ){          /*
13630 20 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f   Skip C style co
13640 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  mments */.      
13650 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69  cp+=2;.      whi
13660 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
13670 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70  && (c!='/' || cp
13680 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20  [-1]!='*') ){.  
13690 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
136a0 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
136b0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
136c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20    }.      if( c 
136d0 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f  ) cp++;.      co
136e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
136f0 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20    ps.tokenstart 
13700 3d 20 63 70 3b 20 20 20 20 20 20 20 20 20 20 20  = cp;           
13710 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65       /* Mark the
13720 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
13730 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70  e token */.    p
13740 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20  s.tokenlineno = 
13750 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20  lineno;         
13760 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20    /* Linenumber 
13770 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62  on which token b
13780 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28  egins */.    if(
13790 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20   c=='\"' ){     
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137b0 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61  /* String litera
137c0 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b  ls */.      cp++
137d0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
137e0 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
137f0 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\"' ){.       
13800 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
13810 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
13820 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20   cp++;.      }. 
13830 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
13840 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
13850 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74  g(ps.filename,st
13860 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67  artline,."String
13870 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69   starting on thi
13880 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65  s line is not te
13890 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20  rminated before 
138a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
138b0 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ile.");.        
138c0 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  ps.errorcnt++;. 
138d0 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20         nextcp = 
138e0 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  cp;.      }else{
138f0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
13900 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  = cp+1;.      }.
13910 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
13920 3d 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20  ='{' ){         
13930 20 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b        /* A block
13940 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20   of C code */.  
13950 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20      int level;. 
13960 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
13970 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63   for(level=1; (c
13980 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65  = *cp)!=0 && (le
13990 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29  vel>1 || c!='}')
139a0 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; cp++){.       
139b0 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
139c0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
139d0 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27   else if( c=='{'
139e0 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20   ) level++;.    
139f0 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
13a00 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20  '}' ) level--;. 
13a10 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
13a20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d  c=='/' && cp[1]=
13a30 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70  ='*' ){  /* Skip
13a40 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   comments */.   
13a50 20 20 20 20 20 20 20 69 6e 74 20 70 72 65 76 63         int prevc
13a60 3b 0a 20 20 20 20 20 20 20 20 20 20 63 70 20 3d  ;.          cp =
13a70 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20   &cp[2];.       
13a80 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20     prevc = 0;.  
13a90 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
13aa0 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63  c= *cp)!=0 && (c
13ab0 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d  !='/' || prevc!=
13ac0 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '*') ){.        
13ad0 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
13ae0 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
13af0 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
13b00 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  c;.            c
13b10 70 2b 2b 3b 0a 09 20 20 7d 0a 09 7d 65 6c 73 65  p++;..  }..}else
13b20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
13b30 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a  p[1]=='/' ){  /*
13b40 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20   Skip C++ style 
13b50 63 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a  comments too */.
13b60 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26            cp = &
13b70 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20  cp[2];.         
13b80 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
13b90 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29  !=0 && c!='\n' )
13ba0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20   cp++;.         
13bb0 20 69 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b   if( c ) lineno+
13bc0 2b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d  +;..}else if( c=
13bd0 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 5c 22 27  ='\'' || c=='\"'
13be0 20 29 7b 20 20 20 20 2f 2a 20 53 74 72 69 6e 67   ){    /* String
13bf0 20 61 20 63 68 61 72 61 63 74 65 72 20 6c 69 74   a character lit
13c00 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20  erals */.       
13c10 20 20 20 69 6e 74 20 73 74 61 72 74 63 68 61 72     int startchar
13c20 2c 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20  , prevc;.       
13c30 20 20 20 73 74 61 72 74 63 68 61 72 20 3d 20 63     startchar = c
13c40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76  ;.          prev
13c50 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
13c60 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63 3d 20 2a   for(cp++; (c= *
13c70 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 73 74  cp)!=0 && (c!=st
13c80 61 72 74 63 68 61 72 20 7c 7c 20 70 72 65 76 63  artchar || prevc
13c90 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b 29 7b 0a  =='\\'); cp++){.
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
13cb0 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
13cc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
13cd0 69 66 28 20 70 72 65 76 63 3d 3d 27 5c 5c 27 20  if( prevc=='\\' 
13ce0 29 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20  ) prevc = 0;.   
13cf0 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 20 20           else   
13d00 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63             prevc
13d10 20 3d 20 63 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20   = c;..  }..}.  
13d20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13d30 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
13d40 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
13d50 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69 6e  name,ps.tokenlin
13d60 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74 61  eno,."C code sta
13d70 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69  rting on this li
13d80 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e  ne is not termin
13d90 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  ated before the 
13da0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
13db0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65  ");.        ps.e
13dc0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
13dd0 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
13de0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13df0 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
13e00 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
13e10 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c 6e 75  }else if( isalnu
13e20 6d 28 63 29 20 29 7b 20 20 20 20 20 20 20 20 20  m(c) ){         
13e30 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73 20   /* Identifiers 
13e40 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
13e50 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
13e60 69 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d  isalnum(c) || c=
13e70 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20  ='_') ) cp++;.  
13e80 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
13e90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
13ea0 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d 3d  ==':' && cp[1]==
13eb0 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27 3d  ':' && cp[2]=='=
13ec0 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65 72  ' ){ /* The oper
13ed0 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20  ator "::=" */.  
13ee0 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20 20      cp += 3;.   
13ef0 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
13f00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63      }else if( (c
13f10 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27 29  =='/' || c=='|')
13f20 20 26 26 20 69 73 61 6c 70 68 61 28 63 70 5b 31   && isalpha(cp[1
13f30 5d 29 20 29 7b 0a 20 20 20 20 20 20 63 70 20 2b  ]) ){.      cp +
13f40 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 2;.      while
13f50 28 20 28 63 20 3d 20 2a 63 70 29 21 3d 30 20 26  ( (c = *cp)!=0 &
13f60 26 20 28 69 73 61 6c 6e 75 6d 28 63 29 20 7c 7c  & (isalnum(c) ||
13f70 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b   c=='_') ) cp++;
13f80 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
13f90 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20  cp;.    }else{  
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6f          /* All o
13fc0 74 68 65 72 20 28 6f 6e 65 20 63 68 61 72 61 63  ther (one charac
13fd0 74 65 72 29 20 6f 70 65 72 61 74 6f 72 73 20 2a  ter) operators *
13fe0 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20  /.      cp++;.  
13ff0 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
14000 0a 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20 2a  .    }.    c = *
14010 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b  cp;.    *cp = 0;
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c 20          /* Null 
14040 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74 6f  terminate the to
14050 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73 65  ken */.    parse
14060 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20 20  onetoken(&ps);  
14070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
14080 72 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f  rse the token */
14090 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 20 20 20  .    *cp = c;   
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140b0 20 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 20       /* Restore 
140c0 74 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  the buffer */.  
140d0 20 20 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a 20    cp = nextcp;. 
140e0 20 7d 0a 20 20 66 72 65 65 28 66 69 6c 65 62 75   }.  free(filebu
140f0 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  f);             
14100 20 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73         /* Releas
14110 65 20 74 68 65 20 62 75 66 66 65 72 20 61 66 74  e the buffer aft
14120 65 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20 20  er parsing */.  
14130 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66 69  gp->rule = ps.fi
14140 72 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e 65  rstrule;.  gp->e
14150 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72 72  rrorcnt = ps.err
14160 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  orcnt;.}./******
14170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14180 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
14190 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a 2a  ile "plink.c" **
141a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141b0 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
141c0 6e 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 63  nes processing c
141d0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c  onfiguration fol
141e0 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74  low-set propagat
141f0 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e 20  ion links.** in 
14200 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
14210 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73   generator..*/.s
14220 74 61 74 69 63 20 73 74 72 75 63 74 20 70 6c 69  tatic struct pli
14230 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  nk *plink_freeli
14240 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c 6f  st = 0;../* Allo
14250 63 61 74 65 20 61 20 6e 65 77 20 70 6c 69 6e 6b  cate a new plink
14260 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b   */.struct plink
14270 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 29 7b 0a 20   *Plink_new(){. 
14280 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
14290 65 77 3b 0a 0a 20 20 69 66 28 20 70 6c 69 6e 6b  ew;..  if( plink
142a0 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a  _freelist==0 ){.
142b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
142c0 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20  nt amt = 100;.  
142d0 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
142e0 20 3d 20 28 73 74 72 75 63 74 20 70 6c 69 6e 6b   = (struct plink
142f0 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20   *)calloc( amt, 
14300 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70 6c  sizeof(struct pl
14310 69 6e 6b 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ink) );.    if( 
14320 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d  plink_freelist==
14330 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  0 ){.      fprin
14340 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
14350 20 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f   "Unable to allo
14360 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
14370 61 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d 73 65 74  a new follow-set
14380 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
14390 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  k.\n");.      ex
143a0 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
143b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d   for(i=0; i<amt-
143c0 31 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72  1; i++) plink_fr
143d0 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d  eelist[i].next =
143e0 20 26 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74   &plink_freelist
143f0 5b 69 2b 31 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b  [i+1];.    plink
14400 5f 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d  _freelist[amt-1]
14410 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  .next = 0;.  }. 
14420 20 6e 65 77 20 3d 20 70 6c 69 6e 6b 5f 66 72 65   new = plink_fre
14430 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66  elist;.  plink_f
14440 72 65 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f  reelist = plink_
14450 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
14460 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a    return new;.}.
14470 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e 6b 20  ./* Add a plink 
14480 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73 74 20  to a plink list 
14490 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64  */.void Plink_ad
144a0 64 28 70 6c 70 70 2c 63 66 70 29 0a 73 74 72 75  d(plpp,cfp).stru
144b0 63 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c 70 70 3b  ct plink **plpp;
144c0 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
144d0 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  cfp;.{.  struct 
144e0 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 20 20 6e 65  plink *new;.  ne
144f0 77 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b  w = Plink_new();
14500 0a 20 20 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 2a  .  new->next = *
14510 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70 20 3d 20  plpp;.  *plpp = 
14520 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e 63 66 70 20  new;.  new->cfp 
14530 3d 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61  = cfp;.}../* Tra
14540 6e 73 66 65 72 20 65 76 65 72 79 20 70 6c 69 6e  nsfer every plin
14550 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 22 66  k on the list "f
14560 72 6f 6d 22 20 74 6f 20 74 68 65 20 6c 69 73 74  rom" to the list
14570 20 22 74 6f 22 20 2a 2f 0a 76 6f 69 64 20 50 6c   "to" */.void Pl
14580 69 6e 6b 5f 63 6f 70 79 28 74 6f 2c 66 72 6f 6d  ink_copy(to,from
14590 29 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  ).struct plink *
145a0 2a 74 6f 3b 0a 73 74 72 75 63 74 20 70 6c 69 6e  *to;.struct plin
145b0 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a 20 20 73 74 72  k *from;.{.  str
145c0 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70  uct plink *nextp
145d0 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66 72 6f 6d  l;.  while( from
145e0 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d   ){.    nextpl =
145f0 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20   from->next;.   
14600 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74   from->next = *t
14610 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20 66 72 6f  o;.    *to = fro
14620 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d 20 6e 65  m;.    from = ne
14630 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  xtpl;.  }.}../* 
14640 44 65 6c 65 74 65 20 65 76 65 72 79 20 70 6c 69  Delete every pli
14650 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 2a  nk on the list *
14660 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c  /.void Plink_del
14670 65 74 65 28 70 6c 70 29 0a 73 74 72 75 63 74 20  ete(plp).struct 
14680 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 7b 0a 20 20  plink *plp;.{.  
14690 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
146a0 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20  xtpl;..  while( 
146b0 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  plp ){.    nextp
146c0 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  l = plp->next;. 
146d0 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70     plp->next = p
146e0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20  link_freelist;. 
146f0 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
14700 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70  t = plp;.    plp
14710 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
14720 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14730 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
14740 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e  he file "report.
14750 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
14760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
14770 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20  *.** Procedures 
14780 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72  for generating r
14790 65 70 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65  eports and table
147a0 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
147b0 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
147c0 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .*/../* Generate
147d0 20 61 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68   a filename with
147e0 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69   the given suffi
147f0 78 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  x.  Space to hol
14800 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f  d the.** name co
14810 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  mes from malloc(
14820 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
14830 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
14840 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
14850 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20  */.PRIVATE char 
14860 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c  *file_makename(l
14870 65 6d 70 2c 73 75 66 66 69 78 29 0a 73 74 72 75  emp,suffix).stru
14880 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
14890 63 68 61 72 20 2a 73 75 66 66 69 78 3b 0a 7b 0a  char *suffix;.{.
148a0 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20    char *name;.  
148b0 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 6e 61 6d  char *cp;..  nam
148c0 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  e = malloc( lemo
148d0 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69  nStrlen(lemp->fi
148e0 6c 65 6e 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53  lename) + lemonS
148f0 74 72 6c 65 6e 28 73 75 66 66 69 78 29 20 2b 20  trlen(suffix) + 
14900 35 20 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d  5 );.  if( name=
14910 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
14920 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
14930 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
14940 6f 72 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e  or a filename.\n
14950 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
14960 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 6e 61  .  }.  strcpy(na
14970 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  me,lemp->filenam
14980 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63  e);.  cp = strrc
14990 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20  hr(name,'.');.  
149a0 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30  if( cp ) *cp = 0
149b0 3b 0a 20 20 73 74 72 63 61 74 28 6e 61 6d 65 2c  ;.  strcat(name,
149c0 73 75 66 66 69 78 29 3b 0a 20 20 72 65 74 75 72  suffix);.  retur
149d0 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70  n name;.}../* Op
149e0 65 6e 20 61 20 66 69 6c 65 20 77 69 74 68 20 61  en a file with a
149f0 20 6e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 74   name based on t
14a00 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
14a10 6e 70 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75  nput file,.** bu
14a20 74 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  t with a differe
14a30 6e 74 20 28 73 70 65 63 69 66 69 65 64 29 20 73  nt (specified) s
14a40 75 66 66 69 78 2c 20 61 6e 64 20 72 65 74 75 72  uffix, and retur
14a50 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
14a60 6f 20 74 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a  o the stream */.
14a70 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 66 69  PRIVATE FILE *fi
14a80 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 73 75 66  le_open(lemp,suf
14a90 66 69 78 2c 6d 6f 64 65 29 0a 73 74 72 75 63 74  fix,mode).struct
14aa0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68   lemon *lemp;.ch
14ab0 61 72 20 2a 73 75 66 66 69 78 3b 0a 63 68 61 72  ar *suffix;.char
14ac0 20 2a 6d 6f 64 65 3b 0a 7b 0a 20 20 46 49 4c 45   *mode;.{.  FILE
14ad0 20 2a 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65 6d   *fp;..  if( lem
14ae0 70 2d 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72 65  p->outname ) fre
14af0 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  e(lemp->outname)
14b00 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  ;.  lemp->outnam
14b10 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d  e = file_makenam
14b20 65 28 6c 65 6d 70 2c 20 73 75 66 66 69 78 29 3b  e(lemp, suffix);
14b30 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c 65  .  fp = fopen(le
14b40 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64 65  mp->outname,mode
14b50 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 26  );.  if( fp==0 &
14b60 26 20 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b 0a  & *mode=='w' ){.
14b70 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
14b80 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 66  rr,"Can't open f
14b90 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 6c  ile \"%s\".\n",l
14ba0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20  emp->outname);. 
14bb0 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
14bc0 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t++;.    return 
14bd0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
14be0 66 70 3b 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63  fp;.}../* Duplic
14bf0 61 74 65 20 74 68 65 20 69 6e 70 75 74 20 66 69  ate the input fi
14c00 6c 65 20 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65  le without comme
14c10 6e 74 73 20 61 6e 64 20 77 69 74 68 6f 75 74 20  nts and without 
14c20 61 63 74 69 6f 6e 73 20 0a 2a 2a 20 6f 6e 20 72  actions .** on r
14c30 75 6c 65 73 20 2a 2f 0a 76 6f 69 64 20 52 65 70  ules */.void Rep
14c40 72 69 6e 74 28 6c 65 6d 70 29 0a 73 74 72 75 63  rint(lemp).struc
14c50 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
14c60 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
14c70 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  rp;.  struct sym
14c80 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69  bol *sp;.  int i
14c90 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e  , j, maxlen, len
14ca0 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70  , ncolumns, skip
14cb0 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f 20 52  ;.  printf("// R
14cc0 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75 74 20  eprint of input 
14cd0 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f  file \"%s\".\n//
14ce0 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d   Symbols:\n",lem
14cf0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
14d00 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66  maxlen = 10;.  f
14d10 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
14d20 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
14d30 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79     sp = lemp->sy
14d40 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65  mbols[i];.    le
14d50 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  n = lemonStrlen(
14d60 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69  sp->name);.    i
14d70 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20  f( len>maxlen ) 
14d80 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20  maxlen = len;.  
14d90 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37  }.  ncolumns = 7
14da0 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20 20  6/(maxlen+5);.  
14db0 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29  if( ncolumns<1 )
14dc0 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20   ncolumns = 1;. 
14dd0 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e   skip = (lemp->n
14de0 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e  symbol + ncolumn
14df0 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b  s - 1)/ncolumns;
14e00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 6b  .  for(i=0; i<sk
14e10 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72  ip; i++){.    pr
14e20 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20 20 20  intf("//");.    
14e30 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d  for(j=i; j<lemp-
14e40 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69  >nsymbol; j+=ski
14e50 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c  p){.      sp = l
14e60 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b  emp->symbols[j];
14e70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
14e80 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20  p->index==j );. 
14e90 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 33       printf(" %3
14ea0 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c  d %-*.*s",j,maxl
14eb0 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61  en,maxlen,sp->na
14ec0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
14ed0 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
14ee0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
14ef0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
14f00 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72 69 6e  >next){.    prin
14f10 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68 73 2d  tf("%s",rp->lhs-
14f20 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 20  >name);.    /*  
14f30 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
14f40 61 73 20 29 20 70 72 69 6e 74 66 28 22 28 25 73  as ) printf("(%s
14f50 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  )",rp->lhsalias)
14f60 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28  ; */.    printf(
14f70 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66 6f 72  " ::=");.    for
14f80 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
14f90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70  ; i++){.      sp
14fa0 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
14fb0 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 73       printf(" %s
14fc0 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
14fd0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
14fe0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
14ff0 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
15000 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; j<sp->nsubsy
15010 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
15020 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73 22 2c     printf("|%s",
15030 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e   sp->subsym[j]->
15040 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
15050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
15060 2a 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69  * if( rp->rhsali
15070 61 73 5b 69 5d 20 29 20 70 72 69 6e 74 66 28 22  as[i] ) printf("
15080 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69  (%s)",rp->rhsali
15090 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d  as[i]); */.    }
150a0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e 22 29  .    printf(".")
150b0 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72  ;.    if( rp->pr
150c0 65 63 73 79 6d 20 29 20 70 72 69 6e 74 66 28 22  ecsym ) printf("
150d0 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73   [%s]",rp->precs
150e0 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f  ym->name);.    /
150f0 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29  * if( rp->code )
15100 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25   printf("\n    %
15110 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f  s",rp->code); */
15120 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
15130 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 43  );.  }.}..void C
15140 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66  onfigPrint(fp,cf
15150 70 29 0a 46 49 4c 45 20 2a 66 70 3b 0a 73 74 72  p).FILE *fp;.str
15160 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
15170 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
15180 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73   *rp;.  struct s
15190 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74  ymbol *sp;.  int
151a0 20 69 2c 20 6a 3b 0a 20 20 72 70 20 3d 20 63 66   i, j;.  rp = cf
151b0 70 2d 3e 72 70 3b 0a 20 20 66 70 72 69 6e 74 66  p->rp;.  fprintf
151c0 28 66 70 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d  (fp,"%s ::=",rp-
151d0 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66  >lhs->name);.  f
151e0 6f 72 28 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e  or(i=0; i<=rp->n
151f0 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rhs; i++){.    i
15200 66 28 20 69 3d 3d 63 66 70 2d 3e 64 6f 74 20 29  f( i==cfp->dot )
15210 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 2a 22   fprintf(fp," *"
15220 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 72 70  );.    if( i==rp
15230 2d 3e 6e 72 68 73 20 29 20 62 72 65 61 6b 3b 0a  ->nrhs ) break;.
15240 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73      sp = rp->rhs
15250 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  [i];.    fprintf
15260 28 66 70 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e  (fp," %s", sp->n
15270 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70  ame);.    if( sp
15280 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
15290 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 66  MINAL ){.      f
152a0 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73  or(j=1; j<sp->ns
152b0 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ubsym; j++){.   
152c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
152d0 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d  "|%s",sp->subsym
152e0 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [j]->name);.    
152f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
15300 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 45 53 54  ./* #define TEST
15310 20 2a 2f 0a 23 69 66 20 30 0a 2f 2a 20 50 72 69   */.#if 0./* Pri
15320 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49 56  nt a set */.PRIV
15330 41 54 45 20 76 6f 69 64 20 53 65 74 50 72 69 6e  ATE void SetPrin
15340 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a  t(out,set,lemp).
15350 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20  FILE *out;.char 
15360 2a 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d  *set;.struct lem
15370 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
15380 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70 61  t i;.  char *spa
15390 63 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d 20  cer;.  spacer = 
153a0 22 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  "";.  fprintf(ou
153b0 74 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20  t,"%12s[","");. 
153c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
153d0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b  ->nterminal; i++
153e0 29 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46 69  ){.    if( SetFi
153f0 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20 20  nd(set,i) ){.   
15400 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
15410 25 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d  %s%s",spacer,lem
15420 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
15430 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61 63  ame);.      spac
15440 65 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a  er = " ";.    }.
15450 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
15460 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20  t,"]\n");.}../* 
15470 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68  Print a plink ch
15480 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ain */.PRIVATE v
15490 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f  oid PlinkPrint(o
154a0 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45  ut,plp,tag).FILE
154b0 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70 6c   *out;.struct pl
154c0 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a  ink *plp;.char *
154d0 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20  tag;.{.  while( 
154e0 70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  plp ){.    fprin
154f0 74 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20 28  tf(out,"%12s%s (
15500 73 74 61 74 65 20 25 32 64 29 20 22 2c 22 22 2c  state %2d) ","",
15510 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74  tag,plp->cfp->st
15520 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20  p->statenum);.  
15530 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75    ConfigPrint(ou
15540 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20  t,plp->cfp);.   
15550 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
15560 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c  ");.    plp = pl
15570 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23  p->next;.  }.}.#
15580 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20  endif../* Print 
15590 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  an action to the
155a0 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
155b0 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
155c0 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68  FALSE if.** noth
155d0 69 6e 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79  ing was actually
155e0 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74   printed..*/.int
155f0 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 73 74 72   PrintAction(str
15600 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20  uct action *ap, 
15610 46 49 4c 45 20 2a 66 70 2c 20 69 6e 74 20 69 6e  FILE *fp, int in
15620 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 65 73  dent){.  int res
15630 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63  ult = 1;.  switc
15640 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20  h( ap->type ){. 
15650 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 0a 20     case SHIFT:. 
15660 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
15670 22 25 2a 73 20 73 68 69 66 74 20 20 25 64 22 2c  "%*s shift  %d",
15680 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
15690 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73  ame,ap->x.stp->s
156a0 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20  tatenum);.      
156b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
156c0 52 45 44 55 43 45 3a 0a 20 20 20 20 20 20 66 70  REDUCE:.      fp
156d0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65  rintf(fp,"%*s re
156e0 64 75 63 65 20 25 64 22 2c 69 6e 64 65 6e 74 2c  duce %d",indent,
156f0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
15700 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  >x.rp->index);. 
15710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15720 63 61 73 65 20 41 43 43 45 50 54 3a 0a 20 20 20  case ACCEPT:.   
15730 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
15740 2a 73 20 61 63 63 65 70 74 22 2c 69 6e 64 65 6e  *s accept",inden
15750 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b  t,ap->sp->name);
15760 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15770 20 20 63 61 73 65 20 45 52 52 4f 52 3a 0a 20 20    case ERROR:.  
15780 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
15790 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e 64 65 6e  %*s error",inden
157a0 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b  t,ap->sp->name);
157b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
157c0 20 20 63 61 73 65 20 53 52 43 4f 4e 46 4c 49 43    case SRCONFLIC
157d0 54 3a 0a 20 20 20 20 63 61 73 65 20 52 52 43 4f  T:.    case RRCO
157e0 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70  NFLICT:.      fp
157f0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65  rintf(fp,"%*s re
15800 64 75 63 65 20 25 2d 33 64 20 2a 2a 20 50 61 72  duce %-3d ** Par
15810 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a  sing conflict **
15820 22 2c 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e  ",.        inden
15830 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
15840 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b  p->x.rp->index);
15850 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15860 20 20 63 61 73 65 20 53 53 43 4f 4e 46 4c 49 43    case SSCONFLIC
15870 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
15880 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20  (fp,"%*s shift  
15890 25 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f  %d ** Parsing co
158a0 6e 66 6c 69 63 74 20 2a 2a 22 2c 20 0a 20 20 20  nflict **", .   
158b0 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
158c0 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73  sp->name,ap->x.s
158d0 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20  tp->statenum);. 
158e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
158f0 63 61 73 65 20 53 48 5f 52 45 53 4f 4c 56 45 44  case SH_RESOLVED
15900 3a 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52 45  :.    case RD_RE
15910 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SOLVED:.    case
15920 20 4e 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20   NOT_USED:.     
15930 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20   result = 0;.   
15940 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20     break;.  }.  
15950 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d  return result;.}
15960 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68  ../* Generate th
15970 65 20 22 79 2e 6f 75 74 70 75 74 22 20 6c 6f 67  e "y.output" log
15980 20 66 69 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65   file */.void Re
15990 70 6f 72 74 4f 75 74 70 75 74 28 6c 65 6d 70 29  portOutput(lemp)
159a0 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
159b0 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp;.{.  int i;.
159c0 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
159d0 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  stp;.  struct co
159e0 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
159f0 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
15a00 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66    FILE *fp;..  f
15a10 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  p = file_open(le
15a20 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b  mp,".out","wb");
15a30 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72  .  if( fp==0 ) r
15a40 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
15a50 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
15a60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
15a70 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
15a80 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  ];.    fprintf(f
15a90 70 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c  p,"State %d:\n",
15aa0 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
15ab0 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61      if( lemp->ba
15ac0 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 73 74  sisflag ) cfp=st
15ad0 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65 20  p->bp;.    else 
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 20 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a 20   cfp=stp->cfp;. 
15b00 20 20 20 77 68 69 6c 65 28 20 63 66 70 20 29 7b     while( cfp ){
15b10 0a 20 20 20 20 20 20 63 68 61 72 20 62 75 66 5b  .      char buf[
15b20 32 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63  20];.      if( c
15b30 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72 70  fp->dot==cfp->rp
15b40 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  ->nrhs ){.      
15b50 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22 28    sprintf(buf,"(
15b60 25 64 29 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 6e  %d)",cfp->rp->in
15b70 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 66 70  dex);.        fp
15b80 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20 25 35  rintf(fp,"    %5
15b90 73 20 22 2c 62 75 66 29 3b 0a 20 20 20 20 20 20  s ",buf);.      
15ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
15bb0 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20 20  printf(fp,"     
15bc0 20 20 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d       ");.      }
15bd0 0a 20 20 20 20 20 20 43 6f 6e 66 69 67 50 72 69  .      ConfigPri
15be0 6e 74 28 66 70 2c 63 66 70 29 3b 0a 20 20 20 20  nt(fp,cfp);.    
15bf0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e    fprintf(fp,"\n
15c00 22 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20  ");.#if 0.      
15c10 53 65 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  SetPrint(fp,cfp-
15c20 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20  >fws,lemp);.    
15c30 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c    PlinkPrint(fp,
15c40 63 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22  cfp->fplp,"To  "
15c50 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
15c60 69 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70  int(fp,cfp->bplp
15c70 2c 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66  ,"From");.#endif
15c80 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  .      if( lemp-
15c90 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70  >basisflag ) cfp
15ca0 3d 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20  =cfp->bp;.      
15cb0 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
15cc0 20 20 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e        cfp=cfp->n
15cd0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ext;.    }.    f
15ce0 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
15cf0 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
15d00 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
15d10 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
15d20 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c   PrintAction(ap,
15d30 66 70 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66  fp,30) ) fprintf
15d40 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  (fp,"\n");.    }
15d50 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
15d60 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72  "\n");.  }.  fpr
15d70 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d  intf(fp, "------
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
15db0 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70  ");.  fprintf(fp
15dc0 2c 20 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b  , "Symbols:\n");
15dd0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
15de0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
15df0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  ){.    int j;.  
15e00 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
15e10 2a 73 70 3b 0a 0a 20 20 20 20 73 70 20 3d 20 6c  *sp;..    sp = l
15e20 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
15e30 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
15e40 20 22 20 20 25 33 64 3a 20 25 73 22 2c 20 69 2c   "  %3d: %s", i,
15e50 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
15e60 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f  if( sp->type==NO
15e70 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  NTERMINAL ){.   
15e80 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
15e90 3a 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  :");.      if( s
15ea0 70 2d 3e 6c 61 6d 62 64 61 20 29 7b 0a 20 20 20  p->lambda ){.   
15eb0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
15ec0 20 22 20 3c 6c 61 6d 62 64 61 3e 22 29 3b 0a 20   " <lambda>");. 
15ed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
15ee0 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74  (j=0; j<lemp->nt
15ef0 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20  erminal; j++){. 
15f00 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 66         if( sp->f
15f10 69 72 73 74 73 65 74 20 26 26 20 53 65 74 46 69  irstset && SetFi
15f20 6e 64 28 73 70 2d 3e 66 69 72 73 74 73 65 74 2c  nd(sp->firstset,
15f30 20 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   j) ){.         
15f40 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20 25   fprintf(fp, " %
15f50 73 22 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  s", lemp->symbol
15f60 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[j]->name);.   
15f70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15f80 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
15f90 28 66 70 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a  (fp, "\n");.  }.
15fa0 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20    fclose(fp);.  
15fb0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65  return;.}../* Se
15fc0 61 72 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c  arch for the fil
15fd0 65 20 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69  e "name" which i
15fe0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
15ff0 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
16000 65 20 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a  e exacutable */.
16010 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 70 61  PRIVATE char *pa
16020 74 68 73 65 61 72 63 68 28 61 72 67 76 30 2c 6e  thsearch(argv0,n
16030 61 6d 65 2c 6d 6f 64 65 6d 61 73 6b 29 0a 63 68  ame,modemask).ch
16040 61 72 20 2a 61 72 67 76 30 3b 0a 63 68 61 72 20  ar *argv0;.char 
16050 2a 6e 61 6d 65 3b 0a 69 6e 74 20 6d 6f 64 65 6d  *name;.int modem
16060 61 73 6b 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 70  ask;.{.  char *p
16070 61 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72 20  athlist;.  char 
16080 2a 70 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61  *path,*cp;.  cha
16090 72 20 63 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57  r c;..#ifdef __W
160a0 49 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74  IN32__.  cp = st
160b0 72 72 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27  rrchr(argv0,'\\'
160c0 29 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20  );.#else.  cp = 
160d0 73 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f  strrchr(argv0,'/
160e0 27 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ');.#endif.  if(
160f0 20 63 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a   cp ){.    c = *
16100 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b  cp;.    *cp = 0;
16110 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61  .    path = (cha
16120 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  r *)malloc( lemo
16130 6e 53 74 72 6c 65 6e 28 61 72 67 76 30 29 20 2b  nStrlen(argv0) +
16140 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d   lemonStrlen(nam
16150 65 29 20 2b 20 32 20 29 3b 0a 20 20 20 20 69 66  e) + 2 );.    if
16160 28 20 70 61 74 68 20 29 20 73 70 72 69 6e 74 66  ( path ) sprintf
16170 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 61 72  (path,"%s/%s",ar
16180 67 76 30 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 2a  gv0,name);.    *
16190 63 70 20 3d 20 63 3b 0a 20 20 7d 65 6c 73 65 7b  cp = c;.  }else{
161a0 0a 20 20 20 20 65 78 74 65 72 6e 20 63 68 61 72  .    extern char
161b0 20 2a 67 65 74 65 6e 76 28 29 3b 0a 20 20 20 20   *getenv();.    
161c0 70 61 74 68 6c 69 73 74 20 3d 20 67 65 74 65 6e  pathlist = geten
161d0 76 28 22 50 41 54 48 22 29 3b 0a 20 20 20 20 69  v("PATH");.    i
161e0 66 28 20 70 61 74 68 6c 69 73 74 3d 3d 30 20 29  f( pathlist==0 )
161f0 20 70 61 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f   pathlist = ".:/
16200 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20  bin:/usr/bin";. 
16210 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20     path = (char 
16220 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
16230 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b  trlen(pathlist)+
16240 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65  lemonStrlen(name
16250 29 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  )+2 );.    if( p
16260 61 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ath!=0 ){.      
16270 77 68 69 6c 65 28 20 2a 70 61 74 68 6c 69 73 74  while( *pathlist
16280 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70 20 3d   ){.        cp =
16290 20 73 74 72 63 68 72 28 70 61 74 68 6c 69 73 74   strchr(pathlist
162a0 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69  ,':');.        i
162b0 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20  f( cp==0 ) cp = 
162c0 26 70 61 74 68 6c 69 73 74 5b 6c 65 6d 6f 6e 53  &pathlist[lemonS
162d0 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 5d  trlen(pathlist)]
162e0 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 2a 63  ;.        c = *c
162f0 70 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20 3d  p;.        *cp =
16300 20 30 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69   0;.        spri
16310 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22  ntf(path,"%s/%s"
16320 2c 70 61 74 68 6c 69 73 74 2c 6e 61 6d 65 29 3b  ,pathlist,name);
16330 0a 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 63  .        *cp = c
16340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
16350 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20  =0 ) pathlist = 
16360 22 22 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  "";.        else
16370 20 70 61 74 68 6c 69 73 74 20 3d 20 26 63 70 5b   pathlist = &cp[
16380 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1];.        if( 
16390 61 63 63 65 73 73 28 70 61 74 68 2c 6d 6f 64 65  access(path,mode
163a0 6d 61 73 6b 29 3d 3d 30 20 29 20 62 72 65 61 6b  mask)==0 ) break
163b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
163c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 61 74    }.  return pat
163d0 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20 61  h;.}../* Given a
163e0 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d 70 75 74  n action, comput
163f0 65 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  e the integer va
16400 6c 75 65 20 66 6f 72 20 74 68 61 74 20 61 63 74  lue for that act
16410 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  ion.** which is 
16420 74 6f 20 62 65 20 70 75 74 20 69 6e 20 74 68 65  to be put in the
16430 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66   action table of
16440 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 6d   the generated m
16450 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65 74 75 72  achine..** Retur
16460 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20 6e 6f  n negative if no
16470 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62   action should b
16480 65 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  e generated..*/.
16490 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6d 70  PRIVATE int comp
164a0 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
164b0 61 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ap).struct lemon
164c0 20 2a 6c 65 6d 70 3b 0a 73 74 72 75 63 74 20 61   *lemp;.struct a
164d0 63 74 69 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20 69  ction *ap;.{.  i
164e0 6e 74 20 61 63 74 3b 0a 20 20 73 77 69 74 63 68  nt act;.  switch
164f0 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20  ( ap->type ){.  
16500 20 20 63 61 73 65 20 53 48 49 46 54 3a 20 20 61    case SHIFT:  a
16510 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74 70 2d 3e  ct = ap->x.stp->
16520 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20  statenum;       
16530 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16540 63 61 73 65 20 52 45 44 55 43 45 3a 20 61 63 74  case REDUCE: act
16550 20 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64   = ap->x.rp->ind
16560 65 78 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ex + lemp->nstat
16570 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  e; break;.    ca
16580 73 65 20 45 52 52 4f 52 3a 20 20 61 63 74 20 3d  se ERROR:  act =
16590 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
165a0 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20 20 20  lemp->nrule;    
165b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
165c0 20 41 43 43 45 50 54 3a 20 61 63 74 20 3d 20 6c   ACCEPT: act = l
165d0 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
165e0 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 31 3b 20 62  mp->nrule + 1; b
165f0 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
16600 74 3a 20 20 20 20 20 61 63 74 20 3d 20 2d 31 3b  t:     act = -1;
16610 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
16620 74 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65  turn act;.}..#de
16630 66 69 6e 65 20 4c 49 4e 45 53 49 5a 45 20 31 30  fine LINESIZE 10
16640 30 30 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 63  00./* The next c
16650 6c 75 73 74 65 72 20 6f 66 20 72 6f 75 74 69 6e  luster of routin
16660 65 73 20 61 72 65 20 66 6f 72 20 72 65 61 64 69  es are for readi
16670 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  ng the template 
16680 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74  file.** and writ
16690 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
166a0 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  to the generated
166b0 20 70 61 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68   parser */./* Th
166c0 65 20 66 69 72 73 74 20 66 75 6e 63 74 69 6f 6e  e first function
166d0 20 74 72 61 6e 73 66 65 72 73 20 64 61 74 61 20   transfers data 
166e0 66 72 6f 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75  from "in" to "ou
166f0 74 22 20 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69  t" until.** a li
16700 6e 65 20 69 73 20 73 65 65 6e 20 77 68 69 63 68  ne is seen which
16710 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 25 25   begins with "%%
16720 22 2e 20 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d  ".  The line num
16730 62 65 72 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65  ber is.** tracke
16740 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65  d..**.** if name
16750 21 3d 30 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f  !=0, then any wo
16760 72 64 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  rd that begin wi
16770 74 68 20 22 50 61 72 73 65 22 20 69 73 20 63 68  th "Parse" is ch
16780 61 6e 67 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69  anged to.** begi
16790 6e 20 77 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73  n with *name ins
167a0 74 65 61 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  tead..*/.PRIVATE
167b0 20 76 6f 69 64 20 74 70 6c 74 5f 78 66 65 72 28   void tplt_xfer(
167c0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 6c 69 6e 65  name,in,out,line
167d0 6e 6f 29 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a  no).char *name;.
167e0 46 49 4c 45 20 2a 69 6e 3b 0a 46 49 4c 45 20 2a  FILE *in;.FILE *
167f0 6f 75 74 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f  out;.int *lineno
16800 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74  ;.{.  int i, iSt
16810 61 72 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65  art;.  char line
16820 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68  [LINESIZE];.  wh
16830 69 6c 65 28 20 66 67 65 74 73 28 6c 69 6e 65 2c  ile( fgets(line,
16840 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26 20  LINESIZE,in) && 
16850 28 6c 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c  (line[0]!='%' ||
16860 20 6c 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29   line[1]!='%') )
16870 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  {.    (*lineno)+
16880 2b 3b 0a 20 20 20 20 69 53 74 61 72 74 20 3d 20  +;.    iStart = 
16890 30 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d 65 20  0;.    if( name 
168a0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
168b0 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b  ; line[i]; i++){
168c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 69 6e  .        if( lin
168d0 65 5b 69 5d 3d 3d 27 50 27 20 26 26 20 73 74 72  e[i]=='P' && str
168e0 6e 63 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50  ncmp(&line[i],"P
168f0 61 72 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20  arse",5)==0.    
16900 20 20 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c        && (i==0 |
16910 7c 20 21 69 73 61 6c 70 68 61 28 6c 69 6e 65 5b  | !isalpha(line[
16920 69 2d 31 5d 29 29 0a 20 20 20 20 20 20 20 20 29  i-1])).        )
16930 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
16940 69 3e 69 53 74 61 72 74 20 29 20 66 70 72 69 6e  i>iStart ) fprin
16950 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d  tf(out,"%.*s",i-
16960 69 53 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74  iStart,&line[iSt
16970 61 72 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  art]);.         
16980 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73   fprintf(out,"%s
16990 22 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ",name);.       
169a0 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20     i += 4;.     
169b0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 2b       iStart = i+
169c0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
169d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
169e0 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
169f0 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a  &line[iStart]);.
16a00 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65    }.}../* The ne
16a10 78 74 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  xt function find
16a20 73 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  s the template f
16a30 69 6c 65 20 61 6e 64 20 6f 70 65 6e 73 20 69 74  ile and opens it
16a40 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61  , returning.** a
16a50 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
16a60 6f 70 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a  opened file. */.
16a70 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 74 70  PRIVATE FILE *tp
16a80 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 0a 73 74  lt_open(lemp).st
16a90 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
16aa0 3b 0a 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  ;.{.  static cha
16ab0 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d  r templatename[]
16ac0 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20   = "lempar.c";. 
16ad0 20 63 68 61 72 20 62 75 66 5b 31 30 30 30 5d 3b   char buf[1000];
16ae0 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63  .  FILE *in;.  c
16af0 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20  har *tpltname;. 
16b00 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 63 70   char *cp;..  cp
16b10 20 3d 20 73 74 72 72 63 68 72 28 6c 65 6d 70 2d   = strrchr(lemp-
16b20 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a  >filename,'.');.
16b30 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20    if( cp ){.    
16b40 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a  sprintf(buf,"%.*
16b50 73 2e 6c 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c  s.lt",(int)(cp-l
16b60 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c  emp->filename),l
16b70 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
16b80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72    }else{.    spr
16b90 69 6e 74 66 28 62 75 66 2c 22 25 73 2e 6c 74 22  intf(buf,"%s.lt"
16ba0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
16bb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63 65  ;.  }.  if( acce
16bc0 73 73 28 62 75 66 2c 30 30 34 29 3d 3d 30 20 29  ss(buf,004)==0 )
16bd0 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d  {.    tpltname =
16be0 20 62 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66   buf;.  }else if
16bf0 28 20 61 63 63 65 73 73 28 74 65 6d 70 6c 61 74  ( access(templat
16c00 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b  ename,004)==0 ){
16c10 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20  .    tpltname = 
16c20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20  templatename;.  
16c30 7d 65 6c 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e  }else{.    tpltn
16c40 61 6d 65 20 3d 20 70 61 74 68 73 65 61 72 63 68  ame = pathsearch
16c50 28 6c 65 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d  (lemp->argv0,tem
16c60 70 6c 61 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20  platename,0);.  
16c70 7d 0a 20 20 69 66 28 20 74 70 6c 74 6e 61 6d 65  }.  if( tpltname
16c80 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
16c90 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
16ca0 20 66 69 6e 64 20 74 68 65 20 70 61 72 73 65 72   find the parser
16cb0 20 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65   driver template
16cc0 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
16cd0 2c 0a 20 20 20 20 74 65 6d 70 6c 61 74 65 6e 61  ,.    templatena
16ce0 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65  me);.    lemp->e
16cf0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
16d00 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
16d10 6e 20 3d 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61  n = fopen(tpltna
16d20 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20  me,"rb");.  if( 
16d30 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  in==0 ){.    fpr
16d40 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
16d50 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70  't open the temp
16d60 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
16d70 2e 5c 6e 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d  .\n",templatenam
16d80 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  e);.    lemp->er
16d90 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
16da0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
16db0 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50  turn in;.}../* P
16dc0 72 69 6e 74 20 61 20 23 6c 69 6e 65 20 64 69 72  rint a #line dir
16dd0 65 63 74 69 76 65 20 6c 69 6e 65 20 74 6f 20 74  ective line to t
16de0 68 65 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20  he output file. 
16df0 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
16e00 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
16e10 2c 6c 69 6e 65 6e 6f 2c 66 69 6c 65 6e 61 6d 65  ,lineno,filename
16e20 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74  ).FILE *out;.int
16e30 20 6c 69 6e 65 6e 6f 3b 0a 63 68 61 72 20 2a 66   lineno;.char *f
16e40 69 6c 65 6e 61 6d 65 3b 0a 7b 0a 20 20 66 70 72  ilename;.{.  fpr
16e50 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20  intf(out,"#line 
16e60 25 64 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29 3b 0a  %d \"",lineno);.
16e70 20 20 77 68 69 6c 65 28 20 2a 66 69 6c 65 6e 61    while( *filena
16e80 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20 2a 66  me ){.    if( *f
16e90 69 6c 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c 27 20  ilename == '\\' 
16ea0 29 20 70 75 74 63 28 27 5c 5c 27 2c 6f 75 74 29  ) putc('\\',out)
16eb0 3b 0a 20 20 20 20 70 75 74 63 28 2a 66 69 6c 65  ;.    putc(*file
16ec0 6e 61 6d 65 2c 6f 75 74 29 3b 0a 20 20 20 20 66  name,out);.    f
16ed0 69 6c 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 20  ilename++;.  }. 
16ee0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22   fprintf(out,"\"
16ef0 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  \n");.}../* Prin
16f00 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20 74 68  t a string to th
16f10 65 20 66 69 6c 65 20 61 6e 64 20 6b 65 65 70 20  e file and keep 
16f20 74 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75  the linenumber u
16f30 70 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49  p to date */.PRI
16f40 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 70  VATE void tplt_p
16f50 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 73 74  rint(out,lemp,st
16f60 72 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a  r,lineno).FILE *
16f70 6f 75 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  out;.struct lemo
16f80 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73  n *lemp;.char *s
16f90 74 72 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b  tr;.int *lineno;
16fa0 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d 30 20  .{.  if( str==0 
16fb0 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c  ) return;.  whil
16fc0 65 28 20 2a 73 74 72 20 29 7b 0a 20 20 20 20 70  e( *str ){.    p
16fd0 75 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20  utc(*str,out);. 
16fe0 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e     if( *str=='\n
16ff0 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
17000 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a  .    str++;.  }.
17010 20 20 69 66 28 20 73 74 72 5b 2d 31 5d 21 3d 27    if( str[-1]!='
17020 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75 74 63 28  \n' ){.    putc(
17030 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20 20 20 28  '\n',out);.    (
17040 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a  *lineno)++;.  }.
17050 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c    if (!lemp->nol
17060 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20  inenosflag) {.  
17070 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74    (*lineno)++; t
17080 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
17090 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
170a0 74 6e 61 6d 65 29 3b 20 0a 20 20 7d 0a 20 20 72  tname); .  }.  r
170b0 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
170c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
170d0 75 74 69 6e 65 20 65 6d 69 74 73 20 63 6f 64 65  utine emits code
170e0 20 66 6f 72 20 74 68 65 20 64 65 73 74 72 75 63   for the destruc
170f0 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  tor for the.** s
17100 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64  ymbol sp.*/.void
17110 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
17120 5f 63 6f 64 65 28 6f 75 74 2c 73 70 2c 6c 65 6d  _code(out,sp,lem
17130 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a  p,lineno).FILE *
17140 6f 75 74 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  out;.struct symb
17150 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c  ol *sp;.struct l
17160 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20  emon *lemp;.int 
17170 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72  *lineno;.{. char
17180 20 2a 63 70 20 3d 20 30 3b 0a 0a 20 69 66 28 20   *cp = 0;.. if( 
17190 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
171a0 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65  AL ){.   cp = le
171b0 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20  mp->tokendest;. 
171c0 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65    if( cp==0 ) re
171d0 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66  turn;.   fprintf
171e0 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
171f0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65  ineno)++;. }else
17200 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75 63   if( sp->destruc
17210 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20 73  tor ){.   cp = s
17220 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20  p->destructor;. 
17230 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b    fprintf(out,"{
17240 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
17250 2b 3b 0a 20 20 20 69 66 20 28 21 6c 65 6d 70 2d  +;.   if (!lemp-
17260 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20  >nolinenosflag) 
17270 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74  { (*lineno)++; t
17280 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
17290 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 2c 6c  sp->destLineno,l
172a0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20  emp->filename); 
172b0 7d 0a 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6d  }. }else if( lem
172c0 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20  p->vardest ){.  
172d0 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64   cp = lemp->vard
172e0 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d  est;.   if( cp==
172f0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 66  0 ) return;.   f
17300 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22  printf(out,"{\n"
17310 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
17320 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73 73 65 72   }else{.   asser
17330 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  t( 0 );  /* Cann
17340 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 7d 0a  ot happen */. }.
17350 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70 2b 2b   for(; *cp; cp++
17360 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27  ){.   if( *cp=='
17370 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 24 27  $' && cp[1]=='$'
17380 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e 74 66   ){.     fprintf
17390 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f 72 2d  (out,"(yypminor-
173a0 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74 6e 75  >yy%d)",sp->dtnu
173b0 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b 0a 20  m);.     cp++;. 
173c0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
173d0 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27   }.   if( *cp=='
173e0 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
173f0 2b 3b 0a 20 20 20 66 70 75 74 63 28 2a 63 70 2c  +;.   fputc(*cp,
17400 6f 75 74 29 3b 0a 20 7d 0a 20 66 70 72 69 6e 74  out);. }. fprint
17410 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 28 2a 6c  f(out,"\n"); (*l
17420 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69 66 20 28 21  ineno)++;. if (!
17430 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  lemp->nolinenosf
17440 6c 61 67 29 20 7b 20 0a 20 20 20 28 2a 6c 69 6e  lag) { .   (*lin
17450 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e  eno)++; tplt_lin
17460 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f  edir(out,*lineno
17470 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  ,lemp->outname);
17480 20 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75   . }. fprintf(ou
17490 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  t,"}\n"); (*line
174a0 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75 72 6e 3b 0a  no)++;. return;.
174b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
174c0 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20  TRUE (non-zero) 
174d0 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 79 6d  if the given sym
174e0 62 6f 6c 20 68 61 73 20 61 20 64 65 73 74 72 75  bol has a destru
174f0 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73  ctor..*/.int has
17500 5f 64 65 73 74 72 75 63 74 6f 72 28 73 70 2c 20  _destructor(sp, 
17510 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 73 79 6d  lemp).struct sym
17520 62 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20  bol *sp;.struct 
17530 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
17540 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20   int ret;.  if( 
17550 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
17560 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20  AL ){.    ret = 
17570 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21  lemp->tokendest!
17580 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
17590 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72   ret = lemp->var
175a0 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64  dest!=0 || sp->d
175b0 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20  estructor!=0;.  
175c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
175d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
175e0 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61 6d 69  text to a dynami
175f0 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
17600 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54 65 78  string.  If zTex
17610 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20 72  t is 0 then.** r
17620 65 73 65 74 20 74 68 65 20 73 74 72 69 6e 67 20  eset the string 
17630 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67 61 69  to be empty agai
17640 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  n.  Always retur
17650 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  n the complete t
17660 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 74  ext.** of the st
17670 72 69 6e 67 20 28 77 68 69 63 68 20 69 73 20 6f  ring (which is o
17680 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
17690 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a  each call)..**.*
176a0 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a 54 65  * n bytes of zTe
176b0 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e 20 20  xt are stored.  
176c0 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c 6c  If n==0 then all
176d0 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74 6f 20   of zText up to 
176e0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30 30  the first.** \00
176f0 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 73 20  0 terminator is 
17700 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74 20 63  stored.  zText c
17710 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f  an contain up to
17720 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f   two instances o
17730 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20 76 61  f.** %d.  The va
17740 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64 20 70  lues of p1 and p
17750 32 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  2 are written in
17760 74 6f 20 74 68 65 20 66 69 72 73 74 20 61 6e 64  to the first and
17770 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a   second.** %d..*
17780 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20 74  *.** If n==-1, t
17790 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  hen the previous
177a0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 6f 76   character is ov
177b0 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52  erwritten..*/.PR
177c0 49 56 41 54 45 20 63 68 61 72 20 2a 61 70 70 65  IVATE char *appe
177d0 6e 64 5f 73 74 72 28 63 68 61 72 20 2a 7a 54 65  nd_str(char *zTe
177e0 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70  xt, int n, int p
177f0 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74  1, int p2){.  st
17800 61 74 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30  atic char *z = 0
17810 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  ;.  static int a
17820 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74  lloced = 0;.  st
17830 61 74 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20  atic int used = 
17840 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68  0;.  int c;.  ch
17850 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a 0a 20 20  ar zInt[40];..  
17860 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a  if( zText==0 ){.
17870 20 20 20 20 75 73 65 64 20 3d 20 30 3b 0a 20 20      used = 0;.  
17880 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a    return z;.  }.
17890 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20    if( n<=0 ){.  
178a0 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
178b0 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20     used += n;.  
178c0 20 20 20 20 61 73 73 65 72 74 28 20 75 73 65 64      assert( used
178d0 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >=0 );.    }.   
178e0 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e   n = lemonStrlen
178f0 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69  (zText);.  }.  i
17900 66 28 20 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e 74  f( n+sizeof(zInt
17910 29 2a 32 2b 75 73 65 64 20 3e 3d 20 61 6c 6c 6f  )*2+used >= allo
17920 63 65 64 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63  ced ){.    alloc
17930 65 64 20 3d 20 6e 20 2b 20 73 69 7a 65 6f 66 28  ed = n + sizeof(
17940 7a 49 6e 74 29 2a 32 20 2b 20 75 73 65 64 20 2b  zInt)*2 + used +
17950 20 32 30 30 3b 0a 20 20 20 20 7a 20 3d 20 72 65   200;.    z = re
17960 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c 6c 6f 63 65  alloc(z,  alloce
17970 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 3d  d);.  }.  if( z=
17980 3d 30 20 29 20 72 65 74 75 72 6e 20 22 22 3b 0a  =0 ) return "";.
17990 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
179a0 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 28 7a 54   ){.    c = *(zT
179b0 65 78 74 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  ext++);.    if( 
179c0 63 3d 3d 27 25 27 20 26 26 20 6e 3e 30 20 26 26  c=='%' && n>0 &&
179d0 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 64 27 20 29   zText[0]=='d' )
179e0 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  {.      sprintf(
179f0 7a 49 6e 74 2c 20 22 25 64 22 2c 20 70 31 29 3b  zInt, "%d", p1);
17a00 0a 20 20 20 20 20 20 70 31 20 3d 20 70 32 3b 0a  .      p1 = p2;.
17a10 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a 5b        strcpy(&z[
17a20 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b 0a 20 20  used], zInt);.  
17a30 20 20 20 20 75 73 65 64 20 2b 3d 20 6c 65 6d 6f      used += lemo
17a40 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73 65 64 5d  nStrlen(&z[used]
17a50 29 3b 0a 20 20 20 20 20 20 7a 54 65 78 74 2b 2b  );.      zText++
17a60 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  ;.      n--;.   
17a70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b   }else{.      z[
17a80 75 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  used++] = c;.   
17a90 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73 65 64 5d   }.  }.  z[used]
17aa0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a   = 0;.  return z
17ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 43 6f 64 65  ;.}../*.** zCode
17ac0 20 69 73 20 61 20 73 74 72 69 6e 67 20 74 68 61   is a string tha
17ad0 74 20 69 73 20 74 68 65 20 61 63 74 69 6f 6e 20  t is the action 
17ae0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
17af0 61 20 72 75 6c 65 2e 20 20 45 78 70 61 6e 64 0a  a rule.  Expand.
17b00 2a 2a 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69  ** the symbols i
17b10 6e 20 74 68 69 73 20 73 74 72 69 6e 67 20 73 6f  n this string so
17b20 20 74 68 61 74 20 74 68 65 20 72 65 66 65 72 20   that the refer 
17b30 74 6f 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  to elements of t
17b40 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 73 74 61  he parser.** sta
17b50 63 6b 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  ck..*/.PRIVATE v
17b60 6f 69 64 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f  oid translate_co
17b70 64 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  de(struct lemon 
17b80 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74 20 72 75  *lemp, struct ru
17b90 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68 61 72 20  le *rp){.  char 
17ba0 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20  *cp, *xp;.  int 
17bb0 69 3b 0a 20 20 63 68 61 72 20 6c 68 73 75 73 65  i;.  char lhsuse
17bc0 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72 75  d = 0;    /* Tru
17bd0 65 20 69 66 20 74 68 65 20 4c 48 53 20 65 6c 65  e if the LHS ele
17be0 6d 65 6e 74 20 68 61 73 20 62 65 65 6e 20 75 73  ment has been us
17bf0 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 75 73 65  ed */.  char use
17c00 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20 2f 2a 20  d[MAXRHS];   /* 
17c10 54 72 75 65 20 66 6f 72 20 65 61 63 68 20 52 48  True for each RH
17c20 53 20 65 6c 65 6d 65 6e 74 20 77 68 69 63 68 20  S element which 
17c30 69 73 20 75 73 65 64 20 2a 2f 0a 0a 20 20 66 6f  is used */..  fo
17c40 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
17c50 73 3b 20 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20  s; i++) used[i] 
17c60 3d 20 30 3b 0a 20 20 6c 68 73 75 73 65 64 20 3d  = 0;.  lhsused =
17c70 20 30 3b 0a 0a 20 20 69 66 28 20 72 70 2d 3e 63   0;..  if( rp->c
17c80 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 70  ode==0 ){.    rp
17c90 2d 3e 63 6f 64 65 20 3d 20 22 5c 6e 22 3b 0a 20  ->code = "\n";. 
17ca0 20 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70     rp->line = rp
17cb0 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a  ->ruleline;.  }.
17cc0 0a 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c  .  append_str(0,
17cd0 30 2c 30 2c 30 29 3b 0a 20 20 66 6f 72 28 63 70  0,0,0);.  for(cp
17ce0 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20  =rp->code; *cp; 
17cf0 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69  cp++){.    if( i
17d00 73 61 6c 70 68 61 28 2a 63 70 29 20 26 26 20 28  salpha(*cp) && (
17d10 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20  cp==rp->code || 
17d20 28 21 69 73 61 6c 6e 75 6d 28 63 70 5b 2d 31 5d  (!isalnum(cp[-1]
17d30 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27  ) && cp[-1]!='_'
17d40 29 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  )) ){.      char
17d50 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 66 6f   saved;.      fo
17d60 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20 69 73  r(xp= &cp[1]; is
17d70 61 6c 6e 75 6d 28 2a 78 70 29 20 7c 7c 20 2a 78  alnum(*xp) || *x
17d80 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20  p=='_'; xp++);. 
17d90 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 78 70       saved = *xp
17da0 3b 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 30 3b  ;.      *xp = 0;
17db0 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  .      if( rp->l
17dc0 68 73 61 6c 69 61 73 20 26 26 20 73 74 72 63 6d  hsalias && strcm
17dd0 70 28 63 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  p(cp,rp->lhsalia
17de0 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  s)==0 ){.       
17df0 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 67   append_str("yyg
17e00 6f 74 6f 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30  otominor.yy%d",0
17e10 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 2c  ,rp->lhs->dtnum,
17e20 30 29 3b 0a 20 20 20 20 20 20 20 20 63 70 20 3d  0);.        cp =
17e30 20 78 70 3b 0a 20 20 20 20 20 20 20 20 6c 68 73   xp;.        lhs
17e40 75 73 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  used = 1;.      
17e50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
17e60 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
17e70 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
17e80 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61      if( rp->rhsa
17e90 6c 69 61 73 5b 69 5d 20 26 26 20 73 74 72 63 6d  lias[i] && strcm
17ea0 70 28 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61  p(cp,rp->rhsalia
17eb0 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  s[i])==0 ){.    
17ec0 20 20 20 20 20 20 20 20 69 66 28 20 63 70 21 3d          if( cp!=
17ed0 72 70 2d 3e 63 6f 64 65 20 26 26 20 63 70 5b 2d  rp->code && cp[-
17ee0 31 5d 3d 3d 27 40 27 20 29 7b 0a 20 20 20 20 20  1]=='@' ){.     
17ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
17f00 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6f  he argument is o
17f10 66 20 74 68 65 20 66 6f 72 6d 20 40 58 20 74 68  f the form @X th
17f20 65 6e 20 73 75 62 73 74 69 74 75 74 65 64 0a 20  en substituted. 
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
17f40 74 68 65 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72  the token number
17f50 20 6f 66 20 58 2c 20 6e 6f 74 20 74 68 65 20 76   of X, not the v
17f60 61 6c 75 65 20 6f 66 20 58 20 2a 2f 0a 20 20 20  alue of X */.   
17f70 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
17f80 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d  d_str("yymsp[%d]
17f90 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d  .major",-1,i-rp-
17fa0 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a 20 20 20 20  >nrhs+1,0);.    
17fb0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
17fd0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
17fe0 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
17ff0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
18000 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
18010 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
18020 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
18030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
18040 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 73     dtnum = sp->s
18050 75 62 73 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d 3b  ubsym[0]->dtnum;
18060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
18070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
18080 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70        dtnum = sp
18090 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  ->dtnum;.       
180a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
180b0 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
180c0 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  r("yymsp[%d].min
180d0 6f 72 2e 79 79 25 64 22 2c 30 2c 69 2d 72 70 2d  or.yy%d",0,i-rp-
180e0 3e 6e 72 68 73 2b 31 2c 20 64 74 6e 75 6d 29 3b  >nrhs+1, dtnum);
180f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
18100 20 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20             cp = 
18110 78 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  xp;.            
18120 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20  used[i] = 1;.   
18130 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
18140 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18150 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18160 20 20 20 20 2a 78 70 20 3d 20 73 61 76 65 64 3b      *xp = saved;
18170 0a 20 20 20 20 7d 0a 20 20 20 20 61 70 70 65 6e  .    }.    appen
18180 64 5f 73 74 72 28 63 70 2c 20 31 2c 20 30 2c 20  d_str(cp, 1, 0, 
18190 30 29 3b 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  0);.  } /* End l
181a0 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  oop */..  /* Che
181b0 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
181c0 74 68 65 20 4c 48 53 20 68 61 73 20 62 65 65 6e  the LHS has been
181d0 20 75 73 65 64 20 2a 2f 0a 20 20 69 66 28 20 72   used */.  if( r
181e0 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 21  p->lhsalias && !
181f0 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20 20 45  lhsused ){.    E
18200 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
18210 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
18220 69 6e 65 2c 0a 20 20 20 20 20 20 22 4c 61 62 65  ine,.      "Labe
18230 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25  l \"%s\" for \"%
18240 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
18250 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
18260 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70   rp->lhsalias,rp
18270 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e  ->lhs->name,rp->
18280 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c  lhsalias);.    l
18290 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
182a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
182b0 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 20 63  ate destructor c
182c0 6f 64 65 20 66 6f 72 20 52 48 53 20 73 79 6d 62  ode for RHS symb
182d0 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20 6e 6f  ols which are no
182e0 74 20 75 73 65 64 20 69 6e 20 74 68 65 0a 20 20  t used in the.  
182f0 2a 2a 20 72 65 64 75 63 65 20 63 6f 64 65 20 2a  ** reduce code *
18300 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72  /.  for(i=0; i<r
18310 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
18320 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c     if( rp->rhsal
18330 69 61 73 5b 69 5d 20 26 26 20 21 75 73 65 64 5b  ias[i] && !used[
18340 69 5d 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f  i] ){.      Erro
18350 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
18360 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
18370 2c 0a 20 20 20 20 20 20 20 20 22 4c 61 62 65 6c  ,.        "Label
18380 20 25 73 20 66 6f 72 20 5c 22 25 73 28 25 73 29   %s for \"%s(%s)
18390 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  \" is never used
183a0 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e  .",.        rp->
183b0 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e  rhsalias[i],rp->
183c0 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d  rhs[i]->name,rp-
183d0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20  >rhsalias[i]);. 
183e0 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
183f0 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
18400 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61   if( rp->rhsalia
18410 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  s[i]==0 ){.     
18420 20 69 66 28 20 68 61 73 5f 64 65 73 74 72 75 63   if( has_destruc
18430 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c  tor(rp->rhs[i],l
18440 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  emp) ){.        
18450 61 70 70 65 6e 64 5f 73 74 72 28 22 20 20 79 79  append_str("  yy
18460 5f 64 65 73 74 72 75 63 74 6f 72 28 79 79 70 50  _destructor(yypP
18470 61 72 73 65 72 2c 25 64 2c 26 79 79 6d 73 70 5b  arser,%d,&yymsp[
18480 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20  %d].minor);\n", 
18490 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 72 70  0,.           rp
184a0 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c  ->rhs[i]->index,
184b0 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29 3b 0a 20  i-rp->nrhs+1);. 
184c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
184d0 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73 74 72 75      /* No destru
184e0 63 74 6f 72 20 64 65 66 69 6e 65 64 20 66 6f 72  ctor defined for
184f0 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
18500 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18510 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29    if( rp->code )
18520 7b 0a 20 20 20 20 63 70 20 3d 20 61 70 70 65 6e  {.    cp = appen
18530 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a  d_str(0,0,0,0);.
18540 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 53      rp->code = S
18550 74 72 73 61 66 65 28 63 70 3f 63 70 3a 22 22 29  trsafe(cp?cp:"")
18560 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  ;.  }.}../* .** 
18570 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
18580 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
18590 6e 20 74 68 65 20 72 75 6c 65 20 22 72 70 22 20  n the rule "rp" 
185a0 69 73 20 72 65 64 75 63 65 64 2e 20 20 57 72 69  is reduced.  Wri
185b0 74 65 0a 2a 2a 20 74 68 65 20 63 6f 64 65 20 74  te.** the code t
185c0 6f 20 22 6f 75 74 22 2e 20 20 4d 61 6b 65 20 73  o "out".  Make s
185d0 75 72 65 20 6c 69 6e 65 6e 6f 20 73 74 61 79 73  ure lineno stays
185e0 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a   up-to-date..*/.
185f0 50 52 49 56 41 54 45 20 76 6f 69 64 20 65 6d 69  PRIVATE void emi
18600 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65  t_code(out,rp,le
18610 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20  mp,lineno).FILE 
18620 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 72 75 6c  *out;.struct rul
18630 65 20 2a 72 70 3b 0a 73 74 72 75 63 74 20 6c 65  e *rp;.struct le
18640 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 2a  mon *lemp;.int *
18650 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72 20  lineno;.{. char 
18660 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65 6e 65 72 61  *cp;.. /* Genera
18670 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  te code to do th
18680 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20  e reduce action 
18690 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  */. if( rp->code
186a0 20 29 7b 0a 20 20 20 69 66 20 28 21 6c 65 6d 70   ){.   if (!lemp
186b0 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29  ->nolinenosflag)
186c0 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20   { (*lineno)++; 
186d0 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
186e0 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e  ,rp->line,lemp->
186f0 66 69 6c 65 6e 61 6d 65 29 3b 20 7d 0a 20 20 20  filename); }.   
18700 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25 73  fprintf(out,"{%s
18710 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20 20  ",rp->code);.   
18720 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b  for(cp=rp->code;
18730 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20   *cp; cp++){.   
18740 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20    if( *cp=='\n' 
18750 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ) (*lineno)++;. 
18760 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
18770 2a 2f 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  */.   fprintf(ou
18780 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  t,"}\n"); (*line
18790 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20 28 21 6c  no)++;.   if (!l
187a0 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  emp->nolinenosfl
187b0 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ag) { (*lineno)+
187c0 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28  +; tplt_linedir(
187d0 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70  out,*lineno,lemp
187e0 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 7d 0a 20 7d  ->outname); }. }
187f0 20 2f 2a 20 45 6e 64 20 69 66 28 20 72 70 2d 3e   /* End if( rp->
18800 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 72 65 74 75  code ) */.. retu
18810 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  rn;.}../*.** Pri
18820 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  nt the definitio
18830 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75  n of the union u
18840 73 65 64 20 66 6f 72 20 74 68 65 20 70 61 72 73  sed for the pars
18850 65 72 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e  er's data stack.
18860 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63  .** This union c
18870 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66  ontains fields f
18880 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c  or every possibl
18890 65 20 64 61 74 61 20 74 79 70 65 20 66 6f 72 20  e data type for 
188a0 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f  tokens.** and no
188b0 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20  nterminals.  In 
188c0 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63  the process of c
188d0 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69  omputing and pri
188e0 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e  nting this.** un
188f0 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68  ion, also set th
18900 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64  e ".dtnum" field
18910 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e   of every termin
18920 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  al and nontermin
18930 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f  al.** symbol..*/
18940 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63  .void print_stac
18950 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70  k_union(out,lemp
18960 2c 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29  ,plineno,mhflag)
18970 0a 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20  .FILE *out;     
18980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18990 54 68 65 20 6f 75 74 70 75 74 20 73 74 72 65 61  The output strea
189a0 6d 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f  m */.struct lemo
189b0 6e 20 2a 6c 65 6d 70 3b 20 20 20 20 20 20 20 20  n *lemp;        
189c0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66   /* The main inf
189d0 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
189e0 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 69  this parser */.i
189f0 6e 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20  nt *plineno;    
18a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
18a10 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e  inter to the lin
18a20 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 69 6e 74 20  e number */.int 
18a30 6d 68 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20  mhflag;         
18a40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
18a50 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61  if generating ma
18a60 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70 75 74  keheaders output
18a70 20 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c 69 6e 65   */.{.  int line
18a80 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20  no = *plineno;  
18a90 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75    /* The line nu
18aa0 6d 62 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70  mber of the outp
18ab0 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74  ut */.  char **t
18ac0 79 70 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ypes;           
18ad0 20 20 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c    /* A hash tabl
18ae0 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a  e of datatypes *
18af0 2f 0a 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a  /.  int arraysiz
18b00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
18b10 20 53 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79   Size of the "ty
18b20 70 65 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20  pes" array */.  
18b30 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b  int maxdtlength;
18b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
18b50 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61  imum length of a
18b60 6e 79 20 22 2e 64 61 74 61 74 79 70 65 22 20 66  ny ".datatype" f
18b70 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20  ield. */.  char 
18b80 2a 73 74 64 64 74 3b 20 20 20 20 20 20 20 20 20  *stddt;         
18b90 20 20 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64       /* Standard
18ba0 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  ized name for a 
18bb0 64 61 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e  datatype */.  in
18bc0 74 20 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20  t i,j;          
18bd0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
18be0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
18bf0 74 20 68 61 73 68 3b 20 20 20 20 20 20 20 20 20  t hash;         
18c00 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68          /* For h
18c10 61 73 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  ashing the name 
18c20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  of a type */.  c
18c30 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
18c40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
18c50 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a   of the parser *
18c60 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
18c70 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
18c80 74 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f  types[] and allo
18c90 63 61 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a  cate stddt[] */.
18ca0 20 20 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65    arraysize = le
18cb0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b  mp->nsymbol * 2;
18cc0 0a 20 20 74 79 70 65 73 20 3d 20 28 63 68 61 72  .  types = (char
18cd0 2a 2a 29 63 61 6c 6c 6f 63 28 20 61 72 72 61 79  **)calloc( array
18ce0 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 63 68 61  size, sizeof(cha
18cf0 72 2a 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  r*) );.  for(i=0
18d00 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
18d10 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30  ++) types[i] = 0
18d20 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  ;.  maxdtlength 
18d30 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  = 0;.  if( lemp-
18d40 3e 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20  >vartype ){.    
18d50 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65  maxdtlength = le
18d60 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e  monStrlen(lemp->
18d70 76 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20  vartype);.  }.  
18d80 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
18d90 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
18da0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
18db0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
18dc0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
18dd0 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
18de0 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29  p->datatype==0 )
18df0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c   continue;.    l
18e00 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  en = lemonStrlen
18e10 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a  (sp->datatype);.
18e20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64      if( len>maxd
18e30 74 6c 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c  tlength ) maxdtl
18e40 65 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d  ength = len;.  }
18e50 0a 20 20 73 74 64 64 74 20 3d 20 28 63 68 61 72  .  stddt = (char
18e60 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c  *)malloc( maxdtl
18e70 65 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20  ength*2 + 1 );. 
18e80 20 69 66 28 20 74 79 70 65 73 3d 3d 30 20 7c 7c   if( types==0 ||
18e90 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a 20 20 20   stddt==0 ){.   
18ea0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
18eb0 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c  "Out of memory.\
18ec0 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
18ed0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75 69 6c  ;.  }..  /* Buil
18ee0 64 20 61 20 68 61 73 68 20 74 61 62 6c 65 20 6f  d a hash table o
18ef0 66 20 64 61 74 61 74 79 70 65 73 2e 20 54 68 65  f datatypes. The
18f00 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20   ".dtnum" field 
18f10 6f 66 20 65 61 63 68 20 73 79 6d 62 6f 6c 0a 20  of each symbol. 
18f20 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 69 6e   ** is filled in
18f30 20 77 69 74 68 20 74 68 65 20 68 61 73 68 20 69   with the hash i
18f40 6e 64 65 78 20 70 6c 75 73 20 31 2e 20 20 41 20  ndex plus 1.  A 
18f50 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75 65 20 6f  ".dtnum" value o
18f60 66 20 30 20 69 73 0a 20 20 2a 2a 20 75 73 65 64  f 0 is.  ** used
18f70 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20 73 79   for terminal sy
18f80 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68 65 72 65  mbols.  If there
18f90 20 69 73 20 6e 6f 20 25 64 65 66 61 75 6c 74 5f   is no %default_
18fa0 74 79 70 65 20 64 65 66 69 6e 65 64 20 74 68 65  type defined the
18fb0 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61 6c 73 6f  n.  ** 0 is also
18fc0 20 75 73 65 64 20 61 73 20 74 68 65 20 2e 64 74   used as the .dt
18fd0 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72 20 6e 6f  num value for no
18fe0 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68  nterminals which
18ff0 20 64 6f 20 6e 6f 74 20 73 70 65 63 69 66 79 0a   do not specify.
19000 20 20 2a 2a 20 61 20 64 61 74 61 74 79 70 65 20    ** a datatype 
19010 75 73 69 6e 67 20 74 68 65 20 25 74 79 70 65 20  using the %type 
19020 64 69 72 65 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  directive..  */.
19030 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
19040 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
19050 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
19060 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
19070 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
19080 63 68 61 72 20 2a 63 70 3b 0a 20 20 20 20 69 66  char *cp;.    if
19090 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73  ( sp==lemp->errs
190a0 79 6d 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e  ym ){.      sp->
190b0 64 74 6e 75 6d 20 3d 20 61 72 72 61 79 73 69 7a  dtnum = arraysiz
190c0 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  e+1;.      conti
190d0 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
190e0 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e  f( sp->type!=NON
190f0 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28 73 70 2d  TERMINAL || (sp-
19100 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 26 26 20  >datatype==0 && 
19110 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3d 3d 30  lemp->vartype==0
19120 29 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64  ) ){.      sp->d
19130 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  tnum = 0;.      
19140 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
19150 20 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 61 74      cp = sp->dat
19160 61 74 79 70 65 3b 0a 20 20 20 20 69 66 28 20 63  atype;.    if( c
19170 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c 65 6d 70  p==0 ) cp = lemp
19180 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20 20 20 6a  ->vartype;.    j
19190 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
191a0 20 69 73 73 70 61 63 65 28 2a 63 70 29 20 29 20   isspace(*cp) ) 
191b0 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28  cp++;.    while(
191c0 20 2a 63 70 20 29 20 73 74 64 64 74 5b 6a 2b 2b   *cp ) stddt[j++
191d0 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20 20 20 77  ] = *cp++;.    w
191e0 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 69 73 73  hile( j>0 && iss
191f0 70 61 63 65 28 73 74 64 64 74 5b 6a 2d 31 5d 29  pace(stddt[j-1])
19200 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73 74 64 64   ) j--;.    stdd
19210 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66  t[j] = 0;.    if
19220 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70  ( lemp->tokentyp
19230 65 20 26 26 20 73 74 72 63 6d 70 28 73 74 64 64  e && strcmp(stdd
19240 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79  t, lemp->tokenty
19250 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pe)==0 ){.      
19260 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20  sp->dtnum = 0;. 
19270 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
19280 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20     }.    hash = 
19290 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
192a0 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  stddt[j]; j++){.
192b0 20 20 20 20 20 20 68 61 73 68 20 3d 20 68 61 73        hash = has
192c0 68 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b  h*53 + stddt[j];
192d0 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20  .    }.    hash 
192e0 3d 20 28 68 61 73 68 20 26 20 30 78 37 66 66 66  = (hash & 0x7fff
192f0 66 66 66 66 29 25 61 72 72 61 79 73 69 7a 65 3b  ffff)%arraysize;
19300 0a 20 20 20 20 77 68 69 6c 65 28 20 74 79 70 65  .    while( type
19310 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20  s[hash] ){.     
19320 20 69 66 28 20 73 74 72 63 6d 70 28 74 79 70 65   if( strcmp(type
19330 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d  s[hash],stddt)==
19340 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d  0 ){.        sp-
19350 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20  >dtnum = hash + 
19360 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
19370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19380 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hash++;.      if
19390 28 20 68 61 73 68 3e 3d 61 72 72 61 79 73 69 7a  ( hash>=arraysiz
193a0 65 20 29 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  e ) hash = 0;.  
193b0 20 20 7d 0a 20 20 20 20 69 66 28 20 74 79 70 65    }.    if( type
193c0 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20  s[hash]==0 ){.  
193d0 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
193e0 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20  hash + 1;.      
193f0 74 79 70 65 73 5b 68 61 73 68 5d 20 3d 20 28 63  types[hash] = (c
19400 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d  har*)malloc( lem
19410 6f 6e 53 74 72 6c 65 6e 28 73 74 64 64 74 29 2b  onStrlen(stddt)+
19420 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74  1 );.      if( t
19430 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b  ypes[hash]==0 ){
19440 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
19450 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
19460 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20  memory.\n");.   
19470 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
19480 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 72 63      }.      strc
19490 70 79 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73  py(types[hash],s
194a0 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  tddt);.    }.  }
194b0 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20 6f 75 74  ..  /* Print out
194c0 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   the definition 
194d0 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50 45 20 61  of YYTOKENTYPE a
194e0 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50 45 20 2a  nd YYMINORTYPE *
194f0 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d  /.  name = lemp-
19500 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61  >name ? lemp->na
19510 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20  me : "Parse";.  
19520 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e  lineno = *plinen
19530 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  o;.  if( mhflag 
19540 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
19550 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
19560 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
19570 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
19580 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e 54 59 50  efine %sTOKENTYP
19590 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a 20 20  E %s\n",name,.  
195a0 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70    lemp->tokentyp
195b0 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74 79 70  e?lemp->tokentyp
195c0 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20 6c 69 6e  e:"void*");  lin
195d0 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66  eno++;.  if( mhf
195e0 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  lag ){ fprintf(o
195f0 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
19600 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70  lineno++; }.  fp
19610 72 69 6e 74 66 28 6f 75 74 2c 22 74 79 70 65 64  rintf(out,"typed
19620 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29 3b 20  ef union {\n"); 
19630 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
19640 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79  ntf(out,"  int y
19650 79 69 6e 69 74 3b 5c 6e 22 29 3b 20 6c 69 6e 65  yinit;\n"); line
19660 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
19670 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59  out,"  %sTOKENTY
19680 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29  PE yy0;\n",name)
19690 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
196a0 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69  r(i=0; i<arraysi
196b0 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ze; i++){.    if
196c0 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20  ( types[i]==0 ) 
196d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70  continue;.    fp
196e0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 20  rintf(out,"  %s 
196f0 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69  yy%d;\n",types[i
19700 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ],i+1); lineno++
19710 3b 0a 20 20 20 20 66 72 65 65 28 74 79 70 65 73  ;.    free(types
19720 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [i]);.  }.  if( 
19730 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73  lemp->errsym->us
19740 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69  eCnt ){.    fpri
19750 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79  ntf(out,"  int y
19760 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72  y%d;\n",lemp->er
19770 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69  rsym->dtnum); li
19780 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 72  neno++;.  }.  fr
19790 65 65 28 73 74 64 64 74 29 3b 0a 20 20 66 72 65  ee(stddt);.  fre
197a0 65 28 74 79 70 65 73 29 3b 0a 20 20 66 70 72 69  e(types);.  fpri
197b0 6e 74 66 28 6f 75 74 2c 22 7d 20 59 59 4d 49 4e  ntf(out,"} YYMIN
197c0 4f 52 54 59 50 45 3b 5c 6e 22 29 3b 20 6c 69 6e  ORTYPE;\n"); lin
197d0 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c 69 6e 65 6e  eno++;.  *plinen
197e0 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f  o = lineno;.}../
197f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19800 6e 61 6d 65 20 6f 66 20 61 20 43 20 64 61 74 61  name of a C data
19810 74 79 70 65 20 61 62 6c 65 20 74 6f 20 72 65 70  type able to rep
19820 72 65 73 65 6e 74 20 76 61 6c 75 65 73 20 62 65  resent values be
19830 74 77 65 65 6e 0a 2a 2a 20 6c 77 72 20 61 6e 64  tween.** lwr and
19840 20 75 70 72 2c 20 69 6e 63 6c 75 73 69 76 65 2e   upr, inclusive.
19850 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
19860 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75 6d 5f 73   char *minimum_s
19870 69 7a 65 5f 74 79 70 65 28 69 6e 74 20 6c 77 72  ize_type(int lwr
19880 2c 20 69 6e 74 20 75 70 72 29 7b 0a 20 20 69 66  , int upr){.  if
19890 28 20 6c 77 72 3e 3d 30 20 29 7b 0a 20 20 20 20  ( lwr>=0 ){.    
198a0 69 66 28 20 75 70 72 3c 3d 32 35 35 20 29 7b 0a  if( upr<=255 ){.
198b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e        return "un
198c0 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20  signed char";.  
198d0 20 20 7d 65 6c 73 65 20 69 66 28 20 75 70 72 3c    }else if( upr<
198e0 36 35 35 33 35 20 29 7b 0a 20 20 20 20 20 20 72  65535 ){.      r
198f0 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20  eturn "unsigned 
19900 73 68 6f 72 74 20 69 6e 74 22 3b 0a 20 20 20 20  short int";.    
19910 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
19920 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 69 6e  urn "unsigned in
19930 74 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t";.    }.  }els
19940 65 20 69 66 28 20 6c 77 72 3e 3d 2d 31 32 37 20  e if( lwr>=-127 
19950 26 26 20 75 70 72 3c 3d 31 32 37 20 29 7b 0a 20  && upr<=127 ){. 
19960 20 20 20 72 65 74 75 72 6e 20 22 73 69 67 6e 65     return "signe
19970 64 20 63 68 61 72 22 3b 0a 20 20 7d 65 6c 73 65  d char";.  }else
19980 20 69 66 28 20 6c 77 72 3e 3d 2d 33 32 37 36 37   if( lwr>=-32767
19990 20 26 26 20 75 70 72 3c 33 32 37 36 37 20 29 7b   && upr<32767 ){
199a0 0a 20 20 20 20 72 65 74 75 72 6e 20 22 73 68 6f  .    return "sho
199b0 72 74 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rt";.  }else{.  
199c0 20 20 72 65 74 75 72 6e 20 22 69 6e 74 22 3b 0a    return "int";.
199d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 61 63    }.}../*.** Eac
199e0 68 20 73 74 61 74 65 20 63 6f 6e 74 61 69 6e 73  h state contains
199f0 20 61 20 73 65 74 20 6f 66 20 74 6f 6b 65 6e 20   a set of token 
19a00 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
19a10 61 20 73 65 74 20 6f 66 0a 2a 2a 20 6e 6f 6e 74  a set of.** nont
19a20 65 72 6d 69 6e 61 6c 20 74 72 61 6e 73 61 63 74  erminal transact
19a30 69 6f 6e 73 2e 20 20 45 61 63 68 20 6f 66 20 74  ions.  Each of t
19a40 68 65 73 65 20 73 65 74 73 20 6d 61 6b 65 73 20  hese sets makes 
19a50 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f  an instance.** o
19a60 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
19a70 73 74 72 75 63 74 75 72 65 2e 20 20 41 6e 20 61  structure.  An a
19a80 72 72 61 79 20 6f 66 20 74 68 65 73 65 20 73 74  rray of these st
19a90 72 75 63 74 75 72 65 73 20 69 73 20 75 73 65 64  ructures is used
19aa0 0a 2a 2a 20 74 6f 20 6f 72 64 65 72 20 74 68 65  .** to order the
19ab0 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 65 6e 74   creation of ent
19ac0 72 69 65 73 20 69 6e 20 74 68 65 20 79 79 5f 61  ries in the yy_a
19ad0 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a  ction[] table..*
19ae0 2f 0a 73 74 72 75 63 74 20 61 78 73 65 74 20 7b  /.struct axset {
19af0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
19b00 2a 73 74 70 3b 20 20 20 2f 2a 20 41 20 70 6f 69  *stp;   /* A poi
19b10 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 20  nter to a state 
19b20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 6b 6e 3b 20  */.  int isTkn; 
19b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
19b40 65 20 74 6f 20 75 73 65 20 74 6f 6b 65 6e 73 2e  e to use tokens.
19b50 20 20 46 61 6c 73 65 20 66 6f 72 20 6e 6f 6e 2d    False for non-
19b60 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69  terminals */.  i
19b70 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20  nt nAction;     
19b80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19b90 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   actions */.  in
19ba0 74 20 69 4f 72 64 65 72 3b 20 20 20 20 20 20 20  t iOrder;       
19bb0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6f     /* Original o
19bc0 72 64 65 72 20 6f 66 20 61 63 74 69 6f 6e 20 73  rder of action s
19bd0 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ets */.};../*.**
19be0 20 43 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65   Compare to axse
19bf0 74 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  t structures for
19c00 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65   sorting purpose
19c10 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
19c20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f  axset_compare(co
19c30 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e  nst void *a, con
19c40 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73  st void *b){.  s
19c50 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 31 20  truct axset *p1 
19c60 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a  = (struct axset*
19c70 29 61 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73  )a;.  struct axs
19c80 65 74 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74  et *p2 = (struct
19c90 20 61 78 73 65 74 2a 29 62 3b 0a 20 20 69 6e 74   axset*)b;.  int
19ca0 20 63 3b 0a 20 20 63 20 3d 20 70 32 2d 3e 6e 41   c;.  c = p2->nA
19cb0 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e 41 63 74  ction - p1->nAct
19cc0 69 6f 6e 3b 0a 20 20 69 66 28 20 63 3d 3d 30 20  ion;.  if( c==0 
19cd0 29 7b 0a 20 20 20 20 63 20 3d 20 70 32 2d 3e 69  ){.    c = p2->i
19ce0 4f 72 64 65 72 20 2d 20 70 31 2d 3e 69 4f 72 64  Order - p1->iOrd
19cf0 65 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  er;.  }.  assert
19d00 28 20 63 21 3d 30 20 7c 7c 20 70 31 3d 3d 70 32  ( c!=0 || p1==p2
19d10 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a   );.  return c;.
19d20 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  }../*.** Write t
19d30 65 78 74 20 6f 6e 20 22 6f 75 74 22 20 74 68 61  ext on "out" tha
19d40 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
19d50 72 75 6c 65 20 22 72 70 22 2e 0a 2a 2f 0a 73 74  rule "rp"..*/.st
19d60 61 74 69 63 20 76 6f 69 64 20 77 72 69 74 65 52  atic void writeR
19d70 75 6c 65 54 65 78 74 28 46 49 4c 45 20 2a 6f 75  uleText(FILE *ou
19d80 74 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  t, struct rule *
19d90 72 70 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  rp){.  int j;.  
19da0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 20  fprintf(out,"%s 
19db0 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e  ::=", rp->lhs->n
19dc0 61 6d 65 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  ame);.  for(j=0;
19dd0 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b   j<rp->nrhs; j++
19de0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
19df0 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
19e00 68 73 5b 6a 5d 3b 0a 20 20 20 20 66 70 72 69 6e  hs[j];.    fprin
19e10 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 20 73 70  tf(out," %s", sp
19e20 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  ->name);.    if(
19e30 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
19e40 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
19e50 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 66    int k;.      f
19e60 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73  or(k=1; k<sp->ns
19e70 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ubsym; k++){.   
19e80 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
19e90 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62 73 79  ,"|%s",sp->subsy
19ea0 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  m[k]->name);.   
19eb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
19ec0 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 43  .../* Generate C
19ed0 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72   source code for
19ee0 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76   the parser */.v
19ef0 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28  oid ReportTable(
19f00 6c 65 6d 70 2c 20 6d 68 66 6c 61 67 29 0a 73 74  lemp, mhflag).st
19f10 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
19f20 3b 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20  ;.int mhflag;   
19f30 20 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d    /* Output in m
19f40 61 6b 65 68 65 61 64 65 72 73 20 66 6f 72 6d 61  akeheaders forma
19f50 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 7b 0a 20  t if true */.{. 
19f60 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b   FILE *out, *in;
19f70 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e  .  char line[LIN
19f80 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c  ESIZE];.  int  l
19f90 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20  ineno;.  struct 
19fa0 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
19fb0 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
19fc0 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
19fd0 72 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  rp;.  struct act
19fe0 74 61 62 20 2a 70 41 63 74 74 61 62 3b 0a 20 20  tab *pActtab;.  
19ff0 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63  int i, j, n;.  c
1a000 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74  har *name;.  int
1a010 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b   mnTknOfst, mxTk
1a020 6e 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e  nOfst;.  int mnN
1a030 74 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b  tOfst, mxNtOfst;
1a040 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20  .  struct axset 
1a050 2a 61 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c  *ax;..  in = tpl
1a060 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20  t_open(lemp);.  
1a070 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75  if( in==0 ) retu
1a080 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65  rn;.  out = file
1a090 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c  _open(lemp,".c",
1a0a0 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74  "wb");.  if( out
1a0b0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73  ==0 ){.    fclos
1a0c0 65 28 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72  e(in);.    retur
1a0d0 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20  n;.  }.  lineno 
1a0e0 3d 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  = 1;.  tplt_xfer
1a0f0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1a100 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1a110 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1a120 69 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20 69 66  include code, if
1a130 20 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70   any */.  tplt_p
1a140 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
1a150 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c 69 6e  mp->include,&lin
1a160 65 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c  eno);.  if( mhfl
1a170 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ag ){.    char *
1a180 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65  name = file_make
1a190 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29  name(lemp, ".h")
1a1a0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1a1b0 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25 73  t,"#include \"%s
1a1c0 5c 22 5c 6e 22 2c 20 6e 61 6d 65 29 3b 20 6c 69  \"\n", name); li
1a1d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65  neno++;.    free
1a1e0 28 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70  (name);.  }.  tp
1a1f0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1a200 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1a210 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1a220 74 65 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20  te #defines for 
1a230 61 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20  all tokens */.  
1a240 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20  if( mhflag ){.  
1a250 20 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a    char *prefix;.
1a260 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a270 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e  "#if INTERFACE\n
1a280 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1a290 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
1a2a0 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78  nprefix ) prefix
1a2b0 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72   = lemp->tokenpr
1a2c0 65 66 69 78 3b 0a 20 20 20 20 65 6c 73 65 20 20  efix;.    else  
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20    prefix = "";. 
1a2f0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65     for(i=1; i<le
1a300 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69  mp->nterminal; i
1a310 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ++){.      fprin
1a320 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1a330 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70  %s%-30s %2d\n",p
1a340 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
1a350 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
1a360 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  .      lineno++;
1a370 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
1a380 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e  tf(out,"#endif\n
1a390 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1a3a0 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1a3b0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1a3c0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1a3d0 47 65 6e 65 72 61 74 65 20 74 68 65 20 64 65 66  Generate the def
1a3e0 69 6e 65 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74  ines */.  fprint
1a3f0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1a400 59 43 4f 44 45 54 59 50 45 20 25 73 5c 6e 22 2c  YCODETYPE %s\n",
1a410 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a  .    minimum_siz
1a420 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e  e_type(0, lemp->
1a430 6e 73 79 6d 62 6f 6c 2b 31 29 29 3b 20 6c 69 6e  nsymbol+1)); lin
1a440 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1a450 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1a460 4e 4f 43 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d  NOCODE %d\n",lem
1a470 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20  p->nsymbol+1);  
1a480 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1a490 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1a4a0 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 25 73   YYACTIONTYPE %s
1a4b0 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d  \n",.    minimum
1a4c0 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65  _size_type(0, le
1a4d0 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d  mp->nstate+lemp-
1a4e0 3e 6e 72 75 6c 65 2b 35 29 29 3b 20 20 6c 69 6e  >nrule+5));  lin
1a4f0 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d  eno++;.  if( lem
1a500 70 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20  p->wildcard ){. 
1a510 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a520 23 64 65 66 69 6e 65 20 59 59 57 49 4c 44 43 41  #define YYWILDCA
1a530 52 44 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  RD %d\n",.      
1a540 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 2d   lemp->wildcard-
1a550 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
1a560 2b 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 5f 73  +;.  }.  print_s
1a570 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c  tack_union(out,l
1a580 65 6d 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c  emp,&lineno,mhfl
1a590 61 67 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  ag);.  fprintf(o
1a5a0 75 74 2c 20 22 23 69 66 6e 64 65 66 20 59 59 53  ut, "#ifndef YYS
1a5b0 54 41 43 4b 44 45 50 54 48 5c 6e 22 29 3b 20 6c  TACKDEPTH\n"); l
1a5c0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c  ineno++;.  if( l
1a5d0 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29  emp->stacksize )
1a5e0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1a5f0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41  t,"#define YYSTA
1a600 43 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65  CKDEPTH %s\n",le
1a610 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20  mp->stacksize); 
1a620 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c   lineno++;.  }el
1a630 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
1a640 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53  out,"#define YYS
1a650 54 41 43 4b 44 45 50 54 48 20 31 30 30 5c 6e 22  TACKDEPTH 100\n"
1a660 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1a670 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1a680 20 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69   "#endif\n"); li
1a690 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d 68  neno++;.  if( mh
1a6a0 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69  flag ){.    fpri
1a6b0 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54  ntf(out,"#if INT
1a6c0 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65  ERFACE\n"); line
1a6d0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65  no++;.  }.  name
1a6e0 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20   = lemp->name ? 
1a6f0 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61  lemp->name : "Pa
1a700 72 73 65 22 3b 0a 20 20 69 66 28 20 6c 65 6d 70  rse";.  if( lemp
1a710 2d 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d 3e 61  ->arg && lemp->a
1a720 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  rg[0] ){.    int
1a730 20 69 3b 0a 20 20 20 20 69 20 3d 20 6c 65 6d 6f   i;.    i = lemo
1a740 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72  nStrlen(lemp->ar
1a750 67 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  g);.    while( i
1a760 3e 3d 31 20 26 26 20 69 73 73 70 61 63 65 28 6c  >=1 && isspace(l
1a770 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29  emp->arg[i-1]) )
1a780 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28   i--;.    while(
1a790 20 69 3e 3d 31 20 26 26 20 28 69 73 61 6c 6e 75   i>=1 && (isalnu
1a7a0 6d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  m(lemp->arg[i-1]
1a7b0 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69  ) || lemp->arg[i
1a7c0 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b  -1]=='_') ) i--;
1a7d0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a7e0 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1a7f0 53 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d  SDECL %s;\n",nam
1a800 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c  e,lemp->arg);  l
1a810 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1a820 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1a830 65 20 25 73 41 52 47 5f 50 44 45 43 4c 20 2c 25  e %sARG_PDECL ,%
1a840 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  s\n",name,lemp->
1a850 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  arg);  lineno++;
1a860 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a870 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1a880 46 45 54 43 48 20 25 73 20 3d 20 79 79 70 50 61  FETCH %s = yypPa
1a890 72 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20  rser->%s\n",.   
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
1a8b0 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65  me,lemp->arg,&le
1a8c0 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69  mp->arg[i]);  li
1a8d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1a8e0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1a8f0 20 25 73 41 52 47 5f 53 54 4f 52 45 20 79 79 70   %sARG_STORE yyp
1a900 50 61 72 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c  Parser->%s = %s\
1a910 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1a920 20 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d       name,&lemp-
1a930 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61  >arg[i],&lemp->a
1a940 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  rg[i]);  lineno+
1a950 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1a960 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1a970 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c  fine %sARG_SDECL
1a980 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65  \n",name);  line
1a990 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1a9a0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1a9b0 73 41 52 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61  sARG_PDECL\n",na
1a9c0 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  me);  lineno++;.
1a9d0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a9e0 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46  "#define %sARG_F
1a9f0 45 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  ETCH\n",name); l
1aa00 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1aa10 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1aa20 65 20 25 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22  e %sARG_STORE\n"
1aa30 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
1aa40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c  ;.  }.  if( mhfl
1aa50 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ag ){.    fprint
1aa60 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
1aa70 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1aa80 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1aa90 23 64 65 66 69 6e 65 20 59 59 4e 53 54 41 54 45  #define YYNSTATE
1aaa0 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74   %d\n",lemp->nst
1aab0 61 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ate);  lineno++;
1aac0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1aad0 23 64 65 66 69 6e 65 20 59 59 4e 52 55 4c 45 20  #define YYNRULE 
1aae0 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c  %d\n",lemp->nrul
1aaf0 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
1ab00 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79   if( lemp->errsy
1ab10 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20  m->useCnt ){.   
1ab20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1ab30 65 66 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d  efine YYERRORSYM
1ab40 42 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  BOL %d\n",lemp->
1ab50 65 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20  errsym->index); 
1ab60 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1ab70 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1ab80 69 6e 65 20 59 59 45 52 52 53 59 4d 44 54 20 79  ine YYERRSYMDT y
1ab90 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72  y%d\n",lemp->err
1aba0 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 20 6c 69  sym->dtnum);  li
1abb0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  neno++;.  }.  if
1abc0 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c  ( lemp->has_fall
1abd0 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 70 72 69  back ){.    fpri
1abe0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1abf0 20 59 59 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22   YYFALLBACK 1\n"
1ac00 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1ac10 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1ac20 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1ac30 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1ac40 47 65 6e 65 72 61 74 65 20 74 68 65 20 61 63 74  Generate the act
1ac50 69 6f 6e 20 74 61 62 6c 65 20 61 6e 64 20 69 74  ion table and it
1ac60 73 20 61 73 73 6f 63 69 61 74 65 73 3a 0a 20 20  s associates:.  
1ac70 2a 2a 0a 20 20 2a 2a 20 20 79 79 5f 61 63 74 69  **.  **  yy_acti
1ac80 6f 6e 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69  on[]        A si
1ac90 6e 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61  ngle table conta
1aca0 69 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e  ining all action
1acb0 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b  s..  **  yy_look
1acc0 61 68 65 61 64 5b 5d 20 20 20 20 20 41 20 74 61  ahead[]     A ta
1acd0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1ace0 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72  he lookahead for
1acf0 20 65 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 20   each entry in. 
1ad00 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
1ad10 20 20 20 20 20 20 20 20 79 79 5f 61 63 74 69 6f          yy_actio
1ad20 6e 2e 20 20 55 73 65 64 20 74 6f 20 64 65 74 65  n.  Used to dete
1ad30 63 74 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ct hash collisio
1ad40 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69  ns..  **  yy_shi
1ad50 66 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72  ft_ofst[]    For
1ad60 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65   each state, the
1ad70 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f   offset into yy_
1ad80 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20  action for.  ** 
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ada0 20 20 20 20 73 68 69 66 74 69 6e 67 20 74 65 72      shifting ter
1adb0 6d 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79  minals..  **  yy
1adc0 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20  _reduce_ofst[]  
1add0 20 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c   For each state,
1ade0 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f   the offset into
1adf0 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20   yy_action for. 
1ae00 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
1ae10 20 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67          shifting
1ae20 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61   non-terminals a
1ae30 66 74 65 72 20 61 20 72 65 64 75 63 65 2e 0a 20  fter a reduce.. 
1ae40 20 2a 2a 20 20 79 79 5f 64 65 66 61 75 6c 74 5b   **  yy_default[
1ae50 5d 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 20  ]       Default 
1ae60 61 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  action for each 
1ae70 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  state..  */..  /
1ae80 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63  * Compute the ac
1ae90 74 69 6f 6e 73 20 6f 6e 20 61 6c 6c 20 73 74 61  tions on all sta
1aea0 74 65 73 20 61 6e 64 20 63 6f 75 6e 74 20 74 68  tes and count th
1aeb0 65 6d 20 75 70 20 2a 2f 0a 20 20 61 78 20 3d 20  em up */.  ax = 
1aec0 63 61 6c 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 73 74  calloc(lemp->nst
1aed0 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78  ate*2, sizeof(ax
1aee0 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 61 78 3d  [0]));.  if( ax=
1aef0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
1af00 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63  f(stderr,"malloc
1af10 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20   failed\n");.   
1af20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
1af30 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1af40 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
1af50 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1af60 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78  orted[i];.    ax
1af70 5b 69 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b  [i*2].stp = stp;
1af80 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54  .    ax[i*2].isT
1af90 6b 6e 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69  kn = 1;.    ax[i
1afa0 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  *2].nAction = st
1afb0 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20  p->nTknAct;.    
1afc0 61 78 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20  ax[i*2+1].stp = 
1afd0 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b  stp;.    ax[i*2+
1afe0 31 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20  1].isTkn = 0;.  
1aff0 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74    ax[i*2+1].nAct
1b000 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63  ion = stp->nNtAc
1b010 74 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66  t;.  }.  mxTknOf
1b020 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d  st = mnTknOfst =
1b030 20 30 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d   0;.  mxNtOfst =
1b040 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 0a   mnNtOfst = 0;..
1b050 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
1b060 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20   action table.  
1b070 49 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 79 20  In order to try 
1b080 74 6f 20 6b 65 65 70 20 74 68 65 20 73 69 7a 65  to keep the size
1b090 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 61 63 74   of the.  ** act
1b0a0 69 6f 6e 20 74 61 62 6c 65 20 74 6f 20 61 20 6d  ion table to a m
1b0b0 69 6e 69 6d 75 6d 2c 20 74 68 65 20 68 65 75 72  inimum, the heur
1b0c0 69 73 74 69 63 20 6f 66 20 70 6c 61 63 69 6e 67  istic of placing
1b0d0 20 74 68 65 20 6c 61 72 67 65 73 74 20 61 63 74   the largest act
1b0e0 69 6f 6e 0a 20 20 2a 2a 20 73 65 74 73 20 66 69  ion.  ** sets fi
1b0f0 72 73 74 20 69 73 20 75 73 65 64 2e 0a 20 20 2a  rst is used..  *
1b100 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
1b110 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 3b 20 69  emp->nstate*2; i
1b120 2b 2b 29 20 61 78 5b 69 5d 2e 69 4f 72 64 65 72  ++) ax[i].iOrder
1b130 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 61 78   = i;.  qsort(ax
1b140 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  , lemp->nstate*2
1b150 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c  , sizeof(ax[0]),
1b160 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b   axset_compare);
1b170 0a 20 20 70 41 63 74 74 61 62 20 3d 20 61 63 74  .  pActtab = act
1b180 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66  tab_alloc();.  f
1b190 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1b1a0 6e 73 74 61 74 65 2a 32 20 26 26 20 61 78 5b 69  nstate*2 && ax[i
1b1b0 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b  ].nAction>0; i++
1b1c0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 61 78 5b  ){.    stp = ax[
1b1d0 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69 66 28 20  i].stp;.    if( 
1b1e0 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20  ax[i].isTkn ){. 
1b1f0 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d       for(ap=stp-
1b200 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1b210 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
1b220 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20  nt action;.     
1b230 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
1b240 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72  ndex>=lemp->nter
1b250 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
1b260 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e  ;.        action
1b270 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f   = compute_actio
1b280 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20  n(lemp, ap);.   
1b290 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c       if( action<
1b2a0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1b2b0 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74        acttab_act
1b2c0 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d  ion(pActtab, ap-
1b2d0 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69  >sp->index, acti
1b2e0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on);.      }.   
1b2f0 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74     stp->iTknOfst
1b300 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
1b310 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
1b320 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66   if( stp->iTknOf
1b330 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d  st<mnTknOfst ) m
1b340 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e  nTknOfst = stp->
1b350 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20  iTknOfst;.      
1b360 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  if( stp->iTknOfs
1b370 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78  t>mxTknOfst ) mx
1b380 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69  TknOfst = stp->i
1b390 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c  TknOfst;.    }el
1b3a0 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70  se{.      for(ap
1b3b0 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
1b3c0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1b3d0 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a      int action;.
1b3e0 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
1b3f0 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
1b400 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74  nterminal ) cont
1b410 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
1b420 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d  ( ap->sp->index=
1b430 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29  =lemp->nsymbol )
1b440 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1b450 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70     action = comp
1b460 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
1b470 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66   ap);.        if
1b480 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e  ( action<0 ) con
1b490 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1b4a0 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63  cttab_action(pAc
1b4b0 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e  ttab, ap->sp->in
1b4c0 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  dex, action);.  
1b4d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d      }.      stp-
1b4e0 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63 74 74 61  >iNtOfst = actta
1b4f0 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62  b_insert(pActtab
1b500 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
1b510 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66  ->iNtOfst<mnNtOf
1b520 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st ) mnNtOfst = 
1b530 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20  stp->iNtOfst;.  
1b540 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74      if( stp->iNt
1b550 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20  Ofst>mxNtOfst ) 
1b560 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e  mxNtOfst = stp->
1b570 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20  iNtOfst;.    }. 
1b580 20 7d 0a 20 20 66 72 65 65 28 61 78 29 3b 0a 0a   }.  free(ax);..
1b590 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1b5a0 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
1b5b0 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1b5c0 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59  ,"static const Y
1b5d0 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 61  YACTIONTYPE yy_a
1b5e0 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b  ction[] = {\n");
1b5f0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d   lineno++;.  n =
1b600 20 61 63 74 74 61 62 5f 73 69 7a 65 28 70 41 63   acttab_size(pAc
1b610 74 74 61 62 29 3b 0a 20 20 66 6f 72 28 69 3d 6a  ttab);.  for(i=j
1b620 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
1b630 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20     int action = 
1b640 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28  acttab_yyaction(
1b650 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20  pActtab, i);.   
1b660 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20   if( action<0 ) 
1b670 61 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  action = lemp->n
1b680 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  state + lemp->nr
1b690 75 6c 65 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  ule + 2;.    if(
1b6a0 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28   j==0 ) fprintf(
1b6b0 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20  out," /* %5d */ 
1b6c0 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e  ", i);.    fprin
1b6d0 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c  tf(out, " %4d,",
1b6e0 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 69 66   action);.    if
1b6f0 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
1b700 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1b710 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
1b720 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
1b730 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1b740 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
1b750 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
1b760 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
1b770 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74  eno++;..  /* Out
1b780 70 75 74 20 74 68 65 20 79 79 5f 6c 6f 6f 6b 61  put the yy_looka
1b790 68 65 61 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20  head table */.  
1b7a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61  fprintf(out,"sta
1b7b0 74 69 63 20 63 6f 6e 73 74 20 59 59 43 4f 44 45  tic const YYCODE
1b7c0 54 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65 61  TYPE yy_lookahea
1b7d0 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e  d[] = {\n"); lin
1b7e0 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a  eno++;.  for(i=j
1b7f0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
1b800 20 20 20 69 6e 74 20 6c 61 20 3d 20 61 63 74 74     int la = actt
1b810 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 70  ab_yylookahead(p
1b820 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20  Acttab, i);.    
1b830 69 66 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d 20  if( la<0 ) la = 
1b840 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20  lemp->nsymbol;. 
1b850 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
1b860 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1b870 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
1b880 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1b890 25 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20  %4d,", la);.    
1b8a0 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
1b8b0 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
1b8c0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
1b8d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1b8e0 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
1b8f0 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1b900 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
1b910 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
1b920 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
1b930 75 74 70 75 74 20 74 68 65 20 79 79 5f 73 68 69  utput the yy_shi
1b940 66 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20  ft_ofst[] table 
1b950 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1b960 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48  , "#define YY_SH
1b970 49 46 54 5f 55 53 45 5f 44 46 4c 54 20 28 25 64  IFT_USE_DFLT (%d
1b980 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 2d  )\n", mnTknOfst-
1b990 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1b9a0 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  n = lemp->nstate
1b9b0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
1b9c0 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e  & lemp->sorted[n
1b9d0 2d 31 5d 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d 4e  -1]->iTknOfst==N
1b9e0 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a  O_OFFSET ) n--;.
1b9f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1ba00 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54  #define YY_SHIFT
1ba10 5f 4d 41 58 20 25 64 5c 6e 22 2c 20 6e 2d 31 29  _MAX %d\n", n-1)
1ba20 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1ba30 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
1ba40 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 73  ic const %s yy_s
1ba50 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c  hift_ofst[] = {\
1ba60 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6d  n", .          m
1ba70 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
1ba80 28 6d 6e 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78  (mnTknOfst-1, mx
1ba90 54 6b 6e 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e  TknOfst)); linen
1baa0 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  o++;.  for(i=j=0
1bab0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1bac0 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73   int ofst;.    s
1bad0 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1bae0 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d  d[i];.    ofst =
1baf0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a   stp->iTknOfst;.
1bb00 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f      if( ofst==NO
1bb10 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d  _OFFSET ) ofst =
1bb20 20 6d 6e 54 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a   mnTknOfst - 1;.
1bb30 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1bb40 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1bb50 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1bb60 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1bb70 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20   %4d,", ofst);. 
1bb80 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69     if( j==9 || i
1bb90 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  ==n-1 ){.      f
1bba0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
1bbb0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1bbc0 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65     j = 0;.    }e
1bbd0 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  lse{.      j++;.
1bbe0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
1bbf0 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29  ntf(out, "};\n")
1bc00 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ; lineno++;..  /
1bc10 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f  * Output the yy_
1bc20 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61  reduce_ofst[] ta
1bc30 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
1bc40 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1bc50 59 5f 52 45 44 55 43 45 5f 55 53 45 5f 44 46 4c  Y_REDUCE_USE_DFL
1bc60 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f  T (%d)\n", mnNtO
1bc70 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  fst-1); lineno++
1bc80 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73  ;.  n = lemp->ns
1bc90 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e  tate;.  while( n
1bca0 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74  >0 && lemp->sort
1bcb0 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73 74  ed[n-1]->iNtOfst
1bcc0 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d  ==NO_OFFSET ) n-
1bcd0 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  -;.  fprintf(out
1bce0 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45  , "#define YY_RE
1bcf0 44 55 43 45 5f 4d 41 58 20 25 64 5c 6e 22 2c 20  DUCE_MAX %d\n", 
1bd00 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n-1); lineno++;.
1bd10 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1bd20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20  static const %s 
1bd30 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d  yy_reduce_ofst[]
1bd40 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20   = {\n", .      
1bd50 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
1bd60 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31  _type(mnNtOfst-1
1bd70 2c 20 6d 78 4e 74 4f 66 73 74 29 29 3b 20 6c 69  , mxNtOfst)); li
1bd80 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
1bd90 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
1bda0 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20      int ofst;.  
1bdb0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
1bdc0 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73  rted[i];.    ofs
1bdd0 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
1bde0 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d  ;.    if( ofst==
1bdf0 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74  NO_OFFSET ) ofst
1be00 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b   = mnNtOfst - 1;
1be10 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
1be20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1be30 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
1be40 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1be50 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a  " %4d,", ofst);.
1be60 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1be70 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1be80 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1be90 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1bea0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1beb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1bec0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1bed0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1bee0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1bef0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64 65  /* Output the de
1bf00 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61 62  fault action tab
1bf10 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  le */.  fprintf(
1bf20 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e  out, "static con
1bf30 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20  st YYACTIONTYPE 
1bf40 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b  yy_default[] = {
1bf50 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1bf60 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61    n = lemp->nsta
1bf70 74 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  te;.  for(i=j=0;
1bf80 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
1bf90 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
1bfa0 65 64 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 6a  ed[i];.    if( j
1bfb0 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1bfc0 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1bfd0 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1bfe0 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 73  (out, " %4d,", s
1bff0 74 70 2d 3e 69 44 66 6c 74 29 3b 0a 20 20 20 20  tp->iDflt);.    
1c000 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
1c010 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
1c020 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
1c030 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1c040 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
1c050 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
1c060 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
1c070 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
1c080 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f  ineno++;.  tplt_
1c090 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1c0a0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1c0b0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1c0c0 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66 61 6c  the table of fal
1c0d0 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20  lback tokens..  
1c0e0 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68  */.  if( lemp->h
1c0f0 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  as_fallback ){. 
1c100 20 20 20 69 6e 74 20 6d 78 20 3d 20 6c 65 6d 70     int mx = lemp
1c110 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 2d 20 31 3b  ->nterminal - 1;
1c120 0a 20 20 20 20 77 68 69 6c 65 28 20 6d 78 3e 30  .    while( mx>0
1c130 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c   && lemp->symbol
1c140 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62 61 63 6b 3d  s[mx]->fallback=
1c150 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20 7d 0a 20 20  =0 ){ mx--; }.  
1c160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6d 78    for(i=0; i<=mx
1c170 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1c180 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20 3d  ruct symbol *p =
1c190 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1c1a0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ];.      if( p->
1c1b0 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20  fallback==0 ){. 
1c1c0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1c1d0 75 74 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a 20  ut, "    0,  /* 
1c1e0 25 31 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67 20  %10s => nothing 
1c1f0 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b  */\n", p->name);
1c200 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c210 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1c220 74 2c 20 22 20 20 25 33 64 2c 20 20 2f 2a 20 25  t, "  %3d,  /* %
1c230 31 30 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c  10s => %s */\n",
1c240 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e   p->fallback->in
1c250 64 65 78 2c 0a 20 20 20 20 20 20 20 20 20 20 70  dex,.          p
1c260 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62  ->name, p->fallb
1c270 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ack->name);.    
1c280 20 20 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f    }.      lineno
1c290 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1c2a0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1c2b0 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20 26  name, in, out, &
1c2c0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1c2d0 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65 20  enerate a table 
1c2e0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73  containing the s
1c2f0 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20  ymbolic name of 
1c300 65 76 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20 2a  every symbol.  *
1c310 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
1c320 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
1c330 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  +){.    sprintf(
1c340 6c 69 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c  line,"\"%s\",",l
1c350 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1c360 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70 72 69  >name);.    fpri
1c370 6e 74 66 28 6f 75 74 2c 22 20 20 25 2d 31 35 73  ntf(out,"  %-15s
1c380 22 2c 6c 69 6e 65 29 3b 0a 20 20 20 20 69 66 28  ",line);.    if(
1c390 20 28 69 26 33 29 3d 3d 33 20 29 7b 20 66 70 72   (i&3)==3 ){ fpr
1c3a0 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20  intf(out,"\n"); 
1c3b0 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a  lineno++; }.  }.
1c3c0 20 20 69 66 28 20 28 69 26 33 29 21 3d 30 20 29    if( (i&3)!=0 )
1c3d0 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c  { fprintf(out,"\
1c3e0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
1c3f0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1c400 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1c410 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1c420 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65 20  enerate a table 
1c430 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 65 78  containing a tex
1c440 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  t string that de
1c450 73 63 72 69 62 65 73 20 65 76 65 72 79 0a 20 20  scribes every.  
1c460 2a 2a 20 72 75 6c 65 20 69 6e 20 74 68 65 20 72  ** rule in the r
1c470 75 6c 65 20 73 65 74 20 6f 66 20 74 68 65 20 67  ule set of the g
1c480 72 61 6d 6d 61 72 2e 20 20 54 68 69 73 20 69 6e  rammar.  This in
1c490 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
1c4a0 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 72 61 63  d.  ** when trac
1c4b0 69 6e 67 20 52 45 44 55 43 45 20 61 63 74 69 6f  ing REDUCE actio
1c4c0 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
1c4d0 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  =0, rp=lemp->rul
1c4e0 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
1c4f0 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  xt, i++){.    as
1c500 73 65 72 74 28 20 72 70 2d 3e 69 6e 64 65 78 3d  sert( rp->index=
1c510 3d 69 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  =i );.    fprint
1c520 66 28 6f 75 74 2c 22 20 2f 2a 20 25 33 64 20 2a  f(out," /* %3d *
1c530 2f 20 5c 22 22 2c 20 69 29 3b 0a 20 20 20 20 77  / \"", i);.    w
1c540 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74  riteRuleText(out
1c550 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e  , rp);.    fprin
1c560 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22 29 3b  tf(out,"\",\n");
1c570 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1c580 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1c590 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1c5a0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1c5b0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1c5c0 20 65 78 65 63 75 74 65 73 20 65 76 65 72 79 20   executes every 
1c5d0 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20 69 73  time a symbol is
1c5e0 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20 20 2a   popped from.  *
1c5f0 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68 69 6c  * the stack whil
1c600 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65 72 72  e processing err
1c610 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64 65 73  ors or while des
1c620 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61 72 73  troying the pars
1c630 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20 6f 74  er. .  ** (In ot
1c640 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e 65 72  her words, gener
1c650 61 74 65 20 74 68 65 20 25 64 65 73 74 72 75 63  ate the %destruc
1c660 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20 20 2a  tor actions).  *
1c670 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f  /.  if( lemp->to
1c680 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20 20 69  kendest ){.    i
1c690 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
1c6a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1c6b0 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
1c6c0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
1c6d0 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
1c6e0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1c6f0 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
1c700 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  sp->type!=TERMIN
1c710 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  AL ) continue;. 
1c720 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b       if( once ){
1c730 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1c740 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20  (out, "      /* 
1c750 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75 63  TERMINAL Destruc
1c760 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65  tor */\n"); line
1c770 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e  no++;.        on
1c780 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ce = 0;.      }.
1c790 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1c7a0 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20  t,"    case %d: 
1c7b0 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d  /* %s */\n", sp-
1c7c0 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65  >index, sp->name
1c7d0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1c7e0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
1c7f0 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  i<lemp->nsymbol 
1c800 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  && lemp->symbols
1c810 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49  [i]->type!=TERMI
1c820 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69  NAL; i++);.    i
1c830 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  f( i<lemp->nsymb
1c840 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74  ol ){.      emit
1c850 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65  _destructor_code
1c860 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  (out,lemp->symbo
1c870 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65  ls[i],lemp,&line
1c880 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  no);.      fprin
1c890 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72  tf(out,"      br
1c8a0 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
1c8b0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1c8c0 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73  if( lemp->vardes
1c8d0 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  t ){.    struct 
1c8e0 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73 70 20  symbol *dflt_sp 
1c8f0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63  = 0;.    int onc
1c900 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e = 1;.    for(i
1c910 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1c920 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  bol; i++){.     
1c930 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1c940 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
1c950 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
1c960 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79   sp==0 || sp->ty
1c970 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 0a  pe==TERMINAL ||.
1c980 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e            sp->in
1c990 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e 64 65  dex<=0 || sp->de
1c9a0 73 74 72 75 63 74 6f 72 21 3d 30 20 29 20 63 6f  structor!=0 ) co
1c9b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1c9c0 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20  ( once ){.      
1c9d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c9e0 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74        /* Default
1c9f0 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41 4c 20 44 65   NON-TERMINAL De
1ca00 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b  structor */\n");
1ca10 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1ca20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
1ca30 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
1ca40 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
1ca50 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22   %d: /* %s */\n"
1ca60 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d  , sp->index, sp-
1ca70 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
1ca80 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73 70 20  ;.      dflt_sp 
1ca90 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = sp;.    }.    
1caa0 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30 20 29  if( dflt_sp!=0 )
1cab0 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73  {.      emit_des
1cac0 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
1cad0 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c  ,dflt_sp,lemp,&l
1cae0 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  ineno);.    }.  
1caf0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1cb00 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
1cb10 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1cb20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1cb30 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
1cb40 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
1cb50 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1cb60 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69  ymbols[i];.    i
1cb70 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e  f( sp==0 || sp->
1cb80 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c  type==TERMINAL |
1cb90 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  | sp->destructor
1cba0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1cbb0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1cbc0 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a  "    case %d: /*
1cbd0 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69   %s */\n", sp->i
1cbe0 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b  ndex, sp->name);
1cbf0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20   lineno++;..    
1cc00 2f 2a 20 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69  /* Combine dupli
1cc10 63 61 74 65 20 64 65 73 74 72 75 63 74 6f 72 73  cate destructors
1cc20 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 63   into a single c
1cc30 61 73 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ase */.    for(j
1cc40 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73  =i+1; j<lemp->ns
1cc50 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ymbol; j++){.   
1cc60 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1cc70 20 2a 73 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79   *sp2 = lemp->sy
1cc80 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20  mbols[j];.      
1cc90 69 66 28 20 73 70 32 20 26 26 20 73 70 32 2d 3e  if( sp2 && sp2->
1cca0 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26  type!=TERMINAL &
1ccb0 26 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f  & sp2->destructo
1ccc0 72 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  r.          && s
1ccd0 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64  p2->dtnum==sp->d
1cce0 74 6e 75 6d 0a 20 20 20 20 20 20 20 20 20 20 26  tnum.          &
1ccf0 26 20 73 74 72 63 6d 70 28 73 70 2d 3e 64 65 73  & strcmp(sp->des
1cd00 74 72 75 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73  tructor,sp2->des
1cd10 74 72 75 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20  tructor)==0 ){. 
1cd20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1cd30 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
1cd40 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20  : /* %s */\n",. 
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 73 70 32 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d  sp2->index, sp2-
1cd70 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
1cd80 3b 0a 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e  ;.         sp2->
1cd90 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a  destructor = 0;.
1cda0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1cdb0 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74     emit_destruct
1cdc0 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70  or_code(out,lemp
1cdd0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d  ->symbols[i],lem
1cde0 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
1cdf0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1ce00 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
1ce10 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1ce20 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1ce30 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1ce40 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1ce50 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1ce60 78 65 63 75 74 65 73 20 77 68 65 6e 65 76 65 72  xecutes whenever
1ce70 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63   the parser stac
1ce80 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  k overflows */. 
1ce90 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1cea0 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66  lemp,lemp->overf
1ceb0 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  low,&lineno);.  
1cec0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1ced0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1cee0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1cef0 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f  rate the table o
1cf00 66 20 72 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69  f rule informati
1cf10 6f 6e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f  on .  **.  ** No
1cf20 74 65 3a 20 54 68 69 73 20 63 6f 64 65 20 64 65  te: This code de
1cf30 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
1cf40 74 20 74 68 61 74 20 72 75 6c 65 73 20 61 72 65  t that rules are
1cf50 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71   number.  ** seq
1cf60 75 65 6e 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e  uentually beginn
1cf70 69 6e 67 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f  ing with 0..  */
1cf80 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
1cf90 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
1cfa0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69  >next){.    fpri
1cfb0 6e 74 66 28 6f 75 74 2c 22 20 20 7b 20 25 64 2c  ntf(out,"  { %d,
1cfc0 20 25 64 20 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68   %d },\n",rp->lh
1cfd0 73 2d 3e 69 6e 64 65 78 2c 72 70 2d 3e 6e 72 68  s->index,rp->nrh
1cfe0 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  s); lineno++;.  
1cff0 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1d000 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1d010 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1d020 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
1d030 69 63 68 20 65 78 65 63 75 74 69 6f 6e 20 64 75  ich execution du
1d040 72 69 6e 67 20 65 61 63 68 20 52 45 44 55 43 45  ring each REDUCE
1d050 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72   action */.  for
1d060 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
1d070 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
1d080 7b 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 5f  {.    translate_
1d090 63 6f 64 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a  code(lemp, rp);.
1d0a0 20 20 7d 0a 20 20 2f 2a 20 46 69 72 73 74 20 6f    }.  /* First o
1d0b0 75 74 70 75 74 20 72 75 6c 65 73 20 6f 74 68 65  utput rules othe
1d0c0 72 20 74 68 61 6e 20 74 68 65 20 64 65 66 61 75  r than the defau
1d0d0 6c 74 3a 20 72 75 6c 65 20 2a 2f 0a 20 20 66 6f  lt: rule */.  fo
1d0e0 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
1d0f0 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
1d100 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  ){.    struct ru
1d110 6c 65 20 2a 72 70 32 3b 20 20 20 20 20 20 20 20  le *rp2;        
1d120 20 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 20         /* Other 
1d130 72 75 6c 65 73 20 77 69 74 68 20 74 68 65 20 73  rules with the s
1d140 61 6d 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ame action */.  
1d150 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d    if( rp->code==
1d160 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1d170 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 5b 30    if( rp->code[0
1d180 5d 3d 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63  ]=='\n' && rp->c
1d190 6f 64 65 5b 31 5d 3d 3d 30 20 29 20 63 6f 6e 74  ode[1]==0 ) cont
1d1a0 69 6e 75 65 3b 20 2f 2a 20 57 69 6c 6c 20 62 65  inue; /* Will be
1d1b0 20 64 65 66 61 75 6c 74 3a 20 2a 2f 0a 20 20 20   default: */.   
1d1c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1d1d0 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20      case %d: /* 
1d1e0 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  ", rp->index);. 
1d1f0 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74     writeRuleText
1d200 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66  (out, rp);.    f
1d210 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f  printf(out, " */
1d220 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1d230 20 20 20 20 66 6f 72 28 72 70 32 3d 72 70 2d 3e      for(rp2=rp->
1d240 6e 65 78 74 3b 20 72 70 32 3b 20 72 70 32 3d 72  next; rp2; rp2=r
1d250 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  p2->next){.     
1d260 20 69 66 28 20 72 70 32 2d 3e 63 6f 64 65 3d 3d   if( rp2->code==
1d270 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20  rp->code ){.    
1d280 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1d290 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a 20  "      case %d: 
1d2a0 2f 2a 20 22 2c 20 72 70 32 2d 3e 69 6e 64 65 78  /* ", rp2->index
1d2b0 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65  );.        write
1d2c0 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70  RuleText(out, rp
1d2d0 32 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  2);.        fpri
1d2e0 6e 74 66 28 6f 75 74 2c 22 20 2a 2f 20 79 79 74  ntf(out," */ yyt
1d2f0 65 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f  estcase(yyruleno
1d300 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 32 2d 3e  ==%d);\n", rp2->
1d310 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  index); lineno++
1d320 3b 0a 20 20 20 20 20 20 20 20 72 70 32 2d 3e 63  ;.        rp2->c
1d330 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ode = 0;.      }
1d340 0a 20 20 20 20 7d 0a 20 20 20 20 65 6d 69 74 5f  .    }.    emit_
1d350 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70  code(out,rp,lemp
1d360 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66  ,&lineno);.    f
1d370 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1d380 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
1d390 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 72 70  lineno++;.    rp
1d3a0 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 7d 0a  ->code = 0;.  }.
1d3b0 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6f 75    /* Finally, ou
1d3c0 74 70 75 74 20 74 68 65 20 64 65 66 61 75 6c 74  tput the default
1d3d0 3a 20 72 75 6c 65 2e 20 20 57 65 20 63 68 6f 6f  : rule.  We choo
1d3e0 73 65 20 61 73 20 74 68 65 20 64 65 66 61 75 6c  se as the defaul
1d3f0 74 3a 20 61 6c 6c 0a 20 20 2a 2a 20 65 6d 70 74  t: all.  ** empt
1d400 79 20 61 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  y actions. */.  
1d410 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1d420 20 20 20 64 65 66 61 75 6c 74 3a 5c 6e 22 29 3b     default:\n");
1d430 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
1d440 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
1d450 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
1d460 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f  {.    if( rp->co
1d470 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  de==0 ) continue
1d480 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70  ;.    assert( rp
1d490 2d 3e 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20  ->code[0]=='\n' 
1d4a0 26 26 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d  && rp->code[1]==
1d4b0 30 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 );.    fprintf
1d4c0 28 6f 75 74 2c 22 20 20 20 20 20 20 2f 2a 20 28  (out,"      /* (
1d4d0 25 64 29 20 22 2c 20 72 70 2d 3e 69 6e 64 65 78  %d) ", rp->index
1d4e0 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65  );.    writeRule
1d4f0 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20  Text(out, rp);. 
1d500 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1d510 22 20 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28  " */ yytestcase(
1d520 79 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e  yyruleno==%d);\n
1d530 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b 20 6c  ", rp->index); l
1d540 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
1d550 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1d560 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
1d570 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74  lineno++;.  tplt
1d580 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1d590 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1d5a0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1d5b0 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
1d5c0 75 74 65 73 20 69 66 20 61 20 70 61 72 73 65 20  utes if a parse 
1d5d0 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  fails */.  tplt_
1d5e0 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
1d5f0 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 26 6c 69  emp->failure,&li
1d600 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1d610 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1d620 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1d630 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1d640 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1d650 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78 20  s when a syntax 
1d660 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
1d670 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1d680 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f  ,lemp,lemp->erro
1d690 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70  r,&lineno);.  tp
1d6a0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1d6b0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1d6c0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1d6d0 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1d6e0 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20  ecutes when the 
1d6f0 70 61 72 73 65 72 20 61 63 63 65 70 74 73 20 69  parser accepts i
1d700 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70  ts input */.  tp
1d710 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
1d720 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c 26  p,lemp->accept,&
1d730 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
1d740 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1d750 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1d760 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e  ..  /* Append an
1d770 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64 65 20  y addition code 
1d780 74 68 65 20 75 73 65 72 20 64 65 73 69 72 65 73  the user desires
1d790 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1d7a0 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1d7b0 65 78 74 72 61 63 6f 64 65 2c 26 6c 69 6e 65 6e  extracode,&linen
1d7c0 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e  o);..  fclose(in
1d7d0 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29  );.  fclose(out)
1d7e0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
1d7f0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 65 61  * Generate a hea
1d800 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65  der file for the
1d810 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20   parser */.void 
1d820 52 65 70 6f 72 74 48 65 61 64 65 72 28 6c 65 6d  ReportHeader(lem
1d830 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
1d840 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c 45 20  *lemp;.{.  FILE 
1d850 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61  *out, *in;.  cha
1d860 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61  r *prefix;.  cha
1d870 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
1d880 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65 72 6e  ;.  char pattern
1d890 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LINESIZE];.  in
1d8a0 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70  t i;..  if( lemp
1d8b0 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20  ->tokenprefix ) 
1d8c0 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74  prefix = lemp->t
1d8d0 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c  okenprefix;.  el
1d8e0 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
1d8f0 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22        prefix = "
1d900 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f  ";.  in = file_o
1d910 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72  pen(lemp,".h","r
1d920 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b  b");.  if( in ){
1d930 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
1d940 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
1d950 26 26 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49  && fgets(line,LI
1d960 4e 45 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29  NESIZE,in); i++)
1d970 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28  {.      sprintf(
1d980 70 61 74 74 65 72 6e 2c 22 23 64 65 66 69 6e 65  pattern,"#define
1d990 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c   %s%-30s %2d\n",
1d9a0 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d  prefix,lemp->sym
1d9b0 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29  bols[i]->name,i)
1d9c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  ;.      if( strc
1d9d0 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29  mp(line,pattern)
1d9e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
1d9f0 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
1da00 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d      if( i==lemp-
1da10 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20  >nterminal ){.  
1da20 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65      /* No change
1da30 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 44   in the file.  D
1da40 6f 6e 27 74 20 72 65 77 72 69 74 65 20 69 74 2e  on't rewrite it.
1da50 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1da60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75  ;.    }.  }.  ou
1da70 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  t = file_open(le
1da80 6d 70 2c 22 2e 68 22 2c 22 77 62 22 29 3b 0a 20  mp,".h","wb");. 
1da90 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
1daa0 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1dab0 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
1dac0 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1dad0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
1dae0 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
1daf0 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
1db00 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
1db10 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f    }.    fclose(o
1db20 75 74 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74  ut);  .  }.  ret
1db30 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63  urn;.}../* Reduc
1db40 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1db50 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c  e action tables,
1db60 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79   if possible, by
1db70 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f   making use.** o
1db80 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a  f defaults..**.*
1db90 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
1dba0 6e 2c 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d  n, we take the m
1dbb0 6f 73 74 20 66 72 65 71 75 65 6e 74 20 52 45 44  ost frequent RED
1dbc0 55 43 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d  UCE action and m
1dbd0 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65  ake.** it the de
1dbe0 66 61 75 6c 74 2e 20 20 45 78 63 65 70 74 2c 20  fault.  Except, 
1dbf0 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61  there is no defa
1dc00 75 6c 74 20 69 66 20 74 68 65 20 77 69 6c 64 63  ult if the wildc
1dc10 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20  ard token.** is 
1dc20 61 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d  a possible look-
1dc30 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43  ahead..*/.void C
1dc40 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 6c 65  ompressTables(le
1dc50 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
1dc60 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
1dc70 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1dc80 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1dc90 61 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72 75  ap, *ap2;.  stru
1dca0 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70  ct rule *rp, *rp
1dcb0 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74  2, *rbest;.  int
1dcc0 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74   nbest, n;.  int
1dcd0 20 69 3b 0a 20 20 69 6e 74 20 75 73 65 73 57 69   i;.  int usesWi
1dce0 6c 64 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69  ldcard;..  for(i
1dcf0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
1dd00 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
1dd10 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1dd20 5b 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d  [i];.    nbest =
1dd30 20 30 3b 0a 20 20 20 20 72 62 65 73 74 20 3d 20   0;.    rbest = 
1dd40 30 3b 0a 20 20 20 20 75 73 65 73 57 69 6c 64 63  0;.    usesWildc
1dd50 61 72 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f  ard = 0;..    fo
1dd60 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1dd70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1dd80 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1dd90 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 2d  pe==SHIFT && ap-
1dda0 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63  >sp==lemp->wildc
1ddb0 61 72 64 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ard ){.        u
1ddc0 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20 31 3b  sesWildcard = 1;
1ddd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1dde0 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 52 45 44  f( ap->type!=RED
1ddf0 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UCE ) continue;.
1de00 20 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78        rp = ap->x
1de10 2e 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72  .rp;.      if( r
1de20 70 2d 3e 6c 68 73 53 74 61 72 74 20 29 20 63 6f  p->lhsStart ) co
1de30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1de40 28 20 72 70 3d 3d 72 62 65 73 74 20 29 20 63 6f  ( rp==rbest ) co
1de50 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20  ntinue;.      n 
1de60 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 61  = 1;.      for(a
1de70 70 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32  p2=ap->next; ap2
1de80 3b 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29  ; ap2=ap2->next)
1de90 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  {.        if( ap
1dea0 32 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20  2->type!=REDUCE 
1deb0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1dec0 20 20 20 20 72 70 32 20 3d 20 61 70 32 2d 3e 78      rp2 = ap2->x
1ded0 2e 72 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28  .rp;.        if(
1dee0 20 72 70 32 3d 3d 72 62 65 73 74 20 29 20 63 6f   rp2==rbest ) co
1def0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1df00 69 66 28 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b  if( rp2==rp ) n+
1df10 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
1df20 20 69 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a   if( n>nbest ){.
1df30 20 20 20 20 20 20 20 20 6e 62 65 73 74 20 3d 20          nbest = 
1df40 6e 3b 0a 20 20 20 20 20 20 20 20 72 62 65 73 74  n;.        rbest
1df50 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20   = rp;.      }. 
1df60 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f     }. .    /* Do
1df70 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65 66 61   not make a defa
1df80 75 6c 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65  ult if the numbe
1df90 72 20 6f 66 20 72 75 6c 65 73 20 74 6f 20 64 65  r of rules to de
1dfa0 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20  fault.    ** is 
1dfb0 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 31 20 6f  not at least 1 o
1dfc0 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61 72  r if the wildcar
1dfd0 64 20 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f 73  d token is a pos
1dfe0 73 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f  sible.    ** loo
1dff0 6b 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a 20  kahead..    */. 
1e000 20 20 20 69 66 28 20 6e 62 65 73 74 3c 31 20 7c     if( nbest<1 |
1e010 7c 20 75 73 65 73 57 69 6c 64 63 61 72 64 20 29  | usesWildcard )
1e020 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20   continue;...   
1e030 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63   /* Combine matc
1e040 68 69 6e 67 20 52 45 44 55 43 45 20 61 63 74 69  hing REDUCE acti
1e050 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ons into a singl
1e060 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20  e default */.   
1e070 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1e080 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1e090 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
1e0a0 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
1e0b0 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74   ap->x.rp==rbest
1e0c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
1e0d0 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20 29      assert( ap )
1e0e0 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20 53  ;.    ap->sp = S
1e0f0 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61  ymbol_new("{defa
1e100 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28  ult}");.    for(
1e110 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b  ap=ap->next; ap;
1e120 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1e130 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
1e140 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d  e==REDUCE && ap-
1e150 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 61  >x.rp==rbest ) a
1e160 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53  p->type = NOT_US
1e170 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  ED;.    }.    st
1e180 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73  p->ap = Action_s
1e190 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20  ort(stp->ap);.  
1e1a0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  }.}.../*.** Comp
1e1b0 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 66  are two states f
1e1c0 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f  or sorting purpo
1e1d0 73 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65  ses.  The smalle
1e1e0 72 20 73 74 61 74 65 20 69 73 20 74 68 65 0a 2a  r state is the.*
1e1f0 2a 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d  * one with the m
1e200 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ost non-terminal
1e210 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68   actions.  If th
1e220 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
1e230 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f   number.** of no
1e240 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f  n-terminal actio
1e250 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d 61  ns, then the sma
1e260 6c 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20  ller is the one 
1e270 77 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a  with the most.**
1e280 20 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a   token actions..
1e290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
1e2a0 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65  ateResortCompare
1e2b0 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20  (const void *a, 
1e2c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a  const void *b){.
1e2d0 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
1e2e0 74 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e  tate *pA = *(con
1e2f0 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65 2a  st struct state*
1e300 2a 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72  *)a;.  const str
1e310 75 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d 20  uct state *pB = 
1e320 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  *(const struct s
1e330 74 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20  tate**)b;.  int 
1e340 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e  n;..  n = pB->nN
1e350 74 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63  tAct - pA->nNtAc
1e360 74 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  t;.  if( n==0 ){
1e370 0a 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b  .    n = pB->nTk
1e380 6e 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41  nAct - pA->nTknA
1e390 63 74 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  ct;.    if( n==0
1e3a0 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 42   ){.      n = pB
1e3b0 2d 3e 73 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d  ->statenum - pA-
1e3c0 3e 73 74 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d  >statenum;.    }
1e3d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1e3e0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1e3f0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e  n;.}.../*.** Ren
1e400 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f 72 74  umber and resort
1e410 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20   states so that 
1e420 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65  states with fewe
1e430 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63  r choices.** occ
1e440 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ur at the end.  
1e450 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73 74 61  Except, keep sta
1e460 74 65 20 30 20 61 73 20 74 68 65 20 66 69 72 73  te 0 as the firs
1e470 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  t state..*/.void
1e480 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 6c 65   ResortStates(le
1e490 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
1e4a0 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
1e4b0 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
1e4c0 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
1e4d0 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20   action *ap;..  
1e4e0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1e4f0 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
1e500 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1e510 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74  orted[i];.    st
1e520 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70  p->nTknAct = stp
1e530 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20  ->nNtAct = 0;.  
1e540 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 6c    stp->iDflt = l
1e550 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
1e560 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 73  mp->nrule;.    s
1e570 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e  tp->iTknOfst = N
1e580 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74  O_OFFSET;.    st
1e590 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f  p->iNtOfst = NO_
1e5a0 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28  OFFSET;.    for(
1e5b0 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
1e5c0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1e5d0 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74 65 5f      if( compute_
1e5e0 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e  action(lemp,ap)>
1e5f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
1e600 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c  ( ap->sp->index<
1e610 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
1e620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70  ){.          stp
1e630 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20  ->nTknAct++;.   
1e640 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
1e650 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d  p->sp->index<lem
1e660 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20  p->nsymbol ){.  
1e670 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74          stp->nNt
1e680 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Act++;.        }
1e690 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e6a0 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f 6d  stp->iDflt = com
1e6b0 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
1e6c0 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  , ap);.        }
1e6d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e6e0 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70   }.  qsort(&lemp
1e6f0 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d  ->sorted[1], lem
1e700 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a  p->nstate-1, siz
1e710 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  eof(lemp->sorted
1e720 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74  [0]),.        st
1e730 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65  ateResortCompare
1e740 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1e750 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
1e760 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f  +){.    lemp->so
1e770 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75  rted[i]->statenu
1e780 6d 20 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  m = i;.  }.}.../
1e790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e7a0 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
1e7b0 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  "set.c" ********
1e7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
1e7e0 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61  .** Set manipula
1e7f0 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f  tion routines fo
1e800 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
1e810 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
1e820 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a  ..static int siz
1e830 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74  e = 0;../* Set t
1e840 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76  he set size */.v
1e850 6f 69 64 20 53 65 74 53 69 7a 65 28 6e 29 0a 69  oid SetSize(n).i
1e860 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69 7a 65 20 3d  nt n;.{.  size =
1e870 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f   n+1;.}../* Allo
1e880 63 61 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a  cate a new set *
1e890 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 29  /.char *SetNew()
1e8a0 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20 20 73  {.  char *s;.  s
1e8b0 20 3d 20 28 63 68 61 72 2a 29 63 61 6c 6c 6f 63   = (char*)calloc
1e8c0 28 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20 69 66  ( size, 1);.  if
1e8d0 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78  ( s==0 ){.    ex
1e8e0 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79  tern void memory
1e8f0 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65  _error();.    me
1e900 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20  mory_error();.  
1e910 7d 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  }.  return s;.}.
1e920 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  ./* Deallocate a
1e930 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74   set */.void Set
1e940 46 72 65 65 28 73 29 0a 63 68 61 72 20 2a 73 3b  Free(s).char *s;
1e950 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a  .{.  free(s);.}.
1e960 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  ./* Add a new el
1e970 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65 74  ement to the set
1e980 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1e990 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77 61  f the element wa
1e9a0 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46  s added.** and F
1e9b0 41 4c 53 45 20 69 66 20 69 74 20 77 61 73 20 61  ALSE if it was a
1e9c0 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a 2f  lready there. */
1e9d0 0a 69 6e 74 20 53 65 74 41 64 64 28 73 2c 65 29  .int SetAdd(s,e)
1e9e0 0a 63 68 61 72 20 2a 73 3b 0a 69 6e 74 20 65 3b  .char *s;.int e;
1e9f0 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20 61  .{.  int rv;.  a
1ea00 73 73 65 72 74 28 20 65 3e 3d 30 20 26 26 20 65  ssert( e>=0 && e
1ea10 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76 20 3d 20  <size );.  rv = 
1ea20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31  s[e];.  s[e] = 1
1ea30 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a  ;.  return !rv;.
1ea40 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20  }../* Add every 
1ea50 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f  element of s2 to
1ea60 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55   s1.  Return TRU
1ea70 45 20 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e  E if s1 changes.
1ea80 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e   */.int SetUnion
1ea90 28 73 31 2c 73 32 29 0a 63 68 61 72 20 2a 73 31  (s1,s2).char *s1
1eaa0 3b 0a 63 68 61 72 20 2a 73 32 3b 0a 7b 0a 20 20  ;.char *s2;.{.  
1eab0 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73 73 3b  int i, progress;
1eac0 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b  .  progress = 0;
1ead0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
1eae0 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ze; i++){.    if
1eaf0 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  ( s2[i]==0 ) con
1eb00 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
1eb10 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  1[i]==0 ){.     
1eb20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20   progress = 1;. 
1eb30 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a       s1[i] = 1;.
1eb40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1eb50 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f  rn progress;.}./
1eb60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1eb70 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
1eb80 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22 20 2a  file "table.c" *
1eb90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1eba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
1ebb0 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74  ** All code in t
1ebc0 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65 65  his file has bee
1ebd0 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  n automatically 
1ebe0 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f  generated.** fro
1ebf0 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69 6f  m a specificatio
1ec00 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  n in the file.**
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
1ec20 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68  able.q".** by th
1ec30 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  e associative ar
1ec40 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e  ray code buildin
1ec50 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e  g program "aagen
1ec60 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69  "..** Do not edi
1ec70 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e  t this file!  In
1ec80 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65 20  stead, edit the 
1ec90 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a  specification.**
1eca0 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75   file, then reru
1ecb0 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a  n aagen..*/./*.*
1ecc0 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65  * Code for proce
1ecd0 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20  ssing tables in 
1ece0 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
1ecf0 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
1ed00 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 72 68  PRIVATE int strh
1ed10 61 73 68 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a  ash(x).char *x;.
1ed20 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20  {.  int h = 0;. 
1ed30 20 77 68 69 6c 65 28 20 2a 78 29 20 68 20 3d 20   while( *x) h = 
1ed40 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20  h*13 + *(x++);. 
1ed50 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
1ed60 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64   Works like strd
1ed70 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61  up, sort of.  Sa
1ed80 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  ve a string in m
1ed90 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20  alloced memory, 
1eda0 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69  but.** keep stri
1edb0 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73  ngs in a table s
1edc0 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  o that the same 
1edd0 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e  string is not in
1ede0 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e   more.** than on
1edf0 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 68 61 72  e place..*/.char
1ee00 20 2a 53 74 72 73 61 66 65 28 79 29 0a 63 68 61   *Strsafe(y).cha
1ee10 72 20 2a 79 3b 0a 7b 0a 20 20 63 68 61 72 20 2a  r *y;.{.  char *
1ee20 7a 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20 29  z;..  if( y==0 )
1ee30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d   return 0;.  z =
1ee40 20 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29   Strsafe_find(y)
1ee50 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20  ;.  if( z==0 && 
1ee60 28 7a 3d 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e  (z=malloc( lemon
1ee70 53 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d  Strlen(y)+1 ))!=
1ee80 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  0 ){.    strcpy(
1ee90 7a 2c 79 29 3b 0a 20 20 20 20 53 74 72 73 61 66  z,y);.    Strsaf
1eea0 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d  e_insert(z);.  }
1eeb0 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a  .  MemoryCheck(z
1eec0 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
1eed0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1eee0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1eef0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1ef00 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
1ef10 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
1ef20 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22  ray of type "x1"
1ef30 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 31  ..*/.struct s_x1
1ef40 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ef60 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
1ef70 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
1ef80 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1efa0 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
1efb0 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
1efc0 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efe0 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
1eff0 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
1f000 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1f010 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
1f020 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
1f030 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
1f040 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x1node *tbl;  
1f050 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
1f060 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
1f070 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68  uct s_x1node **h
1f080 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
1f090 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
1f0a0 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
1f0b0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1f0c0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
1f0d0 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
1f0e0 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
1f0f0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1f100 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a  y of type "x1"..
1f110 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1f120 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63  t s_x1node {.  c
1f130 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
1f140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f150 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72  he data */.  str
1f160 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65  uct s_x1node *ne
1f170 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
1f180 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
1f190 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
1f1a0 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72  ct s_x1node **fr
1f1b0 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
1f1c0 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64   link */.} x1nod
1f1d0 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
1f1e0 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
1f1f0 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
1f200 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
1f210 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
1f220 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78 31   struct s_x1 *x1
1f230 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
1f240 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
1f250 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
1f260 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 7b 0a  Strsafe_init(){.
1f270 20 20 69 66 28 20 78 31 61 20 29 20 72 65 74 75    if( x1a ) retu
1f280 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73 74 72  rn;.  x1a = (str
1f290 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63  uct s_x1*)malloc
1f2a0 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
1f2b0 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x1) );.  if( x
1f2c0 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73  1a ){.    x1a->s
1f2d0 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
1f2e0 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x1a->count = 0;.
1f2f0 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28      x1a->tbl = (
1f300 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20  x1node*)malloc( 
1f310 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
1f320 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
1f330 78 31 6e 6f 64 65 2a 29 29 2a 31 30 32 34 20 29  x1node*))*1024 )
1f340 3b 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e 74  ;.    if( x1a->t
1f350 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
1f360 72 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20 20  ree(x1a);.      
1f370 78 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x1a = 0;.    }el
1f380 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1f390 0a 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20 3d  .      x1a->ht =
1f3a0 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61   (x1node**)&(x1a
1f3b0 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20  ->tbl[1024]);.  
1f3c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
1f3d0 30 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68  024; i++) x1a->h
1f3e0 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
1f3f0 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
1f400 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
1f410 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
1f420 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
1f430 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
1f440 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
1f450 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
1f460 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
1f470 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72  nt Strsafe_inser
1f480 74 28 64 61 74 61 29 0a 63 68 61 72 20 2a 64 61  t(data).char *da
1f490 74 61 3b 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a  ta;.{.  x1node *
1f4a0 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69  np;.  int h;.  i
1f4b0 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31  nt ph;..  if( x1
1f4c0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1f4d0 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28  .  ph = strhash(
1f4e0 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20  data);.  h = ph 
1f4f0 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x1a->size-1);
1f500 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b  .  np = x1a->ht[
1f510 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
1f520 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
1f530 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29  p(np->data,data)
1f540 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1f550 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
1f560 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
1f570 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
1f580 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
1f590 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
1f5a0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
1f5b0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1f5c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
1f5d0 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
1f5e0 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74    if( x1a->count
1f5f0 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x1a->size ){. 
1f600 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
1f610 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
1f620 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
1f630 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20  int i,size;.    
1f640 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72 61  struct s_x1 arra
1f650 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
1f660 65 20 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d 3e  e = size = x1a->
1f670 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
1f680 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63  y.count = x1a->c
1f690 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
1f6a0 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d  tbl = (x1node*)m
1f6b0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69  alloc(.      (si
1f6c0 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73  zeof(x1node) + s
1f6d0 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a  izeof(x1node*))*
1f6e0 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  size );.    if( 
1f6f0 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
1f700 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
1f710 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
1f720 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
1f730 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64  rray.ht = (x1nod
1f740 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
1f750 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  size]);.    for(
1f760 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
1f770 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
1f780 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
1f790 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x1a->count; i+
1f7a0 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64 65  +){.      x1node
1f7b0 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
1f7c0 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
1f7d0 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x1a->tbl[i]);. 
1f7e0 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68       h = strhash
1f7f0 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20  (oldnp->data) & 
1f800 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  (size-1);.      
1f810 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
1f820 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
1f830 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
1f840 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
1f850 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
1f860 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
1f870 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
1f880 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
1f890 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
1f8a0 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
1f8b0 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
1f8c0 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
1f8d0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
1f8e0 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
1f8f0 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a  free(x1a->tbl);.
1f900 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79      *x1a = array
1f910 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
1f920 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
1f930 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31  /.  h = ph & (x1
1f940 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1f950 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31   = &(x1a->tbl[x1
1f960 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
1f970 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
1f980 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68  .  if( x1a->ht[h
1f990 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x1a->ht[h]->
1f9a0 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
1f9b0 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
1f9c0 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x1a->ht[h];.  x
1f9d0 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  1a->ht[h] = np;.
1f9e0 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
1f9f0 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  1a->ht[h]);.  re
1fa00 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
1fa10 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1fa20 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
1fa30 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
1fa40 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
1fa50 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
1fa60 2e 20 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73 61  . */.char *Strsa
1fa70 66 65 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68 61  fe_find(key).cha
1fa80 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20  r *key;.{.  int 
1fa90 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b  h;.  x1node *np;
1faa0 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29  ..  if( x1a==0 )
1fab0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
1fac0 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20   strhash(key) & 
1fad0 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x1a->size-1);. 
1fae0 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d   np = x1a->ht[h]
1faf0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1fb00 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1fb10 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30  np->data,key)==0
1fb20 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
1fb30 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
1fb40 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
1fb50 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
1fb60 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
1fb70 74 65 72 20 74 6f 20 74 68 65 20 28 74 65 72 6d  ter to the (term
1fb80 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d 69  inal or nontermi
1fb90 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22 2e  nal) symbol "x".
1fba0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1fbb0 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69 73 20   symbol if this 
1fbc0 69 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  is the first tim
1fbd0 65 20 22 78 22 20 68 61 73 20 62 65 65 6e 20 73  e "x" has been s
1fbe0 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  een..*/.struct s
1fbf0 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65  ymbol *Symbol_ne
1fc00 77 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a  w(x).char *x;.{.
1fc10 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1fc20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d  *sp;..  sp = Sym
1fc30 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69  bol_find(x);.  i
1fc40 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( sp==0 ){.    
1fc50 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  sp = (struct sym
1fc60 62 6f 6c 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20  bol *)calloc(1, 
1fc70 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
1fc80 6d 62 6f 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d  mbol) );.    Mem
1fc90 6f 72 79 43 68 65 63 6b 28 73 70 29 3b 0a 20 20  oryCheck(sp);.  
1fca0 20 20 73 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72    sp->name = Str
1fcb0 73 61 66 65 28 78 29 3b 0a 20 20 20 20 73 70 2d  safe(x);.    sp-
1fcc0 3e 74 79 70 65 20 3d 20 69 73 75 70 70 65 72 28  >type = isupper(
1fcd0 2a 78 29 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a  *x) ? TERMINAL :
1fce0 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20   NONTERMINAL;.  
1fcf0 20 20 73 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a    sp->rule = 0;.
1fd00 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b      sp->fallback
1fd10 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72   = 0;.    sp->pr
1fd20 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d  ec = -1;.    sp-
1fd30 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20  >assoc = UNK;.  
1fd40 20 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 3d    sp->firstset =
1fd50 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62   0;.    sp->lamb
1fd60 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45  da = LEMON_FALSE
1fd70 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 72 75  ;.    sp->destru
1fd80 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 70  ctor = 0;.    sp
1fd90 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 30  ->destLineno = 0
1fda0 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74 61 74 79  ;.    sp->dataty
1fdb0 70 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  pe = 0;.    sp->
1fdc0 75 73 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20  useCnt = 0;.    
1fdd0 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70  Symbol_insert(sp
1fde0 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a  ,sp->name);.  }.
1fdf0 20 20 73 70 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a    sp->useCnt++;.
1fe00 20 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a    return sp;.}..
1fe10 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73  /* Compare two s
1fe20 79 6d 62 6f 6c 73 20 66 6f 72 20 77 6f 72 6b 69  ymbols for worki
1fe30 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2a 0a 2a  ng purposes.**.*
1fe40 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61 74 20 62  * Symbols that b
1fe50 65 67 69 6e 20 77 69 74 68 20 75 70 70 65 72 20  egin with upper 
1fe60 63 61 73 65 20 6c 65 74 74 65 72 73 20 28 74 65  case letters (te
1fe70 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e  rminals or token
1fe80 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20  s).** must sort 
1fe90 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74  before symbols t
1fea0 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 6c  hat begin with l
1feb0 6f 77 65 72 20 63 61 73 65 20 6c 65 74 74 65 72  ower case letter
1fec0 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e  s.** (non-termin
1fed0 61 6c 73 29 2e 20 20 4f 74 68 65 72 20 74 68 61  als).  Other tha
1fee0 6e 20 74 68 61 74 2c 20 74 68 65 20 6f 72 64 65  n that, the orde
1fef0 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  r does not matte
1ff00 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64  r..**.** We find
1ff10 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20   experimentally 
1ff20 74 68 61 74 20 6c 65 61 76 69 6e 67 20 74 68 65  that leaving the
1ff30 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69   symbols in thei
1ff40 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72  r original.** or
1ff50 64 65 72 20 28 74 68 65 20 6f 72 64 65 72 20 74  der (the order t
1ff60 68 65 79 20 61 70 70 65 61 72 65 64 20 69 6e 20  hey appeared in 
1ff70 74 68 65 20 67 72 61 6d 6d 61 72 20 66 69 6c 65  the grammar file
1ff80 29 20 67 69 76 65 73 20 74 68 65 0a 2a 2a 20 73  ) gives the.** s
1ff90 6d 61 6c 6c 65 73 74 20 70 61 72 73 65 72 20 74  mallest parser t
1ffa0 61 62 6c 65 73 20 69 6e 20 53 51 4c 69 74 65 2e  ables in SQLite.
1ffb0 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d  .*/.int Symbolcm
1ffc0 70 70 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  pp(struct symbol
1ffd0 20 2a 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d   **a, struct sym
1ffe0 62 6f 6c 20 2a 2a 62 29 7b 0a 20 20 69 6e 74 20  bol **b){.  int 
1fff0 69 31 20 3d 20 28 2a 2a 61 29 2e 69 6e 64 65 78  i1 = (**a).index
20000 20 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a   + 10000000*((**
20010 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b  a).name[0]>'Z');
20020 0a 20 20 69 6e 74 20 69 32 20 3d 20 28 2a 2a 62  .  int i2 = (**b
20030 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30 30  ).index + 100000
20040 30 30 2a 28 28 2a 2a 62 29 2e 6e 61 6d 65 5b 30  00*((**b).name[0
20050 5d 3e 27 5a 27 29 3b 0a 20 20 61 73 73 65 72 74  ]>'Z');.  assert
20060 28 20 69 31 21 3d 69 32 20 7c 7c 20 73 74 72 63  ( i1!=i2 || strc
20070 6d 70 28 28 2a 2a 61 29 2e 6e 61 6d 65 2c 28 2a  mp((**a).name,(*
20080 2a 62 29 2e 6e 61 6d 65 29 3d 3d 30 20 29 3b 0a  *b).name)==0 );.
20090 20 20 72 65 74 75 72 6e 20 69 31 2d 69 32 3b 0a    return i1-i2;.
200a0 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
200b0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
200c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
200d0 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
200e0 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
200f0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32  rray of type "x2
20100 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
20110 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  2 {.  int size; 
20120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20130 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
20140 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
20150 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
20160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20170 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
20180 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
20190 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
201c0 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
201d0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
201e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
201f0 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
20200 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
20210 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x2node *tbl; 
20220 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
20230 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
20240 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a  ruct s_x2node **
20250 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
20260 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
20270 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
20280 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
20290 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
202a0 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
202b0 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
202c0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
202d0 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e  ay of type "x2".
202e0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
202f0 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20  ct s_x2node {.  
20300 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
20310 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
20320 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
20330 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6b 65 79  a */.  char *key
20340 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20350 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
20360 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
20370 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
20380 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
20390 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
203a0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
203b0 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
203c0 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
203d0 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x2node;../* Th
203e0 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
203f0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
20400 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
20410 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
20420 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
20430 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c  _x2 *x2a;../* Al
20440 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
20450 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
20460 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e  /.void Symbol_in
20470 69 74 28 29 7b 0a 20 20 69 66 28 20 78 32 61 20  it(){.  if( x2a 
20480 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20  ) return;.  x2a 
20490 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29  = (struct s_x2*)
204a0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
204b0 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20  truct s_x2) );. 
204c0 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20   if( x2a ){.    
204d0 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x2a->size = 128;
204e0 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20  .    x2a->count 
204f0 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62  = 0;.    x2a->tb
20500 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c  l = (x2node*)mal
20510 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a  loc( .      (siz
20520 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69  eof(x2node) + si
20530 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 31  zeof(x2node*))*1
20540 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 32  28 );.    if( x2
20550 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
20560 20 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20     free(x2a);.  
20570 20 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20      x2a = 0;.   
20580 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
20590 74 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e  t i;.      x2a->
205a0 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26  ht = (x2node**)&
205b0 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b  (x2a->tbl[128]);
205c0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
205d0 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d  i<128; i++) x2a-
205e0 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
205f0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
20600 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
20610 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
20620 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
20630 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
20640 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
20650 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
20660 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
20670 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
20680 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72  rt(data,key).str
20690 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
206a0 3b 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20  ;.char *key;.{. 
206b0 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x2node *np;.  i
206c0 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
206d0 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
206e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
206f0 20 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20   strhash(key);. 
20700 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e   h = ph & (x2a->
20710 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
20720 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
20730 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
20740 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
20750 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  y,key)==0 ){.   
20760 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
20770 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
20780 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
20790 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
207a0 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
207b0 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
207c0 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
207d0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
207e0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
207f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d  ;.  }.  if( x2a-
20800 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a  >count>=x2a->siz
20810 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
20820 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
20830 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
20840 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
20850 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
20860 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  2 array;.    arr
20870 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
20880 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x2a->size*2;.  
20890 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
208a0 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x2a->count;.    
208b0 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e  array.tbl = (x2n
208c0 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20  ode*)malloc(.   
208d0 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64     (sizeof(x2nod
208e0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f  e) + sizeof(x2no
208f0 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20  de*))*size );.  
20900 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
20910 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
20920 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
20930 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
20940 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
20950 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x2node**)&(arra
20960 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20  y.tbl[size]);.  
20970 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
20980 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
20990 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
209a0 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f 75  (i=0; i<x2a->cou
209b0 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
209c0 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x2node *oldnp, *
209d0 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
209e0 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b  np = &(x2a->tbl[
209f0 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73  i]);.      h = s
20a00 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65  trhash(oldnp->ke
20a10 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20  y) & (size-1);. 
20a20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
20a30 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
20a40 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
20a50 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
20a60 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
20a70 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
20a80 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
20a90 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
20aa0 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c   newnp->key = ol
20ab0 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20  dnp->key;.      
20ac0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
20ad0 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
20ae0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
20af0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
20b00 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
20b10 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
20b20 20 20 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62      free(x2a->tb
20b30 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61  l);.    *x2a = a
20b40 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
20b50 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
20b60 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
20b70 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
20b80 20 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62    np = &(x2a->tb
20b90 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x2a->count++])
20ba0 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65  ;.  np->key = ke
20bb0 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  y;.  np->data = 
20bc0 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d  data;.  if( x2a-
20bd0 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74  >ht[h] ) x2a->ht
20be0 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
20bf0 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
20c00 65 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d  ext = x2a->ht[h]
20c10 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x2a->ht[h] =
20c20 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
20c30 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x2a->ht[h]);
20c40 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
20c50 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
20c60 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
20c70 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
20c80 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
20c90 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
20ca0 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74  h key. */.struct
20cb0 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
20cc0 66 69 6e 64 28 6b 65 79 29 0a 63 68 61 72 20 2a  find(key).char *
20cd0 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key;.{.  int h;.
20ce0 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x2node *np;.. 
20cf0 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
20d00 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74  turn 0;.  h = st
20d10 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 32  rhash(key) & (x2
20d20 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
20d30 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
20d40 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
20d50 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
20d60 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62  >key,key)==0 ) b
20d70 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
20d80 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
20d90 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
20da0 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
20db0 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20 64  eturn the n-th d
20dc0 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ata.  Return NUL
20dd0 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f 66  L if n is out of
20de0 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63   range. */.struc
20df0 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
20e00 5f 4e 74 68 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  _Nth(n).int n;.{
20e10 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
20e20 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32   *data;.  if( x2
20e30 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78  a && n>0 && n<=x
20e40 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20  2a->count ){.   
20e50 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c   data = x2a->tbl
20e60 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65  [n-1].data;.  }e
20e70 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20  lse{.    data = 
20e80 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
20e90 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  data;.}../* Retu
20ea0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
20eb0 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20  he array */.int 
20ec0 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b  Symbol_count().{
20ed0 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f 20  .  return x2a ? 
20ee0 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a  x2a->count : 0;.
20ef0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
20f00 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
20f10 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e  s to all data in
20f20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54   the table..** T
20f30 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
20f40 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
20f50 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
20f60 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
20f70 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c  ion.** problems,
20f80 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79   or if the array
20f90 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74   is empty. */.st
20fa0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79  ruct symbol **Sy
20fb0 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b  mbol_arrayof().{
20fc0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
20fd0 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20   **array;.  int 
20fe0 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 32  i,size;.  if( x2
20ff0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
21000 0a 20 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 63  .  size = x2a->c
21010 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
21020 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
21030 2a 29 63 61 6c 6c 6f 63 28 73 69 7a 65 2c 20 73  *)calloc(size, s
21040 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
21050 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66 28 20 61  bol *));.  if( a
21060 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  rray ){.    for(
21070 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
21080 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 32 61  ) array[i] = x2a
21090 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20  ->tbl[i].data;. 
210a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61   }.  return arra
210b0 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  y;.}../* Compare
210c0 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61 74 69   two configurati
210d0 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69  ons */.int Confi
210e0 67 63 6d 70 28 61 2c 62 29 0a 73 74 72 75 63 74  gcmp(a,b).struct
210f0 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75   config *a;.stru
21100 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a  ct config *b;.{.
21110 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61    int x;.  x = a
21120 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d  ->rp->index - b-
21130 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66  >rp->index;.  if
21140 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e  ( x==0 ) x = a->
21150 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20  dot - b->dot;.  
21160 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20  return x;.}../* 
21170 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74  Compare two stat
21180 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e  es */.PRIVATE in
21190 74 20 73 74 61 74 65 63 6d 70 28 61 2c 62 29 0a  t statecmp(a,b).
211a0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
211b0 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
211c0 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *b;.{.  int rc;.
211d0 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d    for(rc=0; rc==
211e0 30 20 26 26 20 61 20 26 26 20 62 3b 20 20 61 3d  0 && a && b;  a=
211f0 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b  a->bp, b=b->bp){
21200 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d  .    rc = a->rp-
21210 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e  >index - b->rp->
21220 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 72  index;.    if( r
21230 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e 64  c==0 ) rc = a->d
21240 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d  ot - b->dot;.  }
21250 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
21260 20 20 20 20 69 66 28 20 61 20 29 20 72 63 20 3d      if( a ) rc =
21270 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29 20   1;.    if( b ) 
21280 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  rc = -1;.  }.  r
21290 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
212a0 48 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f 0a  Hash a state */.
212b0 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74  PRIVATE int stat
212c0 65 68 61 73 68 28 61 29 0a 73 74 72 75 63 74 20  ehash(a).struct 
212d0 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20 69  config *a;.{.  i
212e0 6e 74 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28  nt h=0;.  while(
212f0 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a   a ){.    h = h*
21300 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
21310 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
21320 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20      a = a->bp;. 
21330 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d   }.  return h;.}
21340 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
21350 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74  new state struct
21360 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73 74  ure */.struct st
21370 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29  ate *State_new()
21380 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
21390 65 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d 20  e *new;.  new = 
213a0 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29  (struct state *)
213b0 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66  calloc(1, sizeof
213c0 28 73 74 72 75 63 74 20 73 74 61 74 65 29 20 29  (struct state) )
213d0 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ;.  MemoryCheck(
213e0 6e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  new);.  return n
213f0 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  ew;.}../* There 
21400 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
21410 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
21420 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
21430 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
21440 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
21450 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x3"..*/.struct
21460 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69   s_x3 {.  int si
21470 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
21480 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
21490 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
214a0 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
214d0 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
214e0 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
21510 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
21520 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
21530 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21540 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
21550 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
21560 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74  ruct s_x3node *t
21570 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
21580 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
21590 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
215a0 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
215b0 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
215c0 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
215d0 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
215e0 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
215f0 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
21600 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
21610 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
21620 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
21630 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x3"..*/.typedef 
21640 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
21650 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
21660 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
21670 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21680 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74  data */.  struct
21690 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20   config *key;   
216a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216b0 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
216c0 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
216d0 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
216e0 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
216f0 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
21700 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
21710 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
21720 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33  ous link */.} x3
21730 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
21740 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
21750 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
21760 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
21770 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
21780 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 33 20  tic struct s_x3 
21790 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x3a;../* Alloca
217a0 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
217b0 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
217c0 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b  id State_init(){
217d0 0a 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74  .  if( x3a ) ret
217e0 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74  urn;.  x3a = (st
217f0 72 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f  ruct s_x3*)mallo
21800 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
21810 20 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20   s_x3) );.  if( 
21820 78 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e  x3a ){.    x3a->
21830 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20  size = 128;.    
21840 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x3a->count = 0;.
21850 20 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28      x3a->tbl = (
21860 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20  x3node*)malloc( 
21870 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
21880 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  3node) + sizeof(
21890 78 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b  x3node*))*128 );
218a0 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62  .    if( x3a->tb
218b0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
218c0 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78  ee(x3a);.      x
218d0 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  3a = 0;.    }els
218e0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
218f0 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20        x3a->ht = 
21900 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d  (x3node**)&(x3a-
21910 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20  >tbl[128]);.    
21920 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38    for(i=0; i<128
21930 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69  ; i++) x3a->ht[i
21940 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
21950 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e  .}./* Insert a n
21960 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
21970 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  he array.  Retur
21980 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73  n TRUE if succes
21990 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64  sful..** Prior d
219a0 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d  ata with the sam
219b0 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65  e key is NOT ove
219c0 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20  rwritten */.int 
219d0 53 74 61 74 65 5f 69 6e 73 65 72 74 28 64 61 74  State_insert(dat
219e0 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20 73 74  a,key).struct st
219f0 61 74 65 20 2a 64 61 74 61 3b 0a 73 74 72 75 63  ate *data;.struc
21a00 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b  t config *key;.{
21a10 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x3node *np;. 
21a20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68   int h;.  int ph
21a30 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  ;..  if( x3a==0 
21a40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
21a50 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79   = statehash(key
21a60 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
21a70 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
21a80 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x3a->ht[h];.
21a90 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
21aa0 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28     if( statecmp(
21ab0 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
21ac0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
21ad0 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
21ae0 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
21af0 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
21b00 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
21b10 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
21b20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
21b30 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
21b40 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
21b50 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
21b60 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33  ( x3a->count>=x3
21b70 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
21b80 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
21b90 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
21ba0 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
21bb0 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  i,size;.    stru
21bc0 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20  ct s_x3 array;. 
21bd0 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
21be0 73 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a 65  size = x3a->size
21bf0 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
21c00 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74  unt = x3a->count
21c10 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
21c20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f  = (x3node*)mallo
21c30 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  c(.      (sizeof
21c40 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x3node) + sizeo
21c50 66 28 78 33 6e 6f 64 65 2a 29 29 2a 73 69 7a 65  f(x3node*))*size
21c60 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61   );.    if( arra
21c70 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
21c80 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
21c90 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
21ca0 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
21cb0 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29  .ht = (x3node**)
21cc0 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65  &(array.tbl[size
21cd0 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
21ce0 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
21cf0 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
21d00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 33     for(i=0; i<x3
21d10 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
21d20 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f 6c        x3node *ol
21d30 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
21d40 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33 61     oldnp = &(x3a
21d50 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
21d60 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6f   h = statehash(o
21d70 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69  ldnp->key) & (si
21d80 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
21d90 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
21da0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
21db0 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
21dc0 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
21dd0 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
21de0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
21df0 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
21e00 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
21e10 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79  key = oldnp->key
21e20 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
21e30 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
21e40 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
21e50 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
21e60 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
21e70 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
21e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
21e90 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x3a->tbl);.    
21ea0 2a 78 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x3a = array;.  
21eb0 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
21ec0 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
21ed0 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73  h = ph & (x3a->s
21ee0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
21ef0 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63  (x3a->tbl[x3a->c
21f00 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
21f10 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d  key = key;.  np-
21f20 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
21f30 69 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29  if( x3a->ht[h] )
21f40 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x3a->ht[h]->fro
21f50 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
21f60 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33  .  np->next = x3
21f70 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d  a->ht[h];.  x3a-
21f80 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
21f90 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d  p->from = &(x3a-
21fa0 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
21fb0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
21fc0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
21fd0 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
21fe0 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
21ff0 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
22000 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
22010 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  /.struct state *
22020 53 74 61 74 65 5f 66 69 6e 64 28 6b 65 79 29 0a  State_find(key).
22030 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
22040 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey;.{.  int h;. 
22050 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x3node *np;..  
22060 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
22070 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61  urn 0;.  h = sta
22080 74 65 68 61 73 68 28 6b 65 79 29 20 26 20 28 78  tehash(key) & (x
22090 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
220a0 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x3a->ht[h];.
220b0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
220c0 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28     if( statecmp(
220d0 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
220e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20  ) break;.    np 
220f0 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
22100 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70    return np ? np
22110 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->data : 0;.}../
22120 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61  * Return an arra
22130 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
22140 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65   all data in the
22150 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61   table..** The a
22160 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
22170 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52   from malloc.  R
22180 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65  eturn NULL if me
22190 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
221a0 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20  ** problems, or 
221b0 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  if the array is 
221c0 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74  empty. */.struct
221d0 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61   state **State_a
221e0 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
221f0 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61  uct state **arra
22200 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  y;.  int i,size;
22210 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
22220 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65  return 0;.  size
22230 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x3a->count;. 
22240 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74   array = (struct
22250 20 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63   state **)malloc
22260 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
22270 73 74 61 74 65 20 2a 29 2a 73 69 7a 65 20 29 3b  state *)*size );
22280 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
22290 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
222a0 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b  ize; i++) array[
222b0 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d  i] = x3a->tbl[i]
222c0 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74  .data;.  }.  ret
222d0 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  urn array;.}../*
222e0 20 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72   Hash a configur
222f0 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45  ation */.PRIVATE
22300 20 69 6e 74 20 63 6f 6e 66 69 67 68 61 73 68 28   int confighash(
22310 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a).struct config
22320 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30   *a;.{.  int h=0
22330 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20  ;.  h = h*571 + 
22340 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20  a->rp->index*37 
22350 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75  + a->dot;.  retu
22360 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  rn h;.}../* Ther
22370 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
22380 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
22390 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
223a0 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
223b0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
223c0 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x4"..*/.stru
223d0 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20  ct s_x4 {.  int 
223e0 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
223f0 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
22400 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
22410 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
22420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22430 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
22440 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
22450 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
22460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
22480 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
22490 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
224a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
224b0 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
224c0 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
224d0 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
224e0 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
224f0 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
22500 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
22510 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
22520 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
22530 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
22540 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
22550 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
22560 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
22570 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
22580 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
22590 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
225a0 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x4"..*/.typede
225b0 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64  f struct s_x4nod
225c0 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  e {.  struct con
225d0 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20 20 20  fig *data;      
225e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
225f0 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72  he data */.  str
22600 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65  uct s_x4node *ne
22610 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
22620 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
22630 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
22640 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72  ct s_x4node **fr
22650 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
22660 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64   link */.} x4nod
22670 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
22680 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
22690 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
226a0 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
226b0 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
226c0 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a 78 34   struct s_x4 *x4
226d0 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
226e0 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
226f0 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
22700 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74  Configtable_init
22710 28 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20  (){.  if( x4a ) 
22720 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20  return;.  x4a = 
22730 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61  (struct s_x4*)ma
22740 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
22750 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69  uct s_x4) );.  i
22760 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34  f( x4a ){.    x4
22770 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20  a->size = 64;.  
22780 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x4a->count = 0
22790 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d  ;.    x4a->tbl =
227a0 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x4node*)malloc
227b0 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  ( .      (sizeof
227c0 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x4node) + sizeo
227d0 66 28 78 34 6e 6f 64 65 2a 29 29 2a 36 34 20 29  f(x4node*))*64 )
227e0 3b 0a 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74  ;.    if( x4a->t
227f0 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
22800 72 65 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20  ree(x4a);.      
22810 78 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x4a = 0;.    }el
22820 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
22830 0a 20 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d  .      x4a->ht =
22840 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61   (x4node**)&(x4a
22850 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20  ->tbl[64]);.    
22860 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b    for(i=0; i<64;
22870 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d   i++) x4a->ht[i]
22880 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
22890 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
228a0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
228b0 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
228c0 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
228d0 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
228e0 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
228f0 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
22900 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43  written */.int C
22910 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72  onfigtable_inser
22920 74 28 64 61 74 61 29 0a 73 74 72 75 63 74 20 63  t(data).struct c
22930 6f 6e 66 69 67 20 2a 64 61 74 61 3b 0a 7b 0a 20  onfig *data;.{. 
22940 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x4node *np;.  i
22950 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
22960 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20  .  if( x4a==0 ) 
22970 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
22980 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61   confighash(data
22990 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
229a0 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
229b0 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x4a->ht[h];.
229c0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
229d0 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70     if( Configcmp
229e0 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d  (np->data,data)=
229f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
22a00 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
22a10 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
22a20 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
22a30 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
22a40 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
22a50 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
22a60 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
22a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
22a80 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
22a90 20 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e   if( x4a->count>
22aa0 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x4a->size ){.  
22ab0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
22ac0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
22ad0 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
22ae0 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73  nt i,size;.    s
22af0 74 72 75 63 74 20 73 5f 78 34 20 61 72 72 61 79  truct s_x4 array
22b00 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
22b10 20 3d 20 73 69 7a 65 20 3d 20 78 34 61 2d 3e 73   = size = x4a->s
22b20 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
22b30 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f  .count = x4a->co
22b40 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
22b50 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61  bl = (x4node*)ma
22b60 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a  lloc(.      (siz
22b70 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69  eof(x4node) + si
22b80 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 73  zeof(x4node*))*s
22b90 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61  ize );.    if( a
22ba0 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
22bb0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
22bc0 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
22bd0 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
22be0 72 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65  ray.ht = (x4node
22bf0 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73  **)&(array.tbl[s
22c00 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
22c10 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
22c20 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
22c30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22c40 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x4a->count; i++
22c50 29 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20  ){.      x4node 
22c60 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
22c70 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
22c80 78 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x4a->tbl[i]);.  
22c90 20 20 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61      h = configha
22ca0 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20  sh(oldnp->data) 
22cb0 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20  & (size-1);.    
22cc0 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61    newnp = &(arra
22cd0 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  y.tbl[i]);.     
22ce0 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d   if( array.ht[h]
22cf0 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e   ) array.ht[h]->
22d00 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e  from = &(newnp->
22d10 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77  next);.      new
22d20 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79  np->next = array
22d30 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65  .ht[h];.      ne
22d40 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
22d50 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
22d60 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
22d70 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
22d80 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
22d90 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
22da0 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62 6c 29    free(x4a->tbl)
22db0 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61 72 72  ;.    *x4a = arr
22dc0 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
22dd0 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
22de0 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
22df0 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x4a->size-1);.  
22e00 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b  np = &(x4a->tbl[
22e10 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x4a->count++]);.
22e20 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74    np->data = dat
22e30 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e 68 74  a;.  if( x4a->ht
22e40 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d  [h] ) x4a->ht[h]
22e50 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e  ->from = &(np->n
22e60 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74  ext);.  np->next
22e70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
22e80 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70   x4a->ht[h] = np
22e90 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26  ;.  np->from = &
22ea0 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20  (x4a->ht[h]);.  
22eb0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
22ec0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
22ed0 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65   to data assigne
22ee0 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b  d to the given k
22ef0 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ey.  Return NULL
22f00 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b  .** if no such k
22f10 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ey. */.struct co
22f20 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c  nfig *Configtabl
22f30 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74 72 75  e_find(key).stru
22f40 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a  ct config *key;.
22f50 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e  {.  int h;.  x4n
22f60 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
22f70 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x4a==0 ) return 
22f80 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67 68  0;.  h = configh
22f90 61 73 68 28 6b 65 79 29 20 26 20 28 78 34 61 2d  ash(key) & (x4a-
22fa0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
22fb0 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x4a->ht[h];.  w
22fc0 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
22fd0 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 6e 70  if( Configcmp(np
22fe0 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29  ->data,key)==0 )
22ff0 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
23000 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
23010 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
23020 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
23030 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
23040 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e   from the table.
23050 20 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61    Pass each data
23060 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
23070 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73   "f".** as it is
23080 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20   removed.  ("f" 
23090 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61  may be null to a
230a0 76 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29  void this step.)
230b0 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74   */.void Configt
230c0 61 62 6c 65 5f 63 6c 65 61 72 28 66 29 0a 69 6e  able_clear(f).in
230d0 74 28 2a 66 29 28 2f 2a 20 73 74 72 75 63 74 20  t(*f)(/* struct 
230e0 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 7b 0a  config * */);.{.
230f0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 78    int i;.  if( x
23100 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f  4a==0 || x4a->co
23110 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  unt==0 ) return;
23120 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72 28 69  .  if( f ) for(i
23130 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74  =0; i<x4a->count
23140 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d  ; i++) (*f)(x4a-
23150 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20  >tbl[i].data);. 
23160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d   for(i=0; i<x4a-
23170 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d  >size; i++) x4a-
23180 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34  >ht[i] = 0;.  x4
23190 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
231a0 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.