/ Hex Artifact Content
Login

Artifact 6f896924091c0a66f78cc90a6eba5c6d23da34a4:


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 6f 6e 73  dif..static cons
02f0: 74 20 63 68 61 72 20 2a 2a 6d 61 64 65 5f 66 69  t char **made_fi
0300: 6c 65 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  les = NULL;.stat
0310: 69 63 20 69 6e 74 20 6d 61 64 65 5f 66 69 6c 65  ic int made_file
0320: 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 73 74 61  s_count = 0;.sta
0330: 74 69 63 20 69 6e 74 20 73 75 63 63 65 73 73 66  tic int successf
0340: 75 6c 5f 65 78 69 74 20 3d 20 30 3b 0a 73 74 61  ul_exit = 0;.sta
0350: 74 69 63 20 76 6f 69 64 20 4c 65 6d 6f 6e 41 74  tic void LemonAt
0360: 45 78 69 74 28 76 6f 69 64 29 0a 7b 0a 20 20 20  Exit(void).{.   
0370: 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64   /* if we failed
0380: 2c 20 64 65 6c 65 74 65 20 28 6d 6f 73 74 29 20  , delete (most) 
0390: 66 69 6c 65 73 20 77 65 20 6d 61 64 65 2c 20 74  files we made, t
03a0: 6f 20 75 6e 63 6f 6e 66 75 73 65 20 62 75 69 6c  o unconfuse buil
03b0: 64 20 74 6f 6f 6c 73 2e 20 2a 2f 0a 20 20 20 20  d tools. */.    
03c0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 20 28  int i;.    for (
03d0: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 61 64 65 5f  i = 0; i < made_
03e0: 66 69 6c 65 73 5f 63 6f 75 6e 74 3b 20 69 2b 2b  files_count; i++
03f0: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
0400: 21 73 75 63 63 65 73 73 66 75 6c 5f 65 78 69 74  !successful_exit
0410: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0420: 72 65 6d 6f 76 65 28 6d 61 64 65 5f 66 69 6c 65  remove(made_file
0430: 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  s[i]);.        }
0440: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 28 76  .        free((v
0450: 6f 69 64 20 2a 29 20 6d 61 64 65 5f 66 69 6c 65  oid *) made_file
0460: 73 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  s[i]);.    }.   
0470: 20 66 72 65 65 28 6d 61 64 65 5f 66 69 6c 65 73   free(made_files
0480: 29 3b 0a 20 20 20 20 6d 61 64 65 5f 66 69 6c 65  );.    made_file
0490: 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  s_count = 0;.   
04a0: 20 6d 61 64 65 5f 66 69 6c 65 73 20 3d 20 4e 55   made_files = NU
04b0: 4c 4c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  LL;.}..static ch
04c0: 61 72 20 2a 6d 73 6f 72 74 28 63 68 61 72 2a 2c  ar *msort(char*,
04d0: 63 68 61 72 2a 2a 2c 69 6e 74 28 2a 29 28 63 6f  char**,int(*)(co
04e0: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
04f0: 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a 0a 2a 2a 20  char*));../*.** 
0500: 43 6f 6d 70 69 6c 65 72 73 20 61 72 65 20 67 65  Compilers are ge
0510: 74 74 69 6e 67 20 69 6e 63 72 65 61 73 69 6e 67  tting increasing
0520: 6c 79 20 70 65 64 61 6e 74 69 63 20 61 62 6f 75  ly pedantic abou
0530: 74 20 74 79 70 65 20 63 6f 6e 76 65 72 73 69 6f  t type conversio
0540: 6e 73 0a 2a 2a 20 61 73 20 43 20 65 76 6f 6c 76  ns.** as C evolv
0550: 65 73 20 65 76 65 72 20 63 6c 6f 73 65 72 20 74  es ever closer t
0560: 6f 20 41 64 61 2e 2e 2e 2e 20 20 54 6f 20 77 6f  o Ada....  To wo
0570: 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 6c 61  rk around the la
0580: 74 65 73 74 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a  test problems.**
0590: 20 77 65 20 68 61 76 65 20 74 6f 20 64 65 66 69   we have to defi
05a0: 6e 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ne the following
05b0: 20 76 61 72 69 61 6e 74 20 6f 66 20 73 74 72 6c   variant of strl
05c0: 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  en()..*/.#define
05d0: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 58 29 20   lemonStrlen(X) 
05e0: 20 20 28 28 69 6e 74 29 73 74 72 6c 65 6e 28 58    ((int)strlen(X
05f0: 29 29 0a 0a 2f 2a 20 61 20 66 65 77 20 66 6f 72  ))../* a few for
0600: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
0610: 73 2e 2e 2e 20 2a 2f 0a 73 74 72 75 63 74 20 72  s... */.struct r
0620: 75 6c 65 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  ule;.struct lemo
0630: 6e 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  n;.struct action
0640: 3b 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  ;..static struct
0650: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
0660: 6e 65 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69  new(void);.stati
0670: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
0680: 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72  *Action_sort(str
0690: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a  uct action *);..
06a0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  /********** From
06b0: 20 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64   the file "build
06c0: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
06d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
06e0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46  ********/.void F
06f0: 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63  indRulePrecedenc
0700: 65 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46  es();.void FindF
0710: 69 72 73 74 53 65 74 73 28 29 3b 0a 76 6f 69 64  irstSets();.void
0720: 20 46 69 6e 64 53 74 61 74 65 73 28 29 3b 0a 76   FindStates();.v
0730: 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b  oid FindLinks();
0740: 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77  .void FindFollow
0750: 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e  Sets();.void Fin
0760: 64 41 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a  dActions();../**
0770: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
0780: 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73   file "configlis
0790: 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.h" ***********
07a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07b0: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e  ******/.void Con
07c0: 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 76 6f 69  figlist_init(voi
07d0: 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  d);.struct confi
07e0: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  g *Configlist_ad
07f0: 64 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2c  d(struct rule *,
0800: 20 69 6e 74 29 3b 0a 73 74 72 75 63 74 20 63 6f   int);.struct co
0810: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
0820: 5f 61 64 64 62 61 73 69 73 28 73 74 72 75 63 74  _addbasis(struct
0830: 20 72 75 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 76   rule *, int);.v
0840: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63  oid Configlist_c
0850: 6c 6f 73 75 72 65 28 73 74 72 75 63 74 20 6c 65  losure(struct le
0860: 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6e  mon *);.void Con
0870: 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 76 6f 69  figlist_sort(voi
0880: 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  d);.void Configl
0890: 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 76 6f  ist_sortbasis(vo
08a0: 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  id);.struct conf
08b0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72  ig *Configlist_r
08c0: 65 74 75 72 6e 28 76 6f 69 64 29 3b 0a 73 74 72  eturn(void);.str
08d0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
08e0: 69 67 6c 69 73 74 5f 62 61 73 69 73 28 76 6f 69  iglist_basis(voi
08f0: 64 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  d);.void Configl
0900: 69 73 74 5f 65 61 74 28 73 74 72 75 63 74 20 63  ist_eat(struct c
0910: 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43  onfig *);.void C
0920: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
0930: 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  void);../*******
0940: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0950: 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a   "error.h" *****
0960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0980: 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73  **/.void ErrorMs
0990: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20  g(const char *, 
09a0: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a  int,const char *
09b0: 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  , ...);../******
09c0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
09d0: 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a  option.h" ******
09e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a00: 2a 2a 2a 2a 2f 0a 65 6e 75 6d 20 6f 70 74 69 6f  ****/.enum optio
0a10: 6e 5f 74 79 70 65 20 7b 20 4f 50 54 5f 46 4c 41  n_type { OPT_FLA
0a20: 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54 2c 20 20  G=1,  OPT_INT,  
0a30: 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54 5f 53 54  OPT_DBL,  OPT_ST
0a40: 52 2c 0a 20 20 20 20 20 20 20 20 20 4f 50 54 5f  R,.         OPT_
0a50: 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49 4e 54 2c  FFLAG, OPT_FINT,
0a60: 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50 54 5f 46   OPT_FDBL, OPT_F
0a70: 53 54 52 7d 3b 0a 73 74 72 75 63 74 20 73 5f 6f  STR};.struct s_o
0a80: 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d 20  ptions {.  enum 
0a90: 6f 70 74 69 6f 6e 5f 74 79 70 65 20 74 79 70 65  option_type type
0aa0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
0ab0: 6c 61 62 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61  label;.  char *a
0ac0: 72 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  rg;.  const char
0ad0: 20 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e   *message;.};.in
0ae0: 74 20 20 20 20 4f 70 74 49 6e 69 74 28 63 68 61  t    OptInit(cha
0af0: 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f 6f 70 74  r**,struct s_opt
0b00: 69 6f 6e 73 2a 2c 46 49 4c 45 2a 29 3b 0a 69 6e  ions*,FILE*);.in
0b10: 74 20 20 20 20 4f 70 74 4e 41 72 67 73 28 76 6f  t    OptNArgs(vo
0b20: 69 64 29 3b 0a 63 68 61 72 20 20 2a 4f 70 74 41  id);.char  *OptA
0b30: 72 67 28 69 6e 74 29 3b 0a 76 6f 69 64 20 20 20  rg(int);.void   
0b40: 4f 70 74 45 72 72 28 69 6e 74 29 3b 0a 76 6f 69  OptErr(int);.voi
0b50: 64 20 20 20 4f 70 74 50 72 69 6e 74 28 76 6f 69  d   OptPrint(voi
0b60: 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46  d);../******** F
0b70: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61  rom the file "pa
0b80: 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  rse.h" *********
0b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bb0: 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 73 74 72  /.void Parse(str
0bc0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
0bd0: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ;../********* Fr
0be0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69  om the file "pli
0bf0: 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nk.h" **********
0c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73  *************/.s
0c20: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69  truct plink *Pli
0c30: 6e 6b 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 76 6f  nk_new(void);.vo
0c40: 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72  id Plink_add(str
0c50: 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74  uct plink **, st
0c60: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a  ruct config *);.
0c70: 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28  void Plink_copy(
0c80: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c  struct plink **,
0c90: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29   struct plink *)
0ca0: 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c  ;.void Plink_del
0cb0: 65 74 65 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  ete(struct plink
0cc0: 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a   *);../*********
0cd0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0ce0: 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a  "report.h" *****
0cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d10: 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73  /.void Reprint(s
0d20: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a  truct lemon *);.
0d30: 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75  void ReportOutpu
0d40: 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  t(struct lemon *
0d50: 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61  );.void ReportTa
0d60: 62 6c 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ble(struct lemon
0d70: 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f 69 64 20 52   *, int);.void R
0d80: 65 70 6f 72 74 48 65 61 64 65 72 28 73 74 72 75  eportHeader(stru
0d90: 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69  ct lemon *);.voi
0da0: 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  d CompressTables
0db0: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29  (struct lemon *)
0dc0: 3b 0a 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61  ;.void ResortSta
0dd0: 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tes(struct lemon
0de0: 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a   *);../*********
0df0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0e00: 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  "set.h" ********
0e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e30: 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a 65 28  /.void  SetSize(
0e40: 69 6e 74 29 3b 20 20 20 20 20 20 20 20 20 20 20  int);           
0e50: 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69    /* All sets wi
0e60: 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20  ll be of size N 
0e70: 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28  */.char *SetNew(
0e80: 76 6f 69 64 29 3b 20 20 20 20 20 20 20 20 20 20  void);          
0e90: 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65       /* A new se
0ea0: 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e  t for element 0.
0eb0: 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46  .N */.void  SetF
0ec0: 72 65 65 28 63 68 61 72 2a 29 3b 20 20 20 20 20  ree(char*);     
0ed0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c          /* Deall
0ee0: 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 0a  ocate a set */..
0ef0: 63 68 61 72 20 2a 53 65 74 4e 65 77 28 76 6f 69  char *SetNew(voi
0f00: 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d);             
0f10: 20 20 2f 2a 20 41 20 6e 65 77 20 73 65 74 20 66    /* A new set f
0f20: 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e 2e 4e 20  or element 0..N 
0f30: 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68  */.int SetAdd(ch
0f40: 61 72 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20  ar*,int);       
0f50: 20 20 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d       /* Add elem
0f60: 65 6e 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a  ent to a set */.
0f70: 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61  int SetUnion(cha
0f80: 72 20 2a 2c 63 68 61 72 20 2a 29 3b 20 20 20 20  r *,char *);    
0f90: 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20 74  /* A <- A U B, t
0fa0: 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a 2f  hru element N */
0fb0: 0a 23 64 65 66 69 6e 65 20 53 65 74 46 69 6e 64  .#define SetFind
0fc0: 28 58 2c 59 29 20 28 58 5b 59 5d 29 20 20 20 20  (X,Y) (X[Y])    
0fd0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 59 20     /* True if Y 
0fe0: 69 73 20 69 6e 20 73 65 74 20 58 20 2a 2f 0a 0a  is in set X */..
0ff0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  /********** From
1000: 20 74 68 65 20 66 69 6c 65 20 22 73 74 72 75 63   the file "struc
1010: 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.h" ***********
1020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
1040: 2a 20 50 72 69 6e 63 69 70 61 6c 20 64 61 74 61  * Principal data
1050: 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20   structures for 
1060: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
1070: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
1080: 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 4c 45  typedef enum {LE
1090: 4d 4f 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c 45 4d  MON_FALSE=0, LEM
10a0: 4f 4e 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e  ON_TRUE} Boolean
10b0: 3b 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74  ;../* Symbols (t
10c0: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e  erminals and non
10d0: 74 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68  terminals) of th
10e0: 65 20 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74  e grammar are st
10f0: 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66  ored.** in the f
1100: 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75  ollowing: */.enu
1110: 6d 20 73 79 6d 62 6f 6c 5f 74 79 70 65 20 7b 0a  m symbol_type {.
1120: 20 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4e 4f    TERMINAL,.  NO
1130: 4e 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 4d 55 4c  NTERMINAL,.  MUL
1140: 54 49 54 45 52 4d 49 4e 41 4c 0a 7d 3b 0a 65 6e  TITERMINAL.};.en
1150: 75 6d 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20  um e_assoc {.   
1160: 20 4c 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54   LEFT,.    RIGHT
1170: 2c 0a 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20  ,.    NONE,.    
1180: 55 4e 4b 0a 7d 3b 0a 73 74 72 75 63 74 20 73 79  UNK.};.struct sy
1190: 6d 62 6f 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  mbol {.  const c
11a0: 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
11b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
11c0: 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74   symbol */.  int
11d0: 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20   index;         
11e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e        /* Index n
11f0: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 73  umber for this s
1200: 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20  ymbol */.  enum 
1210: 73 79 6d 62 6f 6c 5f 74 79 70 65 20 74 79 70 65  symbol_type type
1220: 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73 20 61  ;   /* Symbols a
1230: 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 54 45  re all either TE
1240: 52 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73 20 2a  RMINALS or NTs *
1250: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
1260: 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20  *rule;       /* 
1270: 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 72  Linked list of r
1280: 75 6c 65 73 20 6f 66 20 74 68 69 73 20 28 69 66  ules of this (if
1290: 20 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 73 74 72   an NT) */.  str
12a0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c  uct symbol *fall
12b0: 62 61 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62 61 63  back; /* fallbac
12c0: 6b 20 74 6f 6b 65 6e 20 69 6e 20 63 61 73 65 20  k token in case 
12d0: 74 68 69 73 20 74 6f 6b 65 6e 20 64 6f 65 73 6e  this token doesn
12e0: 27 74 20 70 61 72 73 65 20 2a 2f 0a 20 20 69 6e  't parse */.  in
12f0: 74 20 70 72 65 63 3b 20 20 20 20 20 20 20 20 20  t prec;         
1300: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 65 64         /* Preced
1310: 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65 64 20  ence if defined 
1320: 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29 20 2a  (-1 otherwise) *
1330: 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63  /.  enum e_assoc
1340: 20 61 73 73 6f 63 3b 20 20 20 20 20 20 2f 2a 20   assoc;      /* 
1350: 41 73 73 6f 63 69 61 74 69 76 69 74 79 20 69 66  Associativity if
1360: 20 70 72 65 63 65 64 65 6e 63 65 20 69 73 20 64   precedence is d
1370: 65 66 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72  efined */.  char
1380: 20 2a 66 69 72 73 74 73 65 74 3b 20 20 20 20 20   *firstset;     
1390: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65       /* First-se
13a0: 74 20 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20  t for all rules 
13b0: 6f 66 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a  of this symbol *
13c0: 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62  /.  Boolean lamb
13d0: 64 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  da;          /* 
13e0: 54 72 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63  True if NT and c
13f0: 61 6e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  an generate an e
1400: 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20  mpty string */. 
1410: 20 69 6e 74 20 75 73 65 43 6e 74 3b 20 20 20 20   int useCnt;    
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1430: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 75 73 65  ber of times use
1440: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73  d */.  char *des
1450: 74 72 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20  tructor;        
1460: 2f 2a 20 43 6f 64 65 20 77 68 69 63 68 20 65 78  /* Code which ex
1470: 65 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20  ecutes whenever 
1480: 74 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20  this symbol is. 
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70            ** pop
14b0: 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
14c0: 63 6b 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20  ck during error 
14d0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
14e0: 69 6e 74 20 64 65 73 74 4c 69 6e 65 6e 6f 3b 20  int destLineno; 
14f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
1500: 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72   number for star
1510: 74 20 6f 66 20 64 65 73 74 72 75 63 74 6f 72 20  t of destructor 
1520: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74  */.  char *datat
1530: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ype;          /*
1540: 20 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6f   The data type o
1550: 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65  f information he
1560: 6c 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 20  ld by this.     
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e        ** object.
1590: 20 4f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79   Only used if ty
15a0: 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
15b0: 2a 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20  */.  int dtnum; 
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d0: 20 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6e   The data type n
15e0: 75 6d 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70  umber.  In the p
15f0: 61 72 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65  arser, the value
1600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1610: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1620: 74 61 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e  tack is a union.
1630: 20 20 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d    The .yy%d elem
1640: 65 6e 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20  ent of this.    
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20         ** union 
1670: 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 64  is the correct d
1680: 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 68 69  ata type for thi
1690: 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a  s object */.  /*
16a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
16b0: 69 65 6c 64 73 20 61 72 65 20 75 73 65 64 20 62  ields are used b
16c0: 79 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73  y MULTITERMINALs
16d0: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e   only */.  int n
16e0: 73 75 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20  subsym;         
16f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1700: 20 63 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d   constituent sym
1710: 62 6f 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54  bols in the MULT
1720: 49 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  I */.  struct sy
1730: 6d 62 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20  mbol **subsym;  
1740: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73  /* Array of cons
1750: 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20  tituent symbols 
1760: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70  */.};../* Each p
1770: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69  roduction rule i
1780: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73  n the grammar is
1790: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66   stored in the f
17a0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75  ollowing.** stru
17b0: 63 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63  cture.  */.struc
17c0: 74 20 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63  t rule {.  struc
17d0: 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20  t symbol *lhs;  
17e0: 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64      /* Left-hand
17f0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c   side of the rul
1800: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1810: 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20  r *lhsalias;    
1820: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65  /* Alias for the
1830: 20 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f   LHS (NULL if no
1840: 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73  ne) */.  int lhs
1850: 53 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  Start;          
1860: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66    /* True if lef
1870: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 74  t-hand side is t
1880: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
1890: 2a 2f 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e  */.  int rulelin
18a0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
18b0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
18c0: 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69   the rule */.  i
18d0: 6e 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20  nt nrhs;        
18e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18f0: 72 20 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73  r of RHS symbols
1900: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
1910: 62 6f 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f  bol **rhs;     /
1920: 2a 20 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c  * The RHS symbol
1930: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
1940: 72 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20  r **rhsalias;   
1950: 2f 2a 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20  /* An alias for 
1960: 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20  each RHS symbol 
1970: 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a  (NULL if none) *
1980: 2f 0a 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20  /.  int line;   
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19a0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77  Line number at w
19b0: 68 69 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73  hich code begins
19c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
19d0: 20 2a 63 6f 64 65 3b 20 20 20 20 20 20 20 20 2f   *code;        /
19e0: 2a 20 54 68 65 20 63 6f 64 65 20 65 78 65 63 75  * The code execu
19f0: 74 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 75  ted when this ru
1a00: 6c 65 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f  le is reduced */
1a10: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1a20: 20 2a 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50   *precsym;  /* P
1a30: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
1a40: 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a   for this rule *
1a50: 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20  /.  int index;  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a70: 41 6e 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  An index number 
1a80: 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f  for this rule */
1a90: 0a 20 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65  .  Boolean canRe
1aa0: 64 75 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  duce;       /* T
1ab0: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
1ac0: 20 69 73 20 65 76 65 72 20 72 65 64 75 63 65 64   is ever reduced
1ad0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
1ae0: 65 20 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f  e *nextlhs;    /
1af0: 2a 20 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68  * Next rule with
1b00: 20 74 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f   the same LHS */
1b10: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
1b20: 6e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e  next;       /* N
1b30: 65 78 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ext rule in the 
1b40: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d  global list */.}
1b50: 3b 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72  ;../* A configur
1b60: 61 74 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75  ation is a produ
1b70: 63 74 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68  ction rule of th
1b80: 65 20 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68  e grammar togeth
1b90: 65 72 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72  er with.** a mar
1ba0: 6b 20 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20  k (dot) showing 
1bb0: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74  how much of that
1bc0: 20 72 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70   rule has been p
1bd0: 72 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e  rocessed so far.
1be0: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
1bf0: 6e 73 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ns also contain 
1c00: 61 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69  a follow-set whi
1c10: 63 68 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ch is a list of 
1c20: 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62  terminal.** symb
1c30: 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20 61 6c  ols which are al
1c40: 6c 6f 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61  lowed to immedia
1c50: 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20  tely follow the 
1c60: 65 6e 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e  end of the rule.
1c70: 0a 2a 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67  .** Every config
1c80: 75 72 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  uration is recor
1c90: 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e  ded as an instan
1ca0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1cb0: 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d 20 63 66 67  ing: */.enum cfg
1cc0: 73 74 61 74 75 73 20 7b 0a 20 20 43 4f 4d 50 4c  status {.  COMPL
1cd0: 45 54 45 2c 0a 20 20 49 4e 43 4f 4d 50 4c 45 54  ETE,.  INCOMPLET
1ce0: 45 0a 7d 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  E.};.struct conf
1cf0: 69 67 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75  ig {.  struct ru
1d00: 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20  le *rp;         
1d10: 2f 2a 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e  /* The rule upon
1d20: 20 77 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69   which the confi
1d30: 67 75 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65  guration is base
1d40: 64 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20  d */.  int dot; 
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 2f 2a 20 54 68 65 20 70 61 72 73 65 20 70 6f 69  /* The parse poi
1d70: 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77  nt */.  char *fw
1d80: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1d90: 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66   /* Follow-set f
1da0: 6f 72 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72  or this configur
1db0: 61 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20  ation only */.  
1dc0: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70  struct plink *fp
1dd0: 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c  lp;      /* Foll
1de0: 6f 77 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70  ow-set forward p
1df0: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
1e00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69   */.  struct pli
1e10: 6e 6b 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f  nk *bplp;      /
1e20: 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63  * Follow-set bac
1e30: 6b 77 61 72 64 73 20 70 72 6f 70 61 67 61 74 69  kwards propagati
1e40: 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74  on links */.  st
1e50: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
1e60: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1e70: 72 20 74 6f 20 73 74 61 74 65 20 77 68 69 63 68  r to state which
1e80: 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a   contains this *
1e90: 2f 0a 20 20 65 6e 75 6d 20 63 66 67 73 74 61 74  /.  enum cfgstat
1ea0: 75 73 20 73 74 61 74 75 73 3b 20 20 20 2f 2a 20  us status;   /* 
1eb0: 75 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c  used during foll
1ec0: 6f 77 73 65 74 20 61 6e 64 20 73 68 69 66 74 20  owset and shift 
1ed0: 63 6f 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a  computations */.
1ee0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
1ef0: 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65  *next;     /* Ne
1f00: 78 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  xt configuration
1f10: 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f   in the state */
1f20: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
1f30: 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *bp;       /* T
1f40: 68 65 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f  he next basis co
1f50: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d  nfiguration */.}
1f60: 3b 0a 0a 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e  ;..enum e_action
1f70: 20 7b 0a 20 20 53 48 49 46 54 2c 0a 20 20 41 43   {.  SHIFT,.  AC
1f80: 43 45 50 54 2c 0a 20 20 52 45 44 55 43 45 2c 0a  CEPT,.  REDUCE,.
1f90: 20 20 45 52 52 4f 52 2c 0a 20 20 53 53 43 4f 4e    ERROR,.  SSCON
1fa0: 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20  FLICT,          
1fb0: 20 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73      /* A shift/s
1fc0: 68 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  hift conflict */
1fd0: 0a 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20 20  .  SRCONFLICT,  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1ff0: 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75 74  as a reduce, but
2000: 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c   part of a confl
2010: 69 63 74 20 2a 2f 0a 20 20 52 52 43 4f 4e 46 4c  ict */.  RRCONFL
2020: 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  ICT,            
2030: 20 20 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63    /* Was a reduc
2040: 65 2c 20 62 75 74 20 70 61 72 74 20 6f 66 20 61  e, but part of a
2050: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 53   conflict */.  S
2060: 48 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20  H_RESOLVED,     
2070: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61          /* Was a
2080: 20 73 68 69 66 74 2e 20 20 50 72 65 63 65 64 65   shift.  Precede
2090: 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e  nce resolved con
20a0: 66 6c 69 63 74 20 2a 2f 0a 20 20 52 44 5f 52 45  flict */.  RD_RE
20b0: 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20  SOLVED,         
20c0: 20 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63      /* Was reduc
20d0: 65 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72  e.  Precedence r
20e0: 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74  esolved conflict
20f0: 20 2a 2f 0a 20 20 4e 4f 54 5f 55 53 45 44 20 20   */.  NOT_USED  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2110: 2a 20 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d  * Deleted by com
2120: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a  pression */.};..
2130: 2f 2a 20 45 76 65 72 79 20 73 68 69 66 74 20 6f  /* Every shift o
2140: 72 20 72 65 64 75 63 65 20 6f 70 65 72 61 74 69  r reduce operati
2150: 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 61 73 20  on is stored as 
2160: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
2170: 77 69 6e 67 20 2a 2f 0a 73 74 72 75 63 74 20 61  wing */.struct a
2180: 63 74 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74  ction {.  struct
2190: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 20   symbol *sp;    
21a0: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61     /* The look-a
21b0: 68 65 61 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20  head symbol */. 
21c0: 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74   enum e_action t
21d0: 79 70 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  ype;.  union {. 
21e0: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20     struct state 
21f0: 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  *stp;     /* The
2200: 20 6e 65 77 20 73 74 61 74 65 2c 20 69 66 20 61   new state, if a
2210: 20 73 68 69 66 74 20 2a 2f 0a 20 20 20 20 73 74   shift */.    st
2220: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20  ruct rule *rp;  
2230: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65       /* The rule
2240: 2c 20 69 66 20 61 20 72 65 64 75 63 65 20 2a 2f  , if a reduce */
2250: 0a 20 20 7d 20 78 3b 0a 20 20 73 74 72 75 63 74  .  } x;.  struct
2260: 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20   action *next;  
2270: 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f     /* Next actio
2280: 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  n for this state
2290: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
22a0: 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f  ion *collide;  /
22b0: 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69  * Next action wi
22c0: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
22d0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20   */.};../* Each 
22e0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e  state of the gen
22f0: 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20  erated parser's 
2300: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
2310: 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64  hine.** is encod
2320: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
2330: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2340: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ng structure. */
2350: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a  .struct state {.
2360: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
2370: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
2380: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
2390: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ations for this 
23a0: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
23b0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
23c0: 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69      /* All confi
23d0: 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  gurations in thi
23e0: 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73  s set */.  int s
23f0: 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20  tatenum;        
2400: 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 74 69 61      /* Sequentia
2410: 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  l number for thi
2420: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
2430: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20  uct action *ap; 
2440: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2450: 66 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68  f actions for th
2460: 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e  is state */.  in
2470: 74 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63  t nTknAct, nNtAc
2480: 74 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  t;     /* Number
2490: 20 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74   of actions on t
24a0: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e  erminals and non
24b0: 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69  terminals */.  i
24c0: 6e 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74  nt iTknOfst, iNt
24d0: 4f 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63  Ofst;   /* yy_ac
24e0: 74 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f  tion[] offset fo
24f0: 72 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20  r terminals and 
2500: 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  nonterms */.  in
2510: 74 20 69 44 66 6c 74 3b 20 20 20 20 20 20 20 20  t iDflt;        
2520: 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
2530: 74 20 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23  t action */.};.#
2540: 64 65 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45 54  define NO_OFFSET
2550: 20 28 2d 32 31 34 37 34 38 33 36 34 37 29 0a 0a   (-2147483647)..
2560: 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70  /* A followset p
2570: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20  ropagation link 
2580: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
2590: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f  he contents of o
25a0: 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74  ne.** configurat
25b0: 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68  ion followset sh
25c0: 6f 75 6c 64 20 62 65 20 70 72 6f 70 61 67 61 74  ould be propagat
25d0: 65 64 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68  ed to another wh
25e0: 65 6e 65 76 65 72 0a 2a 2a 20 74 68 65 20 66 69  enever.** the fi
25f0: 72 73 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a  rst changes. */.
2600: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20  struct plink {. 
2610: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
2620: 63 66 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  cfp;      /* The
2630: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
2640: 6f 20 77 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a  o which linked *
2650: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
2660: 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20   *next;      /* 
2670: 54 68 65 20 6e 65 78 74 20 70 72 6f 70 61 67 61  The next propaga
2680: 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f  te link */.};../
2690: 2a 20 54 68 65 20 73 74 61 74 65 20 76 65 63 74  * The state vect
26a0: 6f 72 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  or for the entir
26b0: 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  e parser generat
26c0: 6f 72 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  or is recorded a
26d0: 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28  s.** follows.  (
26e0: 4c 45 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c  LEMON uses no gl
26f0: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  obal variables a
2700: 6e 64 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20  nd makes little 
2710: 75 73 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63  use of.** static
2720: 20 76 61 72 69 61 62 6c 65 73 2e 20 20 46 69 65   variables.  Fie
2730: 6c 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lds in the follo
2740: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63  wing structure c
2750: 61 6e 20 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a  an be thought.**
2760: 20 6f 66 20 61 73 20 62 65 67 69 6e 20 67 6c 6f   of as begin glo
2770: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 69 6e  bal variables in
2780: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a   the program.) *
2790: 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b  /.struct lemon {
27a0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
27b0: 2a 2a 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54  **sorted;   /* T
27c0: 61 62 6c 65 20 6f 66 20 73 74 61 74 65 73 20 73  able of states s
27d0: 6f 72 74 65 64 20 62 79 20 73 74 61 74 65 20 6e  orted by state n
27e0: 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63  umber */.  struc
27f0: 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20  t rule *rule;   
2800: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
2810: 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e  ll rules */.  in
2820: 74 20 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20  t nstate;       
2830: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2840: 20 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20   of states */.  
2850: 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20  int nrule;      
2860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2870: 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20  er of rules */. 
2880: 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20   int nsymbol;   
2890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28a0: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
28b0: 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20  and nonterminal 
28c0: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  symbols */.  int
28d0: 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20   nterminal;     
28e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28f0: 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  of terminal symb
2900: 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ols */.  struct 
2910: 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73  symbol **symbols
2920: 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61 72 72 61  ; /* Sorted arra
2930: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
2940: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
2950: 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20  t errorcnt;     
2960: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2970: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
2980: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65  struct symbol *e
2990: 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20  rrsym;   /* The 
29a0: 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a  error symbol */.
29b0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
29c0: 2a 77 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54 6f  *wildcard; /* To
29d0: 6b 65 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73  ken that matches
29e0: 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 63   anything */.  c
29f0: 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2a10: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2a20: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61   parser */.  cha
2a30: 72 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20  r *arg;         
2a40: 20 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61        /* Declara
2a50: 74 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20  tion of the 3th 
2a60: 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73  argument to pars
2a70: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  er */.  char *to
2a80: 6b 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20  kentype;        
2a90: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d   /* Type of term
2aa0: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20  inal symbols in 
2ab0: 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b  the parser stack
2ac0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74   */.  char *vart
2ad0: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ype;           /
2ae0: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 74 79  * The default ty
2af0: 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e  pe of non-termin
2b00: 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  al symbols */.  
2b10: 63 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20  char *start;    
2b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2b30: 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 73 79   of the start sy
2b40: 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61  mbol for the gra
2b50: 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mmar */.  char *
2b60: 73 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20  stacksize;      
2b70: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
2b80: 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a  e parser stack *
2b90: 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64  /.  char *includ
2ba0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2bb0: 43 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20 74  Code to put at t
2bc0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2bd0: 43 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  C file */.  char
2be0: 20 2a 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20   *error;        
2bf0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
2c00: 65 78 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20  execute when an 
2c10: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f  error is seen */
2c20: 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f  .  char *overflo
2c30: 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  w;          /* C
2c40: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
2c50: 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c  n a stack overfl
2c60: 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61  ow */.  char *fa
2c70: 69 6c 75 72 65 3b 20 20 20 20 20 20 20 20 20 20  ilure;          
2c80: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63   /* Code to exec
2c90: 75 74 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61  ute on parser fa
2ca0: 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  ilure */.  char 
2cb0: 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20 20 20  *accept;        
2cc0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
2cd0: 78 65 63 75 74 65 20 77 68 65 6e 20 74 68 65 20  xecute when the 
2ce0: 70 61 72 73 65 72 20 65 78 63 65 70 74 73 20 2a  parser excepts *
2cf0: 2f 0a 20 20 63 68 61 72 20 2a 65 78 74 72 61 63  /.  char *extrac
2d00: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ode;         /* 
2d10: 43 6f 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f  Code appended to
2d20: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 66   the generated f
2d30: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  ile */.  char *t
2d40: 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20 20  okendest;       
2d50: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
2d60: 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79 20  cute to destroy 
2d70: 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20  token data */.  
2d80: 63 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20  char *vardest;  
2d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2da0: 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74   for the default
2db0: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65   non-terminal de
2dc0: 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68  structor */.  ch
2dd0: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
2de0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2df0: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
2e00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e   */.  char *outn
2e10: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
2e20: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  * Name of the cu
2e30: 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c  rrent output fil
2e40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
2e50: 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20  enprefix;       
2e60: 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65  /* A prefix adde
2e70: 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73  d to token names
2e80: 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20   in the .h file 
2e90: 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69  */.  int nconfli
2ea0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct;           /*
2eb0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69   Number of parsi
2ec0: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ng conflicts */.
2ed0: 20 20 69 6e 74 20 6e 65 78 70 65 63 74 65 64 3b    int nexpected;
2ee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ef0: 6d 62 65 72 20 6f 66 20 65 78 70 65 63 74 65 64  mber of expected
2f00: 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63   parsing conflic
2f10: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 6c  ts */.  int tabl
2f20: 65 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  esize;          
2f30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
2f40: 70 61 72 73 65 20 74 61 62 6c 65 73 20 2a 2f 0a  parse tables */.
2f50: 20 20 69 6e 74 20 62 61 73 69 73 66 6c 61 67 3b    int basisflag;
2f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
2f70: 69 6e 74 20 6f 6e 6c 79 20 62 61 73 69 73 20 63  int only basis c
2f80: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
2f90: 0a 20 20 69 6e 74 20 68 61 73 5f 66 61 6c 6c 62  .  int has_fallb
2fa0: 61 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ack;        /* T
2fb0: 72 75 65 20 69 66 20 61 6e 79 20 25 66 61 6c 6c  rue if any %fall
2fc0: 62 61 63 6b 20 69 73 20 73 65 65 6e 20 69 6e 20  back is seen in 
2fd0: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
2fe0: 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c   int nolinenosfl
2ff0: 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ag;       /* Tru
3000: 65 20 69 66 20 23 6c 69 6e 65 20 73 74 61 74 65  e if #line state
3010: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 6e 6f 74  ments should not
3020: 20 62 65 20 70 72 69 6e 74 65 64 20 2a 2f 0a 20   be printed */. 
3030: 20 63 68 61 72 20 2a 61 72 67 76 30 3b 20 20 20   char *argv0;   
3040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
3050: 65 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  e of the program
3060: 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
3070: 4d 65 6d 6f 72 79 43 68 65 63 6b 28 58 29 20 69  MemoryCheck(X) i
3080: 66 28 28 58 29 3d 3d 30 29 7b 20 5c 0a 20 20 65  f((X)==0){ \.  e
3090: 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72  xtern void memor
30a0: 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 20 20 6d  y_error(); \.  m
30b0: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
30c0: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
30d0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
30e0: 69 6c 65 20 22 74 61 62 6c 65 2e 68 22 20 2a 2a  ile "table.h" **
30f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
3110: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20  ./*.** All code 
3120: 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61 73  in this file has
3130: 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61   been automatica
3140: 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lly generated.**
3150: 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63   from a specific
3160: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c  ation in the fil
3170: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
3180: 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62    "table.q".** b
3190: 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69 76  y the associativ
31a0: 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75 69  e array code bui
31b0: 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61  lding program "a
31c0: 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  agen"..** Do not
31d0: 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65 21   edit this file!
31e0: 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20    Instead, edit 
31f0: 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  the specificatio
3200: 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  n.** file, then 
3210: 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a  rerun aagen..*/.
3220: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
3230: 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73  rocessing tables
3240: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
3250: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
3260: 2a 2f 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66  */./* Routines f
3270: 6f 72 20 68 61 6e 64 6c 69 6e 67 20 61 20 73 74  or handling a st
3280: 72 69 6e 67 73 20 2a 2f 0a 0a 63 6f 6e 73 74 20  rings */..const 
3290: 63 68 61 72 20 2a 53 74 72 73 61 66 65 28 63 6f  char *Strsafe(co
32a0: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 76 6f  nst char *);..vo
32b0: 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28  id Strsafe_init(
32c0: 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74 72 73 61  void);.int Strsa
32d0: 66 65 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74 20  fe_insert(const 
32e0: 63 68 61 72 20 2a 29 3b 0a 63 6f 6e 73 74 20 63  char *);.const c
32f0: 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e  har *Strsafe_fin
3300: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  d(const char *);
3310: 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f  ../* Routines fo
3320: 72 20 68 61 6e 64 6c 69 6e 67 20 73 79 6d 62 6f  r handling symbo
3330: 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  ls of the gramma
3340: 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20 73 79 6d  r */..struct sym
3350: 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28  bol *Symbol_new(
3360: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 69  const char *);.i
3370: 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f  nt Symbolcmpp(co
3380: 6e 73 74 20 76 6f 69 64 20 2a 2c 20 63 6f 6e 73  nst void *, cons
3390: 74 20 76 6f 69 64 20 2a 29 3b 0a 76 6f 69 64 20  t void *);.void 
33a0: 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 76 6f 69 64  Symbol_init(void
33b0: 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e  );.int Symbol_in
33c0: 73 65 72 74 28 73 74 72 75 63 74 20 73 79 6d 62  sert(struct symb
33d0: 6f 6c 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ol *, const char
33e0: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62   *);.struct symb
33f0: 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  ol *Symbol_find(
3400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73  const char *);.s
3410: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
3420: 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 29 3b 0a 69  mbol_Nth(int);.i
3430: 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28  nt Symbol_count(
3440: 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 73 79  void);.struct sy
3450: 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72  mbol **Symbol_ar
3460: 72 61 79 6f 66 28 76 6f 69 64 29 3b 0a 0a 2f 2a  rayof(void);../*
3470: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 6d 61 6e   Routines to man
3480: 61 67 65 20 74 68 65 20 73 74 61 74 65 20 74 61  age the state ta
3490: 62 6c 65 20 2a 2f 0a 0a 69 6e 74 20 43 6f 6e 66  ble */..int Conf
34a0: 69 67 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72  igcmp(const char
34b0: 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   *, const char *
34c0: 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  );.struct state 
34d0: 2a 53 74 61 74 65 5f 6e 65 77 28 76 6f 69 64 29  *State_new(void)
34e0: 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  ;.void State_ini
34f0: 74 28 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74 61  t(void);.int Sta
3500: 74 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  te_insert(struct
3510: 20 73 74 61 74 65 20 2a 2c 20 73 74 72 75 63 74   state *, struct
3520: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75   config *);.stru
3530: 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
3540: 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66  find(struct conf
3550: 69 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74  ig *);.struct st
3560: 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61  ate **State_arra
3570: 79 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a  yof(/*  */);../*
3580: 20 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66   Routines used f
3590: 6f 72 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e  or efficiency in
35a0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20   Configlist_add 
35b0: 2a 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74  */..void Configt
35c0: 61 62 6c 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b  able_init(void);
35d0: 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65  .int Configtable
35e0: 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 63  _insert(struct c
35f0: 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74  onfig *);.struct
3600: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74   config *Configt
3610: 61 62 6c 65 5f 66 69 6e 64 28 73 74 72 75 63 74  able_find(struct
3620: 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64   config *);.void
3630: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65   Configtable_cle
3640: 61 72 28 69 6e 74 28 2a 29 28 73 74 72 75 63 74  ar(int(*)(struct
3650: 20 63 6f 6e 66 69 67 20 2a 29 29 3b 0a 0a 2f 2a   config *));../*
3660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3670: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
3680: 22 61 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a  "action.c" *****
3690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
36b0: 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65  * Routines proce
36c0: 73 73 69 6e 67 20 70 61 72 73 65 72 20 61 63 74  ssing parser act
36d0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  ions in the LEMO
36e0: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
36f0: 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63  or..*/../* Alloc
3700: 61 74 65 20 61 20 6e 65 77 20 70 61 72 73 65 72  ate a new parser
3710: 20 61 63 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69   action */.stati
3720: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
3730: 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f 69 64  *Action_new(void
3740: 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  ){.  static stru
3750: 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65 65 6c  ct action *freel
3760: 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  ist = 0;.  struc
3770: 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74  t action *newact
3780: 69 6f 6e 3b 0a 0a 20 20 69 66 28 20 66 72 65 65  ion;..  if( free
3790: 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
37a0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d  nt i;.    int am
37b0: 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66 72 65  t = 100;.    fre
37c0: 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
37d0: 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28  action *)calloc(
37e0: 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  amt, sizeof(stru
37f0: 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20 20 20  ct action));.   
3800: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
3810: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
3820: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
3830: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
3840: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61  ory for a new pa
3850: 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a  rser action.");.
3860: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
3870: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
3880: 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
3890: 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74  freelist[i].next
38a0: 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31   = &freelist[i+1
38b0: 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b  ];.    freelist[
38c0: 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b  amt-1].next = 0;
38d0: 0a 20 20 7d 0a 20 20 6e 65 77 61 63 74 69 6f 6e  .  }.  newaction
38e0: 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66   = freelist;.  f
38f0: 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69  reelist = freeli
3900: 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75  st->next;.  retu
3910: 72 6e 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 7d 0a  rn newaction;.}.
3920: 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
3930: 61 63 74 69 6f 6e 73 20 66 6f 72 20 73 6f 72 74  actions for sort
3940: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 52  ing purposes.  R
3950: 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20  eturn negative, 
3960: 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69  zero, or.** posi
3970: 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
3980: 74 20 61 63 74 69 6f 6e 20 69 73 20 6c 65 73 73  t action is less
3990: 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
39a0: 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
39b0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 0a 2a 2f  .** the first.*/
39c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 74 69  .static int acti
39d0: 6f 6e 63 6d 70 28 0a 20 20 73 74 72 75 63 74 20  oncmp(.  struct 
39e0: 61 63 74 69 6f 6e 20 2a 61 70 31 2c 0a 20 20 73  action *ap1,.  s
39f0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
3a00: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  2.){.  int rc;. 
3a10: 20 72 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e 69   rc = ap1->sp->i
3a20: 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d 3e  ndex - ap2->sp->
3a30: 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 72 63 3d  index;.  if( rc=
3a40: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 28  =0 ){.    rc = (
3a50: 69 6e 74 29 61 70 31 2d 3e 74 79 70 65 20 2d 20  int)ap1->type - 
3a60: 28 69 6e 74 29 61 70 32 2d 3e 74 79 70 65 3b 0a  (int)ap2->type;.
3a70: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20    }.  if( rc==0 
3a80: 26 26 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52 45  && ap1->type==RE
3a90: 44 55 43 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  DUCE ){.    rc =
3aa0: 20 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65   ap1->x.rp->inde
3ab0: 78 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69  x - ap2->x.rp->i
3ac0: 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
3ad0: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
3ae0: 3d 20 61 70 32 20 2d 20 61 70 31 3b 0a 20 20 7d  = ap2 - ap1;.  }
3af0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3b00: 0a 2f 2a 20 53 6f 72 74 20 70 61 72 73 65 72 20  ./* Sort parser 
3b10: 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  actions */.stati
3b20: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
3b30: 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28 0a 20 20  *Action_sort(.  
3b40: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
3b50: 70 0a 29 7b 0a 20 20 61 70 20 3d 20 28 73 74 72  p.){.  ap = (str
3b60: 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f  uct action *)mso
3b70: 72 74 28 28 63 68 61 72 20 2a 29 61 70 2c 28 63  rt((char *)ap,(c
3b80: 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e 65 78 74  har **)&ap->next
3b90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
3bc0: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
3bd0: 29 61 63 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72  )actioncmp);.  r
3be0: 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69  eturn ap;.}..voi
3bf0: 64 20 41 63 74 69 6f 6e 5f 61 64 64 28 0a 20 20  d Action_add(.  
3c00: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2a  struct action **
3c10: 61 70 70 2c 0a 20 20 65 6e 75 6d 20 65 5f 61 63  app,.  enum e_ac
3c20: 74 69 6f 6e 20 74 79 70 65 2c 0a 20 20 73 74 72  tion type,.  str
3c30: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a  uct symbol *sp,.
3c40: 20 20 63 68 61 72 20 2a 61 72 67 0a 29 7b 0a 20    char *arg.){. 
3c50: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
3c60: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
3c70: 61 63 74 69 6f 6e 20 3d 20 41 63 74 69 6f 6e 5f  action = Action_
3c80: 6e 65 77 28 29 3b 0a 20 20 6e 65 77 61 63 74 69  new();.  newacti
3c90: 6f 6e 2d 3e 6e 65 78 74 20 3d 20 2a 61 70 70 3b  on->next = *app;
3ca0: 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77 61 63 74  .  *app = newact
3cb0: 69 6f 6e 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ion;.  newaction
3cc0: 2d 3e 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20  ->type = type;. 
3cd0: 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 73 70 20 3d   newaction->sp =
3ce0: 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70 65 3d   sp;.  if( type=
3cf0: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65  =SHIFT ){.    ne
3d00: 77 61 63 74 69 6f 6e 2d 3e 78 2e 73 74 70 20 3d  waction->x.stp =
3d10: 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
3d20: 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )arg;.  }else{. 
3d30: 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78 2e     newaction->x.
3d40: 72 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c  rp = (struct rul
3d50: 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f  e *)arg;.  }.}./
3d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d70: 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64 65 20  ****** New code 
3d80: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
3d90: 20 22 61 63 74 74 61 62 22 20 6d 6f 64 75 6c 65   "acttab" module
3da0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a   ***********/./*
3db0: 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  .** This module 
3dc0: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75 74 69  implements routi
3dd0: 6e 65 73 20 75 73 65 20 74 6f 20 63 6f 6e 73 74  nes use to const
3de0: 72 75 63 74 20 74 68 65 20 79 79 5f 61 63 74 69  ruct the yy_acti
3df0: 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a  on[] table..*/..
3e00: 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74 65 20  /*.** The state 
3e10: 6f 66 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  of the yy_action
3e20: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
3e30: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61 6e 20  struction is an 
3e40: 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a 20 74  instance of.** t
3e50: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3e60: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
3e70: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
3e80: 65 20 6d 61 70 73 20 74 68 65 20 70 61 69 72 20  e maps the pair 
3e90: 28 73 74 61 74 65 5f 6e 75 6d 62 65 72 2c 20 6c  (state_number, l
3ea0: 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74 6f 20 61  ookahead) into a
3eb0: 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75 6d 62  n.** action_numb
3ec0: 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65 20 69  er.  The table i
3ed0: 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
3ee0: 74 65 67 65 72 73 20 70 61 69 72 73 2e 20 20 54  tegers pairs.  T
3ef0: 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 0a  he state_number.
3f00: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20 61 6e  ** determines an
3f10: 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65 74 20   initial offset 
3f20: 69 6e 74 6f 20 74 68 65 20 79 79 5f 61 63 74 69  into the yy_acti
3f30: 6f 6e 20 61 72 72 61 79 2e 20 20 54 68 65 20 6c  on array.  The l
3f40: 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76 61 6c 75  ookahead.** valu
3f50: 65 20 69 73 20 74 68 65 6e 20 61 64 64 65 64 20  e is then added 
3f60: 74 6f 20 74 68 69 73 20 69 6e 69 74 69 61 6c 20  to this initial 
3f70: 6f 66 66 73 65 74 20 74 6f 20 67 65 74 20 61 6e  offset to get an
3f80: 20 69 6e 64 65 78 20 58 20 69 6e 74 6f 20 74 68   index X into th
3f90: 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f 6e 20 61  e.** yy_action a
3fa0: 72 72 61 79 2e 20 49 66 20 74 68 65 20 61 41 63  rray. If the aAc
3fb0: 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[X].lookahea
3fc0: 64 20 65 71 75 61 6c 73 20 74 68 65 20 76 61 6c  d equals the val
3fd0: 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 66 20  ue of the.** of 
3fe0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e  the lookahead in
3ff0: 70 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  put, then the va
4000: 6c 75 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f  lue of the actio
4010: 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70 75 74 20  n_number output 
4020: 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b 58 5d  is.** aAction[X]
4030: 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  .action.  If the
4040: 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64 6f 20 6e   lookaheads do n
4050: 6f 74 20 6d 61 74 63 68 20 74 68 65 6e 20 74 68  ot match then th
4060: 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 61 63 74  e.** default act
4070: 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 74 61 74  ion for the stat
4080: 65 5f 6e 75 6d 62 65 72 20 69 73 20 72 65 74 75  e_number is retu
4090: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rned..**.** All 
40a0: 61 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  actions associat
40b0: 65 64 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  ed with a single
40c0: 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 61 72   state_number ar
40d0: 65 20 66 69 72 73 74 20 65 6e 74 65 72 65 64 0a  e first entered.
40e0: 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61 68 65  ** into aLookahe
40f0: 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75 6c 74 69  ad[] using multi
4100: 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ple calls to act
4110: 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e 20 20 54  tab_action().  T
4120: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 63 74 69  hen the .** acti
4130: 6f 6e 73 20 66 6f 72 20 74 68 61 74 20 73 69 6e  ons for that sin
4140: 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72  gle state_number
4150: 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e 74 6f   are placed into
4160: 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 0a   the aAction[] .
4170: 2a 2a 20 61 72 72 61 79 20 77 69 74 68 20 61 20  ** array with a 
4180: 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 61  single call to a
4190: 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29 2e 20  cttab_insert(). 
41a0: 20 54 68 65 20 61 63 74 74 61 62 5f 69 6e 73 65   The acttab_inse
41b0: 72 74 28 29 20 63 61 6c 6c 0a 2a 2a 20 61 6c 73  rt() call.** als
41c0: 6f 20 72 65 73 65 74 73 20 74 68 65 20 61 4c 6f  o resets the aLo
41d0: 6f 6b 61 68 65 61 64 5b 5d 20 61 72 72 61 79 20  okahead[] array 
41e0: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
41f0: 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 73  or the next.** s
4200: 74 61 74 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  tate number..*/.
4210: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
4220: 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 69 6e 74 20  _action {.  int 
4230: 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  lookahead;      
4240: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
4250: 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  of the lookahead
4260: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 6e 74 20   token */.  int 
4270: 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  action;         
4280: 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e         /* Action
4290: 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65 20   to take on the 
42a0: 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64 20  given lookahead 
42b0: 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  */.};.typedef st
42c0: 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74 74  ruct acttab actt
42d0: 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61  ab;.struct actta
42e0: 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f  b {.  int nActio
42f0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
4300: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4310: 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41  used slots in aA
4320: 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ction[] */.  int
4330: 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20   nActionAlloc;  
4340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f            /* Slo
4350: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ts allocated for
4360: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
4370: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
4380: 5f 61 63 74 69 6f 6e 0a 20 20 20 20 2a 61 41 63  _action.    *aAc
4390: 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  tion,           
43a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79         /* The yy
43b0: 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  _action[] table 
43c0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
43d0: 6f 6e 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b  on */.    *aLook
43e0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
43f0: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
4400: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
4410: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e   set */.  int mn
4420: 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  Lookahead;      
4430: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
4440: 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c  m aLookahead[].l
4450: 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e  ookahead */.  in
4460: 74 20 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20  t mnAction;     
4470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63             /* Ac
4480: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
4490: 77 69 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64  with mnLookahead
44a0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b   */.  int mxLook
44b0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
44c0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c     /* Maximum aL
44d0: 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61  ookahead[].looka
44e0: 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  head */.  int nL
44f0: 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20  ookahead;       
4500: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73         /* Used s
4510: 6c 6f 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65  lots in aLookahe
4520: 61 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ad[] */.  int nL
4530: 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20  ookaheadAlloc;  
4540: 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20         /* Slots 
4550: 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f  allocated in aLo
4560: 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a  okahead[] */.};.
4570: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ./* Return the n
4580: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
4590: 20 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f   in the yy_actio
45a0: 6e 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  n table */.#defi
45b0: 6e 65 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58  ne acttab_size(X
45c0: 29 20 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29  ) ((X)->nAction)
45d0: 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66  ../* The value f
45e0: 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72  or the N-th entr
45f0: 79 20 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a  y in yy_action *
4600: 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62  /.#define acttab
4610: 5f 79 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20  _yyaction(X,N)  
4620: 28 28 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d  ((X)->aAction[N]
4630: 2e 61 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65  .action)../* The
4640: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e   value for the N
4650: 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f  -th entry in yy_
4660: 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65  lookahead */.#de
4670: 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f  fine acttab_yylo
4680: 6f 6b 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28  okahead(X,N)  ((
4690: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c  X)->aAction[N].l
46a0: 6f 6f 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72  ookahead)../* Fr
46b0: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73  ee all memory as
46c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
46d0: 65 20 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a  e given acttab *
46e0: 2f 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72  /.void acttab_fr
46f0: 65 65 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20  ee(acttab *p){. 
4700: 20 66 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f   free( p->aActio
4710: 6e 20 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e  n );.  free( p->
4720: 61 4c 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20  aLookahead );.  
4730: 66 72 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a  free( p );.}../*
4740: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
4750: 61 63 74 74 61 62 20 73 74 72 75 63 74 75 72 65  acttab structure
4760: 20 2a 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74   */.acttab *actt
4770: 61 62 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a  ab_alloc(void){.
4780: 20 20 61 63 74 74 61 62 20 2a 70 20 3d 20 28 61    acttab *p = (a
4790: 63 74 74 61 62 20 2a 29 20 63 61 6c 6c 6f 63 28  cttab *) calloc(
47a0: 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29   1, sizeof(*p) )
47b0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
47c0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
47d0: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
47e0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
47f0: 72 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22  r a new acttab."
4800: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
4810: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
4820: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
4830: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
4840: 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63 74 69  * Add a new acti
4850: 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  on to the curren
4860: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
4870: 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t.  .**.** This 
4880: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
4890: 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
48a0: 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 61 20  lookahead for a 
48b0: 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 73 74  particular.** st
48c0: 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 61 63 74  ate..*/.void act
48d0: 74 61 62 5f 61 63 74 69 6f 6e 28 61 63 74 74 61  tab_action(actta
48e0: 62 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68  b *p, int lookah
48f0: 65 61 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29  ead, int action)
4900: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b  {.  if( p->nLook
4910: 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61  ahead>=p->nLooka
4920: 68 65 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  headAlloc ){.   
4930: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c   p->nLookaheadAl
4940: 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70  loc += 25;.    p
4950: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 28  ->aLookahead = (
4960: 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61 64  struct lookahead
4970: 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c 6c  _action *) reall
4980: 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  oc( p->aLookahea
4990: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49b0: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61  sizeof(p->aLooka
49c0: 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f  head[0])*p->nLoo
49d0: 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20  kaheadAlloc );. 
49e0: 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61     if( p->aLooka
49f0: 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  head==0 ){.     
4a00: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
4a10: 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e  "malloc failed\n
4a20: 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
4a30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
4a40: 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  f( p->nLookahead
4a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78  ==0 ){.    p->mx
4a60: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  Lookahead = look
4a70: 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e  ahead;.    p->mn
4a80: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b  Lookahead = look
4a90: 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e  ahead;.    p->mn
4aa0: 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b  Action = action;
4ab0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
4ac0: 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  ( p->mxLookahead
4ad0: 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e  <lookahead ) p->
4ae0: 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f  mxLookahead = lo
4af0: 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66 28  okahead;.    if(
4b00: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e   p->mnLookahead>
4b10: 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20  lookahead ){.   
4b20: 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61     p->mnLookahea
4b30: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
4b40: 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e       p->mnAction
4b50: 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d   = action;.    }
4b60: 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61  .  }.  p->aLooka
4b70: 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  head[p->nLookahe
4b80: 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20  ad].lookahead = 
4b90: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e  lookahead;.  p->
4ba0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c  aLookahead[p->nL
4bb0: 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e  ookahead].action
4bc0: 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e   = action;.  p->
4bd0: 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a  nLookahead++;.}.
4be0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 74  ./*.** Add the t
4bf0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62  ransaction set b
4c00: 75 69 6c 74 20 75 70 20 77 69 74 68 20 70 72 69  uilt up with pri
4c10: 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74 74  or calls to actt
4c20: 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69  ab_action().** i
4c30: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
4c40: 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54  action table.  T
4c50: 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 74 72  hen reset the tr
4c60: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62 61  ansaction set ba
4c70: 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74  ck.** to an empt
4c80: 79 20 73 65 74 20 69 6e 20 70 72 65 70 61 72 61  y set in prepara
4c90: 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20 72  tion for a new r
4ca0: 6f 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f 61  ound of acttab_a
4cb0: 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a  ction() calls..*
4cc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
4cd0: 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
4ce0: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20  action table of 
4cf0: 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74  the new transact
4d00: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74  ion..*/.int actt
4d10: 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61 62  ab_insert(acttab
4d20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *p){.  int i, j
4d30: 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74  , k, n;.  assert
4d40: 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e  ( p->nLookahead>
4d50: 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  0 );..  /* Make 
4d60: 73 75 72 65 20 77 65 20 68 61 76 65 20 65 6e 6f  sure we have eno
4d70: 75 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  ugh space to hol
4d80: 64 20 74 68 65 20 65 78 70 61 6e 64 65 64 20 61  d the expanded a
4d90: 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a  ction table.  **
4da0: 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61   in the worst ca
4db0: 73 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20 63  se.  The worst c
4dc0: 61 73 65 20 6f 63 63 75 72 73 20 69 66 20 74 68  ase occurs if th
4dd0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
4de0: 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61  t.  ** must be a
4df0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63  ppended to the c
4e00: 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61  urrent action ta
4e10: 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70  ble.  */.  n = p
4e20: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mxLookahead + 
4e30: 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63 74  1;.  if( p->nAct
4e40: 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41  ion + n >= p->nA
4e50: 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  ctionAlloc ){.  
4e60: 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d    int oldAlloc =
4e70: 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63   p->nActionAlloc
4e80: 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e  ;.    p->nAction
4e90: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69  Alloc = p->nActi
4ea0: 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74  on + n + p->nAct
4eb0: 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20  ionAlloc + 20;. 
4ec0: 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20     p->aAction = 
4ed0: 28 73 74 72 75 63 74 20 6c 6f 6f 6b 61 68 65 61  (struct lookahea
4ee0: 64 5f 61 63 74 69 6f 6e 20 2a 29 20 72 65 61 6c  d_action *) real
4ef0: 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f 6e 2c  loc( p->aAction,
4f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f10: 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
4f20: 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 29  f(p->aAction[0])
4f30: 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  *p->nActionAlloc
4f40: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  );.    if( p->aA
4f50: 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ction==0 ){.    
4f60: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
4f70: 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
4f80: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
4f90: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
4fa0: 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69 3c  r(i=oldAlloc; i<
4fb0: 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b  p->nActionAlloc;
4fc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
4fd0: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
4fe0: 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20  head = -1;.     
4ff0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 61   p->aAction[i].a
5000: 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  ction = -1;.    
5010: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e  }.  }..  /* Scan
5020: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 61 63   the existing ac
5030: 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f 6b 69  tion table looki
5040: 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73 65 74  ng for an offset
5050: 20 74 68 61 74 20 69 73 20 61 20 0a 20 20 2a 2a   that is a .  **
5060: 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68   duplicate of th
5070: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
5080: 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c  ction set.  Fall
5090: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
50a0: 0a 20 20 2a 2a 20 69 66 20 61 6e 64 20 77 68 65  .  ** if and whe
50b0: 6e 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20  n the duplicate 
50c0: 69 73 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20  is found..  **. 
50d0: 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64   ** i is the ind
50e0: 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f 6e  ex in p->aAction
50f0: 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c 6f  [] where p->mnLo
5100: 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65 72  okahead is inser
5110: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ted..  */.  for(
5120: 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e 2d 31 3b 20  i=p->nAction-1; 
5130: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
5140: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69  if( p->aAction[i
5150: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e  ].lookahead==p->
5160: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20  mnLookahead ){. 
5170: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6c 6f 6f 6b       /* All look
5180: 61 68 65 61 64 73 20 61 6e 64 20 61 63 74 69 6f  aheads and actio
5190: 6e 73 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61  ns in the aLooka
51a0: 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74 69  head[] transacti
51b0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  on.      ** must
51c0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
51d0: 68 65 20 63 61 6e 64 69 64 61 74 65 20 61 41 63  he candidate aAc
51e0: 74 69 6f 6e 5b 69 5d 20 65 6e 74 72 79 2e 20 2a  tion[i] entry. *
51f0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  /.      if( p->a
5200: 41 63 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e  Action[i].action
5210: 21 3d 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29 20  !=p->mnAction ) 
5220: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5230: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c  for(j=0; j<p->nL
5240: 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a  ookahead; j++){.
5250: 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61          k = p->a
5260: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
5270: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
5280: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
5290: 20 20 20 20 20 69 66 28 20 6b 3c 30 20 7c 7c 20       if( k<0 || 
52a0: 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20  k>=p->nAction ) 
52b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
52c0: 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  f( p->aLookahead
52d0: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d 70  [j].lookahead!=p
52e0: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f  ->aAction[k].loo
52f0: 6b 61 68 65 61 64 20 29 20 62 72 65 61 6b 3b 0a  kahead ) break;.
5300: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
5310: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 61 63 74  Lookahead[j].act
5320: 69 6f 6e 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ion!=p->aAction[
5330: 6b 5d 2e 61 63 74 69 6f 6e 20 29 20 62 72 65 61  k].action ) brea
5340: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5350: 20 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61   if( j<p->nLooka
5360: 68 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b  head ) continue;
5370: 0a 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 70 6f  ..      /* No po
5380: 73 73 69 62 6c 65 20 6c 6f 6f 6b 61 68 65 61 64  ssible lookahead
5390: 20 76 61 6c 75 65 20 74 68 61 74 20 69 73 20 6e   value that is n
53a0: 6f 74 20 69 6e 20 74 68 65 20 61 4c 6f 6f 6b 61  ot in the aLooka
53b0: 68 65 61 64 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  head[].      ** 
53c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
53d0: 6c 6c 6f 77 65 64 20 74 6f 20 6d 61 74 63 68 20  llowed to match 
53e0: 61 41 63 74 69 6f 6e 5b 69 5d 20 2a 2f 0a 20 20  aAction[i] */.  
53f0: 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20      n = 0;.     
5400: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
5410: 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Action; j++){.  
5420: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
5430: 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[j].lookahea
5440: 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  d<0 ) continue;.
5450: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
5460: 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68  Action[j].lookah
5470: 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b  ead==j+p->mnLook
5480: 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20  ahead-i ) n++;. 
5490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
54a0: 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61   n==p->nLookahea
54b0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  d ){.        bre
54c0: 61 6b 3b 20 20 2f 2a 20 41 6e 20 65 78 61 63 74  ak;  /* An exact
54d0: 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 20   match is found 
54e0: 61 74 20 6f 66 66 73 65 74 20 69 20 2a 2f 0a 20  at offset i */. 
54f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5500: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 78 69  ..  /* If no exi
5510: 73 74 69 6e 67 20 6f 66 66 73 65 74 73 20 65 78  sting offsets ex
5520: 61 63 74 6c 79 20 6d 61 74 63 68 20 74 68 65 20  actly match the 
5530: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
5540: 69 6f 6e 2c 20 66 69 6e 64 20 61 6e 0a 20 20 2a  ion, find an.  *
5550: 2a 20 61 6e 20 65 6d 70 74 79 20 6f 66 66 73 65  * an empty offse
5560: 74 20 69 6e 20 74 68 65 20 61 41 63 74 69 6f 6e  t in the aAction
5570: 5b 5d 20 74 61 62 6c 65 20 69 6e 20 77 68 69 63  [] table in whic
5580: 68 20 77 65 20 63 61 6e 20 61 64 64 20 74 68 65  h we can add the
5590: 0a 20 20 2a 2a 20 61 4c 6f 6f 6b 61 68 65 61 64  .  ** aLookahead
55a0: 5b 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  [] transaction..
55b0: 20 20 2a 2f 0a 20 20 69 66 28 20 69 3c 30 20 29    */.  if( i<0 )
55c0: 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f  {.    /* Look fo
55d0: 72 20 68 6f 6c 65 73 20 69 6e 20 74 68 65 20 61  r holes in the a
55e0: 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 74  Action[] table t
55f0: 68 61 74 20 66 69 74 20 74 68 65 20 63 75 72 72  hat fit the curr
5600: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 4c 6f 6f 6b  ent.    ** aLook
5610: 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63 74  ahead[] transact
5620: 69 6f 6e 2e 20 20 4c 65 61 76 65 20 69 20 73 65  ion.  Leave i se
5630: 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
5640: 6f 66 20 74 68 65 20 68 6f 6c 65 2e 0a 20 20 20  of the hole..   
5650: 20 2a 2a 20 49 66 20 6e 6f 20 68 6f 6c 65 73 20   ** If no holes 
5660: 61 72 65 20 66 6f 75 6e 64 2c 20 69 20 69 73 20  are found, i is 
5670: 6c 65 66 74 20 61 74 20 70 2d 3e 6e 41 63 74 69  left at p->nActi
5680: 6f 6e 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20  on, which means 
5690: 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
56a0: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  action will be a
56b0: 70 70 65 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20  ppended. */.    
56c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41  for(i=0; i<p->nA
56d0: 63 74 69 6f 6e 41 6c 6c 6f 63 20 2d 20 70 2d 3e  ctionAlloc - p->
56e0: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 69 2b 2b  mxLookahead; i++
56f0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
5700: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
5710: 68 65 61 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  head<0 ){.      
5720: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
5730: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29  nLookahead; j++)
5740: 7b 0a 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20  {.          k = 
5750: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
5760: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e  .lookahead - p->
5770: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b  mnLookahead + i;
5780: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6b  .          if( k
5790: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
57a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
57b0: 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[k].lookahea
57c0: 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d>=0 ) break;.  
57d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
57e0: 69 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  if( j<p->nLookah
57f0: 65 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ead ) continue;.
5800: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
5810: 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a   j<p->nAction; j
5820: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
5830: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d  f( p->aAction[j]
5840: 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d  .lookahead==j+p-
5850: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29  >mnLookahead-i )
5860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5870: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
5880: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20  =p->nAction ){. 
5890: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20           break; 
58a0: 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d 70 74   /* Fits in empt
58b0: 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20  y slots */.     
58c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
58d0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65   }.  }.  /* Inse
58e0: 72 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  rt transaction s
58f0: 65 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20 2a  et at index i. *
5900: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  /.  for(j=0; j<p
5910: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
5920: 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61  +){.    k = p->a
5930: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
5940: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
5950: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
5960: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d   p->aAction[k] =
5970: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
5980: 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d  ];.    if( k>=p-
5990: 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41  >nAction ) p->nA
59a0: 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d  ction = k+1;.  }
59b0: 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  .  p->nLookahead
59c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75   = 0;..  /* Retu
59d0: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74 68  rn the offset th
59e0: 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  at is added to t
59f0: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20  he lookahead in 
5a00: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
5a10: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f  .  ** index into
5a20: 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68   yy_action of th
5a30: 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65  e action */.  re
5a40: 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f  turn i - p->mnLo
5a50: 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a  okahead;.}../***
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
5a80: 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a  e "build.c" ****
5a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
5ab0: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e   Routines to con
5ac0: 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69  struction the fi
5ad0: 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69  nite state machi
5ae0: 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  ne for the LEMON
5af0: 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72  .** parser gener
5b00: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e  ator..*/../* Fin
5b10: 64 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  d a precedence s
5b20: 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72  ymbol of every r
5b30: 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ule in the gramm
5b40: 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65  ar..** .** Those
5b50: 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76   rules which hav
5b60: 65 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73  e a precedence s
5b70: 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74  ymbol coded in t
5b80: 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d  he input.** gram
5b90: 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b  mar using the "[
5ba0: 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75  symbol]" constru
5bb0: 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20  ct will already 
5bc0: 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e  have the.** rp->
5bd0: 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69  precsym field fi
5be0: 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c  lled.  Other rul
5bf0: 65 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72  es take as their
5c00: 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73   precedence.** s
5c10: 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20  ymbol the first 
5c20: 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20  RHS symbol with 
5c30: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
5c40: 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a  ence.  If there.
5c50: 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73  ** are not RHS s
5c60: 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65  ymbols with a de
5c70: 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65  fined precedence
5c80: 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65  , the precedence
5c90: 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64  .** symbol field
5ca0: 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a   is left blank..
5cb0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65  */.void FindRule
5cc0: 50 72 65 63 65 64 65 6e 63 65 73 28 73 74 72 75  Precedences(stru
5cd0: 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 29 0a 7b 0a  ct lemon *xp).{.
5ce0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
5cf0: 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78 70 2d 3e  p;.  for(rp=xp->
5d00: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
5d10: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
5d20: 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 20 29  rp->precsym==0 )
5d30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
5d40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5d50: 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26 26 20 72   i<rp->nrhs && r
5d60: 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30 3b 20 69  p->precsym==0; i
5d70: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ++){.        str
5d80: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
5d90: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
5da0: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70       if( sp->typ
5db0: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
5dc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
5dd0: 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e 6e 73 75  r(j=0; j<sp->nsu
5de0: 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  bsym; j++){.    
5df0: 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
5e00: 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72 65 63 3e  subsym[j]->prec>
5e10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5e20: 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20      rp->precsym 
5e30: 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 3b  = sp->subsym[j];
5e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
5e50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
5e60: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
5e70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
5e80: 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
5e90: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70  .          rp->p
5ea0: 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e 72 68 73  recsym = rp->rhs
5eb0: 5b 69 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a  [i];..}.      }.
5ec0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5ed0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61  rn;.}../* Find a
5ee0: 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20  ll nonterminals 
5ef0: 77 68 69 63 68 20 77 69 6c 6c 20 67 65 6e 65 72  which will gener
5f00: 61 74 65 20 74 68 65 20 65 6d 70 74 79 20 73 74  ate the empty st
5f10: 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f  ring..** Then go
5f20: 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74   back and comput
5f30: 65 20 74 68 65 20 66 69 72 73 74 20 73 65 74 73  e the first sets
5f40: 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e 74 65 72   of every nonter
5f50: 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69  minal..** The fi
5f60: 72 73 74 20 73 65 74 20 69 73 20 74 68 65 20 73  rst set is the s
5f70: 65 74 20 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e  et of all termin
5f80: 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  al symbols which
5f90: 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20   can begin.** a 
5fa0: 73 74 72 69 6e 67 20 67 65 6e 65 72 61 74 65 64  string generated
5fb0: 20 62 79 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d   by that nonterm
5fc0: 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  inal..*/.void Fi
5fd0: 6e 64 46 69 72 73 74 53 65 74 73 28 73 74 72 75  ndFirstSets(stru
5fe0: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a  ct lemon *lemp).
5ff0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
6000: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
6010: 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b  .  int progress;
6020: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
6030: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
6040: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
6050: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61  mbols[i]->lambda
6060: 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a   = LEMON_FALSE;.
6070: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70    }.  for(i=lemp
6080: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c  ->nterminal; i<l
6090: 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b  emp->nsymbol; i+
60a0: 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79  +){.    lemp->sy
60b0: 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73  mbols[i]->firsts
60c0: 65 74 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20  et = SetNew();. 
60d0: 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63   }..  /* First c
60e0: 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64  ompute all lambd
60f0: 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  as */.  do{.    
6100: 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
6110: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
6120: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
6130: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
6140: 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61   rp->lhs->lambda
6150: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
6170: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
6180: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
6190: 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72  mbol *sp = rp->r
61a0: 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20  hs[i];.         
61b0: 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 54 45  if( sp->type!=TE
61c0: 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 6c 61  RMINAL || sp->la
61d0: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
61e0: 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E ) break;.     
61f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d   }.      if( i==
6200: 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20  rp->nrhs ){.    
6210: 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d      rp->lhs->lam
6220: 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45  bda = LEMON_TRUE
6230: 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 67 72 65  ;.        progre
6240: 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ss = 1;.      }.
6250: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
6260: 70 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20 2f  progress );..  /
6270: 2a 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61 6c  * Now compute al
6280: 6c 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a  l first sets */.
6290: 20 20 64 6f 7b 0a 20 20 20 20 73 74 72 75 63 74    do{.    struct
62a0: 20 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73 32   symbol *s1, *s2
62b0: 3b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d  ;.    progress =
62c0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c   0;.    for(rp=l
62d0: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
62e0: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
62f0: 20 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73 3b     s1 = rp->lhs;
6300: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
6310: 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
6320: 7b 0a 20 20 20 20 20 20 20 20 73 32 20 3d 20 72  {.        s2 = r
6330: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
6340: 20 20 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d     if( s2->type=
6350: 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
6360: 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20         progress 
6370: 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69  += SetAdd(s1->fi
6380: 72 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65 78  rstset,s2->index
6390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
63a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
63b0: 65 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d  e if( s2->type==
63c0: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
63d0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
63e0: 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73 79  =0; j<s2->nsubsy
63f0: 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
6400: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d       progress +=
6410: 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73   SetAdd(s1->firs
6420: 74 73 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d 5b  tset,s2->subsym[
6430: 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  j]->index);.    
6440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6450: 20 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 20    break;..}else 
6460: 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20  if( s1==s2 ){.  
6470: 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e          if( s1->
6480: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
6490: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65  LSE ) break;..}e
64a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
64b0: 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 55 6e  rogress += SetUn
64c0: 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73 65 74  ion(s1->firstset
64d0: 2c 73 32 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a  ,s2->firstset);.
64e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 32            if( s2
64f0: 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f  ->lambda==LEMON_
6500: 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09  FALSE ) break;..
6510: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
6520: 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65    }while( progre
6530: 73 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ss );.  return;.
6540: 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c  }../* Compute al
6550: 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 20 66  l LR(0) states f
6560: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20  or the grammar. 
6570: 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61 64   Links.** are ad
6580: 64 65 64 20 74 6f 20 62 65 74 77 65 65 6e 20 73  ded to between s
6590: 6f 6d 65 20 73 74 61 74 65 73 20 73 6f 20 74 68  ome states so th
65a0: 61 74 20 74 68 65 20 4c 52 28 31 29 20 66 6f 6c  at the LR(1) fol
65b0: 6c 6f 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e 20  low sets.** can 
65c0: 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65  be computed late
65d0: 72 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73 74  r..*/.PRIVATE st
65e0: 72 75 63 74 20 73 74 61 74 65 20 2a 67 65 74 73  ruct state *gets
65f0: 74 61 74 65 28 73 74 72 75 63 74 20 6c 65 6d 6f  tate(struct lemo
6600: 6e 20 2a 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72  n *);  /* forwar
6610: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76  d reference */.v
6620: 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 73  oid FindStates(s
6630: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
6640: 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  p).{.  struct sy
6650: 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75  mbol *sp;.  stru
6660: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20  ct rule *rp;..  
6670: 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28  Configlist_init(
6680: 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  );..  /* Find th
6690: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a  e start symbol *
66a0: 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  /.  if( lemp->st
66b0: 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  art ){.    sp = 
66c0: 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70  Symbol_find(lemp
66d0: 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66  ->start);.    if
66e0: 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( sp==0 ){.     
66f0: 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
6700: 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65  filename,0,."The
6710: 20 73 70 65 63 69 66 69 65 64 20 73 74 61 72 74   specified start
6720: 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69   symbol \"%s\" i
6730: 73 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e  s not \.in a non
6740: 74 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20  terminal of the 
6750: 67 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22  grammar.  \"%s\"
6760: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73   will be used as
6770: 20 74 68 65 20 73 74 61 72 74 20 5c 0a 73 79 6d   the start \.sym
6780: 62 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65  bol instead.",le
6790: 6d 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e  mp->start,lemp->
67a0: 72 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  rule->lhs->name)
67b0: 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
67c0: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
67d0: 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d  sp = lemp->rule-
67e0: 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  >lhs;.    }.  }e
67f0: 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  lse{.    sp = le
6800: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
6810: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
6820: 72 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  re the start sym
6830: 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63 75  bol doesn't occu
6840: 72 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  r on the right-h
6850: 61 6e 64 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a  and side of.  **
6860: 20 61 6e 79 20 72 75 6c 65 2e 20 20 52 65 70 6f   any rule.  Repo
6870: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  rt an error if i
6880: 74 20 64 6f 65 73 2e 20 20 28 59 41 43 43 20 77  t does.  (YACC w
6890: 6f 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61 20  ould generate a 
68a0: 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72 74 20 73  new.  ** start s
68b0: 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20 63 61  ymbol in this ca
68c0: 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70  se.) */.  for(rp
68d0: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
68e0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
68f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
6900: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
6910: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  s; i++){.      i
6920: 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73  f( rp->rhs[i]==s
6930: 70 20 29 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45  p ){   /* FIX ME
6940: 3a 20 20 44 65 61 6c 20 77 69 74 68 20 6d 75 6c  :  Deal with mul
6950: 74 69 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20  titerminals */. 
6960: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
6970: 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30  lemp->filename,0
6980: 2c 0a 22 54 68 65 20 73 74 61 72 74 20 73 79 6d  ,."The start sym
6990: 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72  bol \"%s\" occur
69a0: 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74  s on the \.right
69b0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20  -hand side of a 
69c0: 72 75 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  rule. This will 
69d0: 72 65 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73  result in a pars
69e0: 65 72 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20  er which \.does 
69f0: 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c  not work properl
6a00: 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  y.",sp->name);. 
6a10: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
6a20: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
6a30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6a40: 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   The basis confi
6a50: 67 75 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72  guration set for
6a60: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
6a70: 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c  .  ** is all rul
6a80: 65 73 20 77 68 69 63 68 20 68 61 76 65 20 74 68  es which have th
6a90: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61  e start symbol a
6aa0: 73 20 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66  s their.  ** lef
6ab0: 74 2d 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20  t-hand side */. 
6ac0: 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65   for(rp=sp->rule
6ad0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
6ae0: 74 6c 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63  tlhs){.    struc
6af0: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70  t config *newcfp
6b00: 3b 0a 20 20 20 20 72 70 2d 3e 6c 68 73 53 74 61  ;.    rp->lhsSta
6b10: 72 74 20 3d 20 31 3b 0a 20 20 20 20 6e 65 77 63  rt = 1;.    newc
6b20: 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fp = Configlist_
6b30: 61 64 64 62 61 73 69 73 28 72 70 2c 30 29 3b 0a  addbasis(rp,0);.
6b40: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
6b50: 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a  p->fws,0);.  }..
6b60: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
6b70: 20 66 69 72 73 74 20 73 74 61 74 65 2e 20 20 41   first state.  A
6b80: 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 20  ll other states 
6b90: 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d  will be.  ** com
6ba0: 70 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  puted automatica
6bb0: 6c 6c 79 20 64 75 72 69 6e 67 20 74 68 65 20 63  lly during the c
6bc0: 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 74 68  omputation of th
6bd0: 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a  e first one..  *
6be0: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70  * The returned p
6bf0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69  ointer to the fi
6c00: 72 73 74 20 73 74 61 74 65 20 69 73 20 6e 6f 74  rst state is not
6c10: 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69   used. */.  (voi
6c20: 64 29 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29  d)getstate(lemp)
6c30: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
6c40: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
6c50: 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 77 68  er to a state wh
6c60: 69 63 68 20 69 73 20 64 65 73 63 72 69 62 65 64  ich is described
6c70: 20 62 79 20 74 68 65 20 63 6f 6e 66 69 67 75 72   by the configur
6c80: 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68  ation.** list wh
6c90: 69 63 68 20 68 61 73 20 62 65 65 6e 20 62 75 69  ich has been bui
6ca0: 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f  lt from calls to
6cb0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e   Configlist_add.
6cc0: 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
6cd0: 20 62 75 69 6c 64 73 68 69 66 74 73 28 73 74 72   buildshifts(str
6ce0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72  uct lemon *, str
6cf0: 75 63 74 20 73 74 61 74 65 20 2a 29 3b 20 2f 2a  uct state *); /*
6d00: 20 46 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50 52   Forwd ref */.PR
6d10: 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74 61  IVATE struct sta
6d20: 74 65 20 2a 67 65 74 73 74 61 74 65 28 73 74 72  te *getstate(str
6d30: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
6d40: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
6d50: 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20  ig *cfp, *bp;.  
6d60: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
6d70: 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74  p;..  /* Extract
6d80: 20 74 68 65 20 73 6f 72 74 65 64 20 62 61 73 69   the sorted basi
6d90: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74 61  s of the new sta
6da0: 74 65 2e 20 20 54 68 65 20 62 61 73 69 73 20 77  te.  The basis w
6db0: 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20  as constructed. 
6dc0: 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61 6c   ** by prior cal
6dd0: 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73  ls to "Configlis
6de0: 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20 2a  t_addbasis()". *
6df0: 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  /.  Configlist_s
6e00: 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62 70  ortbasis();.  bp
6e10: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61   = Configlist_ba
6e20: 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  sis();..  /* Get
6e30: 20 61 20 73 74 61 74 65 20 77 69 74 68 20 74 68   a state with th
6e40: 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a  e same basis */.
6e50: 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66 69    stp = State_fi
6e60: 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73 74  nd(bp);.  if( st
6e70: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74  p ){.    /* A st
6e80: 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ate with the sam
6e90: 65 20 62 61 73 69 73 20 61 6c 72 65 61 64 79 20  e basis already 
6ea0: 65 78 69 73 74 73 21 20 20 43 6f 70 79 20 61 6c  exists!  Copy al
6eb0: 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74  l the follow-set
6ec0: 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61 74  .    ** propagat
6ed0: 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74  ion links from t
6ee0: 68 65 20 73 74 61 74 65 20 75 6e 64 65 72 20 63  he state under c
6ef0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f  onstruction into
6f00: 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65 65   the.    ** pree
6f10: 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20 74  xisting state, t
6f20: 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
6f30: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65 65  nter to the pree
6f40: 78 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a 2f  xisting state */
6f50: 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .    struct conf
6f60: 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66  ig *x, *y;.    f
6f70: 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e  or(x=bp, y=stp->
6f80: 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78 2d  bp; x && y; x=x-
6f90: 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20  >bp, y=y->bp){. 
6fa0: 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28       Plink_copy(
6fb0: 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70  &y->bplp,x->bplp
6fc0: 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64  );.      Plink_d
6fd0: 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a  elete(x->fplp);.
6fe0: 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20        x->fplp = 
6ff0: 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20  x->bplp = 0;.   
7000: 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e   }.    cfp = Con
7010: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
7020: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  ;.    Configlist
7030: 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c  _eat(cfp);.  }el
7040: 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
7050: 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77 20  really is a new 
7060: 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75 63  state.  Construc
7070: 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69 6c  t all the detail
7080: 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c  s */.    Configl
7090: 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70  ist_closure(lemp
70a0: 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );    /* Compute
70b0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
70c0: 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20  on closure */.  
70d0: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72    Configlist_sor
70e0: 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f  t();           /
70f0: 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69  * Sort the confi
7100: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
7110: 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43 6f   */.    cfp = Co
7120: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
7130: 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f  );   /* Get a po
7140: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6e  inter to the con
7150: 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  fig list */.    
7160: 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77 28  stp = State_new(
7170: 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );           /* 
7180: 41 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75  A new state stru
7190: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  cture */.    Mem
71a0: 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a 20  oryCheck(stp);. 
71b0: 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b     stp->bp = bp;
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  /* Remember the 
71e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 61  configuration ba
71f0: 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  sis */.    stp->
7200: 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20 20  cfp = cfp;      
7210: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d          /* Remem
7220: 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ber the configur
7230: 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f  ation closure */
7240: 0a 20 20 20 20 73 74 70 2d 3e 73 74 61 74 65 6e  .    stp->staten
7250: 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  um = lemp->nstat
7260: 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73 74  e++; /* Every st
7270: 61 74 65 20 67 65 74 73 20 61 20 73 65 71 75 65  ate gets a seque
7280: 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  nce number */.  
7290: 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20    stp->ap = 0;  
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
72b0: 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65  * No actions, ye
72c0: 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f  t. */.    State_
72d0: 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d 3e  insert(stp,stp->
72e0: 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f  bp);   /* Add to
72f0: 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c 65   the state table
7300: 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68 69   */.    buildshi
7310: 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20  fts(lemp,stp);  
7320: 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76       /* Recursiv
7330: 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63 63  ely compute succ
7340: 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a  essor states */.
7350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 70    }.  return stp
7360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7370: 6e 20 74 72 75 65 20 69 66 20 74 77 6f 20 73 79  n true if two sy
7380: 6d 62 6f 6c 73 20 61 72 65 20 74 68 65 20 73 61  mbols are the sa
7390: 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65 5f  me..*/.int same_
73a0: 73 79 6d 62 6f 6c 28 73 74 72 75 63 74 20 73 79  symbol(struct sy
73b0: 6d 62 6f 6c 20 2a 61 2c 20 73 74 72 75 63 74 20  mbol *a, struct 
73c0: 73 79 6d 62 6f 6c 20 2a 62 29 0a 7b 0a 20 20 69  symbol *b).{.  i
73d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62  nt i;.  if( a==b
73e0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
73f0: 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54  f( a->type!=MULT
7400: 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75  ITERMINAL ) retu
7410: 72 6e 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74  rn 0;.  if( b->t
7420: 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
7430: 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  AL ) return 0;. 
7440: 20 69 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21   if( a->nsubsym!
7450: 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72 65  =b->nsubsym ) re
7460: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
7470: 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b  0; i<a->nsubsym;
7480: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
7490: 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e  ->subsym[i]!=b->
74a0: 73 75 62 73 79 6d 5b 69 5d 20 29 20 72 65 74 75  subsym[i] ) retu
74b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
74c0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73  rn 1;.}../* Cons
74d0: 74 72 75 63 74 20 61 6c 6c 20 73 75 63 63 65 73  truct all succes
74e0: 73 6f 72 20 73 74 61 74 65 73 20 74 6f 20 74 68  sor states to th
74f0: 65 20 67 69 76 65 6e 20 73 74 61 74 65 2e 20 20  e given state.  
7500: 41 20 22 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a  A "successor".**
7510: 20 73 74 61 74 65 20 69 73 20 61 6e 79 20 73 74   state is any st
7520: 61 74 65 20 77 68 69 63 68 20 63 61 6e 20 62 65  ate which can be
7530: 20 72 65 61 63 68 65 64 20 62 79 20 61 20 73 68   reached by a sh
7540: 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50  ift action..*/.P
7550: 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c  RIVATE void buil
7560: 64 73 68 69 66 74 73 28 73 74 72 75 63 74 20 6c  dshifts(struct l
7570: 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75  emon *lemp, stru
7580: 63 74 20 73 74 61 74 65 20 2a 73 74 70 29 0a 7b  ct state *stp).{
7590: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
75a0: 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c   *cfp;  /* For l
75b0: 6f 6f 70 69 6e 67 20 74 68 72 75 20 74 68 65 20  ooping thru the 
75c0: 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f  config closure o
75d0: 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72  f "stp" */.  str
75e0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70  uct config *bcfp
75f0: 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e  ; /* For the inn
7600: 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69  er loop on confi
7610: 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74  g closure of "st
7620: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  p" */.  struct c
7630: 6f 6e 66 69 67 20 2a 6e 65 77 63 66 67 3b 20 20  onfig *newcfg;  
7640: 2f 2a 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  /* */.  struct s
7650: 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20  ymbol *sp;   /* 
7660: 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67  Symbol following
7670: 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66   the dot in conf
7680: 69 67 75 72 61 74 69 6f 6e 20 22 63 66 70 22 20  iguration "cfp" 
7690: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
76a0: 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d  ol *bsp;  /* Sym
76b0: 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  bol following th
76c0: 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75  e dot in configu
76d0: 72 61 74 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f  ration "bcfp" */
76e0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
76f0: 2a 6e 65 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f  *newstp; /* A po
7700: 69 6e 74 65 72 20 74 6f 20 61 20 73 75 63 63 65  inter to a succe
7710: 73 73 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20  ssor state */.. 
7720: 20 2f 2a 20 45 61 63 68 20 63 6f 6e 66 69 67 75   /* Each configu
7730: 72 61 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63  ration becomes c
7740: 6f 6d 70 6c 65 74 65 20 61 66 74 65 72 20 69 74  omplete after it
7750: 20 63 6f 6e 74 69 62 75 74 65 73 20 74 6f 20 61   contibutes to a
7760: 20 73 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20   successor.  ** 
7770: 73 74 61 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c  state.  Initiall
7780: 79 2c 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61  y, all configura
7790: 74 69 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70  tions are incomp
77a0: 6c 65 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66  lete */.  for(cf
77b0: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
77c0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20   cfp=cfp->next) 
77d0: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e  cfp->status = IN
77e0: 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20  COMPLETE;..  /* 
77f0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
7800: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
7810: 6f 66 20 74 68 65 20 73 74 61 74 65 20 22 73 74  of the state "st
7820: 70 22 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d  p" */.  for(cfp=
7830: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
7840: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
7850: 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74     if( cfp->stat
7860: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
7870: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41  ontinue;    /* A
7880: 6c 72 65 61 64 79 20 75 73 65 64 20 62 79 20 69  lready used by i
7890: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nner loop */.   
78a0: 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63   if( cfp->dot>=c
78b0: 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63  fp->rp->nrhs ) c
78c0: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e  ontinue;  /* Can
78d0: 27 74 20 73 68 69 66 74 20 74 68 69 73 20 63 6f  't shift this co
78e0: 6e 66 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66  nfig */.    Conf
78f0: 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 3b 20  iglist_reset(); 
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68       /* Reset th
7920: 65 20 6e 65 77 20 63 6f 6e 66 69 67 20 73 65 74  e new config set
7930: 20 2a 2f 0a 20 20 20 20 73 70 20 3d 20 63 66 70   */.    sp = cfp
7940: 2d 3e 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64  ->rp->rhs[cfp->d
7950: 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  ot];            
7960: 20 2f 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65 72   /* Symbol after
7970: 20 74 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20   the dot */..   
7980: 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 63 6f   /* For every co
7990: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74  nfiguration in t
79a0: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77  he state "stp" w
79b0: 68 69 63 68 20 68 61 73 20 74 68 65 20 73 79 6d  hich has the sym
79c0: 62 6f 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a 20  bol "sp".    ** 
79d0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f  following its do
79e0: 74 2c 20 61 64 64 20 74 68 65 20 73 61 6d 65 20  t, add the same 
79f0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
7a00: 20 74 68 65 20 62 61 73 69 73 20 73 65 74 20 75   the basis set u
7a10: 6e 64 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  nder.    ** cons
7a20: 74 72 75 63 74 69 6f 6e 20 62 75 74 20 77 69 74  truction but wit
7a30: 68 20 74 68 65 20 64 6f 74 20 73 68 69 66 74 65  h the dot shifte
7a40: 64 20 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20  d one symbol to 
7a50: 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
7a60: 20 20 66 6f 72 28 62 63 66 70 3d 63 66 70 3b 20    for(bcfp=cfp; 
7a70: 62 63 66 70 3b 20 62 63 66 70 3d 62 63 66 70 2d  bcfp; bcfp=bcfp-
7a80: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
7a90: 28 20 62 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  ( bcfp->status==
7aa0: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
7ab0: 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61  nue;    /* Alrea
7ac0: 64 79 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  dy used */.     
7ad0: 20 69 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d   if( bcfp->dot>=
7ae0: 62 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29  bcfp->rp->nrhs )
7af0: 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61   continue; /* Ca
7b00: 6e 27 74 20 73 68 69 66 74 20 74 68 69 73 20 6f  n't shift this o
7b10: 6e 65 20 2a 2f 0a 20 20 20 20 20 20 62 73 70 20  ne */.      bsp 
7b20: 3d 20 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b  = bcfp->rp->rhs[
7b30: 62 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20  bcfp->dot];     
7b40: 20 20 20 20 20 20 2f 2a 20 47 65 74 20 73 79 6d        /* Get sym
7b50: 62 6f 6c 20 61 66 74 65 72 20 64 6f 74 20 2a 2f  bol after dot */
7b60: 0a 20 20 20 20 20 20 69 66 28 20 21 73 61 6d 65  .      if( !same
7b70: 5f 73 79 6d 62 6f 6c 28 62 73 70 2c 73 70 29 20  _symbol(bsp,sp) 
7b80: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20  ) continue;     
7b90: 20 2f 2a 20 4d 75 73 74 20 62 65 20 73 61 6d 65   /* Must be same
7ba0: 20 61 73 20 66 6f 72 20 22 63 66 70 22 20 2a 2f   as for "cfp" */
7bb0: 0a 20 20 20 20 20 20 62 63 66 70 2d 3e 73 74 61  .      bcfp->sta
7bc0: 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20  tus = COMPLETE; 
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 2f 2a 20 4d 61 72 6b 20 74 68 69 73 20 63 6f   /* Mark this co
7bf0: 6e 66 69 67 20 61 73 20 75 73 65 64 20 2a 2f 0a  nfig as used */.
7c00: 20 20 20 20 20 20 6e 65 77 63 66 67 20 3d 20 43        newcfg = C
7c10: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
7c20: 69 73 28 62 63 66 70 2d 3e 72 70 2c 62 63 66 70  is(bcfp->rp,bcfp
7c30: 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20 20  ->dot+1);.      
7c40: 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77 63 66  Plink_add(&newcf
7c50: 67 2d 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20  g->bplp,bcfp);. 
7c60: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
7c70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7c80: 65 20 73 74 61 74 65 20 64 65 73 63 72 69 62 65  e state describe
7c90: 64 20 62 79 20 74 68 65 20 62 61 73 69 73 20 63  d by the basis c
7ca0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74  onfiguration set
7cb0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63  .    ** construc
7cc0: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 63 65  ted in the prece
7cd0: 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  ding loop */.   
7ce0: 20 6e 65 77 73 74 70 20 3d 20 67 65 74 73 74 61   newstp = getsta
7cf0: 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f  te(lemp);..    /
7d00: 2a 20 54 68 65 20 73 74 61 74 65 20 22 6e 65 77  * The state "new
7d10: 73 74 70 22 20 69 73 20 72 65 61 63 68 65 64 20  stp" is reached 
7d20: 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22  from the state "
7d30: 73 74 70 22 20 62 79 20 61 20 73 68 69 66 74 20  stp" by a shift 
7d40: 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e  action.    ** on
7d50: 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22   the symbol "sp"
7d60: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 70 2d 3e   */.    if( sp->
7d70: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
7d80: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  NAL ){.      int
7d90: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
7da0: 30 3b 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  0; i<sp->nsubsym
7db0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
7dc0: 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d  Action_add(&stp-
7dd0: 3e 61 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75  >ap,SHIFT,sp->su
7de0: 62 73 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e  bsym[i],(char*)n
7df0: 65 77 73 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ewstp);.      }.
7e00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7e10: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70   Action_add(&stp
7e20: 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2c 28 63  ->ap,SHIFT,sp,(c
7e30: 68 61 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20  har *)newstp);. 
7e40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
7e50: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
7e60: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
7e70: 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69  s.*/.void FindLi
7e80: 6e 6b 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  nks(struct lemon
7e90: 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20   *lemp).{.  int 
7ea0: 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  i;.  struct conf
7eb0: 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b  ig *cfp, *other;
7ec0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
7ed0: 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70  *stp;.  struct p
7ee0: 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a  link *plp;..  /*
7ef0: 20 48 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65   Housekeeping de
7f00: 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74  tail:.  ** Add t
7f10: 6f 20 65 76 65 72 79 20 70 72 6f 70 61 67 61 74  o every propagat
7f20: 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72  e link a pointer
7f30: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61   back to the sta
7f40: 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68  te to.  ** which
7f50: 20 74 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74   the link is att
7f60: 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  ached. */.  for(
7f70: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
7f80: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
7f90: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
7fa0: 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66  d[i];.    for(cf
7fb0: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
7fc0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
7fd0: 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20  .      cfp->stp 
7fe0: 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  = stp;.    }.  }
7ff0: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61  ..  /* Convert a
8000: 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74  ll backlinks int
8010: 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e  o forward links.
8020: 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61    Only the forwa
8030: 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72  rd.  ** links ar
8040: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f  e used in the fo
8050: 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61  llow-set computa
8060: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  tion. */.  for(i
8070: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
8080: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
8090: 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
80a0: 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70  [i];.    for(cfp
80b0: 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20  =stp->cfp; cfp; 
80c0: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
80d0: 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66        for(plp=cf
80e0: 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c  p->bplp; plp; pl
80f0: 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=plp->next){.  
8100: 20 20 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c        other = pl
8110: 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20  p->cfp;.        
8120: 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72  Plink_add(&other
8130: 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20  ->fplp,cfp);.   
8140: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
8150: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c  ../* Compute all
8160: 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a   followsets..**.
8170: 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69  ** A followset i
8180: 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c  s the set of all
8190: 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63   symbols which c
81a0: 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74  an come immediat
81b0: 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63  ely.** after a c
81c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f  onfiguration..*/
81d0: 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77  .void FindFollow
81e0: 53 65 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  Sets(struct lemo
81f0: 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74  n *lemp).{.  int
8200: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   i;.  struct con
8210: 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75  fig *cfp;.  stru
8220: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20  ct plink *plp;. 
8230: 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 20   int progress;. 
8240: 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20   int change;..  
8250: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
8260: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
8270: 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d     for(cfp=lemp-
8280: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b  >sorted[i]->cfp;
8290: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
82a0: 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d  ext){.      cfp-
82b0: 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50  >status = INCOMP
82c0: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LETE;.    }.  }.
82d0: 20 20 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f    .  do{.    pro
82e0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66  gress = 0;.    f
82f0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
8300: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
8310: 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70      for(cfp=lemp
8320: 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70  ->sorted[i]->cfp
8330: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
8340: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
8350: 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  f( cfp->status==
8360: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
8370: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  nue;.        for
8380: 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20  (plp=cfp->fplp; 
8390: 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65  plp; plp=plp->ne
83a0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  xt){.          c
83b0: 68 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e  hange = SetUnion
83c0: 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63  (plp->cfp->fws,c
83d0: 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20  fp->fws);.      
83e0: 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 20 29      if( change )
83f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c  {.            pl
8400: 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d  p->cfp->status =
8410: 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20   INCOMPLETE;.   
8420: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
8430: 73 20 3d 20 31 3b 0a 09 20 20 7d 0a 09 7d 0a 20  s = 1;..  }..}. 
8440: 20 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74         cfp->stat
8450: 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20  us = COMPLETE;. 
8460: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8470: 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20  while( progress 
8480: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
8490: 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63   resolve_conflic
84a0: 74 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  t(struct action 
84b0: 2a 2c 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  *,struct action 
84c0: 2a 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  *, struct symbol
84d0: 20 2a 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65   *);../* Compute
84e0: 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
84f0: 6f 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76 65  ons, and resolve
8500: 20 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76   conflicts..*/.v
8510: 6f 69 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28  oid FindActions(
8520: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
8530: 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b  mp).{.  int i,j;
8540: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
8550: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
8560: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
8570: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
8580: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
8590: 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c  rp;..  /* Add al
85a0: 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63 65 20  l of the reduce 
85b0: 61 63 74 69 6f 6e 73 20 0a 20 20 2a 2a 20 41 20  actions .  ** A 
85c0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69 73  reduce action is
85d0: 20 61 64 64 65 64 20 66 6f 72 20 65 61 63 68 20   added for each 
85e0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  element of the f
85f0: 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a  ollowset of.  **
8600: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
8610: 20 77 68 69 63 68 20 68 61 73 20 69 74 73 20 64   which has its d
8620: 6f 74 20 61 74 20 74 68 65 20 65 78 74 72 65 6d  ot at the extrem
8630: 65 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20  e right..  */.  
8640: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
8650: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20  >nstate; i++){  
8660: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
8670: 6c 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 20 20  l states */.    
8680: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
8690: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
86a0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
86b0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
86c0: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  {  /* Loop over 
86d0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
86e0: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
86f0: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63  cfp->rp->nrhs==c
8700: 66 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20 20 20  fp->dot ){      
8710: 20 20 2f 2a 20 49 73 20 64 6f 74 20 61 74 20 65    /* Is dot at e
8720: 78 74 72 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f  xtreme right? */
8730: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
8740: 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; j<lemp->ntermi
8750: 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nal; j++){.     
8760: 20 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64       if( SetFind
8770: 28 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a  (cfp->fws,j) ){.
8780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
8790: 64 64 20 61 20 72 65 64 75 63 65 20 61 63 74 69  dd a reduce acti
87a0: 6f 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  on to the state 
87b0: 22 73 74 70 22 20 77 68 69 63 68 20 77 69 6c 6c  "stp" which will
87c0: 20 72 65 64 75 63 65 20 62 79 20 74 68 65 0a 20   reduce by the. 
87d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 75             ** ru
87e0: 6c 65 20 22 63 66 70 2d 3e 72 70 22 20 69 66 20  le "cfp->rp" if 
87f0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79  the lookahead sy
8800: 6d 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73  mbol is "lemp->s
8810: 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20  ymbols[j]" */.  
8820: 20 20 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e            Action
8830: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 52 45  _add(&stp->ap,RE
8840: 44 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  DUCE,lemp->symbo
8850: 6c 73 5b 6a 5d 2c 28 63 68 61 72 20 2a 29 63 66  ls[j],(char *)cf
8860: 70 2d 3e 72 70 29 3b 0a 20 20 20 20 20 20 20 20  p->rp);.        
8870: 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20    }..}.      }. 
8880: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
8890: 64 64 20 74 68 65 20 61 63 63 65 70 74 69 6e 67  dd the accepting
88a0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20   token */.  if( 
88b0: 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20  lemp->start ){. 
88c0: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66     sp = Symbol_f
88d0: 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29  ind(lemp->start)
88e0: 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
88f0: 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c  ) sp = lemp->rul
8900: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b  e->lhs;.  }else{
8910: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
8920: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20  rule->lhs;.  }. 
8930: 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 66   /* Add to the f
8940: 69 72 73 74 20 73 74 61 74 65 20 28 77 68 69 63  irst state (whic
8950: 68 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  h is always the 
8960: 73 74 61 72 74 69 6e 67 20 73 74 61 74 65 20 6f  starting state o
8970: 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74  f the.  ** finit
8980: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 29  e state machine)
8990: 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41 43   an action to AC
89a0: 43 45 50 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b  CEPT if the look
89b0: 61 68 65 61 64 20 69 73 20 74 68 65 0a 20 20 2a  ahead is the.  *
89c0: 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69  * start nontermi
89d0: 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f  nal.  */.  Actio
89e0: 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72  n_add(&lemp->sor
89f0: 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50  ted[0]->ap,ACCEP
8a00: 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52  T,sp,0);..  /* R
8a10: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
8a20: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8a30: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
8a40: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
8a50: 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70  action *ap, *nap
8a60: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
8a70: 74 65 20 2a 73 74 70 3b 0a 20 20 20 20 73 74 70  te *stp;.    stp
8a80: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
8a90: 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  i];.    /* asser
8aa0: 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20 2a 2f  t( stp->ap ); */
8ab0: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41  .    stp->ap = A
8ac0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e  ction_sort(stp->
8ad0: 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  ap);.    for(ap=
8ae0: 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61  stp->ap; ap && a
8af0: 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e  p->next; ap=ap->
8b00: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72  next){.      for
8b10: 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e  (nap=ap->next; n
8b20: 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61  ap && nap->sp==a
8b30: 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e  p->sp; nap=nap->
8b40: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  next){.         
8b50: 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69 6f  /* The two actio
8b60: 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61 70  ns "ap" and "nap
8b70: 22 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  " have the same 
8b80: 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 20  lookahead..     
8b90: 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75      ** Figure ou
8ba0: 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f 75  t which one shou
8bb0: 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20  ld be used */.  
8bc0: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f         lemp->nco
8bd0: 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76  nflict += resolv
8be0: 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61  e_conflict(ap,na
8bf0: 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 29 3b  p,lemp->errsym);
8c00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8c10: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
8c20: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63  an error for eac
8c30: 68 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20  h rule that can 
8c40: 6e 65 76 65 72 20 62 65 20 72 65 64 75 63 65 64  never be reduced
8c50: 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  . */.  for(rp=le
8c60: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8c70: 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63  =rp->next) rp->c
8c80: 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e  anReduce = LEMON
8c90: 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d  _FALSE;.  for(i=
8ca0: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
8cb0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
8cc0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
8cd0: 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d      for(ap=lemp-
8ce0: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20  >sorted[i]->ap; 
8cf0: 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
8d00: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
8d10: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61  type==REDUCE ) a
8d20: 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75  p->x.rp->canRedu
8d30: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b  ce = LEMON_TRUE;
8d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8d50: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
8d60: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
8d70: 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 61  {.    if( rp->ca
8d80: 6e 52 65 64 75 63 65 20 29 20 63 6f 6e 74 69 6e  nReduce ) contin
8d90: 75 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67  ue;.    ErrorMsg
8da0: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
8db0: 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68  rp->ruleline,"Th
8dc0: 69 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20  is rule can not 
8dd0: 62 65 20 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b  be reduced.\n");
8de0: 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
8df0: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  cnt++;.  }.}../*
8e00: 20 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   Resolve a confl
8e10: 69 63 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ict between the 
8e20: 74 77 6f 20 67 69 76 65 6e 20 61 63 74 69 6f 6e  two given action
8e30: 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f  s.  If the.** co
8e40: 6e 66 6c 69 63 74 20 63 61 6e 27 74 20 62 65 20  nflict can't be 
8e50: 72 65 73 6f 6c 76 65 64 2c 20 72 65 74 75 72 6e  resolved, return
8e60: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
8e70: 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a   NO LONGER TRUE:
8e80: 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65  .**   To resolve
8e90: 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72   a conflict, fir
8ea0: 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  st look to see i
8eb0: 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a  f either action.
8ec0: 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72  **   is on an er
8ed0: 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68  ror rule.  In th
8ee0: 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68  at case, take th
8ef0: 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a  e action which.*
8f00: 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63  *   is not assoc
8f10: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 65  iated with the e
8f20: 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e  rror rule.  If n
8f30: 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a  either or both.*
8f40: 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20  *   actions are 
8f50: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8f60: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74  an error rule, t
8f70: 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20  hen try to.**   
8f80: 75 73 65 20 70 72 65 63 65 64 65 6e 63 65 20 74  use precedence t
8f90: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  o resolve the co
8fa0: 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  nflict..**.** If
8fb0: 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69   either action i
8fc0: 73 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20  s a SHIFT, then 
8fd0: 69 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20  it must be apx. 
8fe0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
8ff0: 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20  n won't work if 
9000: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apx->type==REDUC
9010: 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d  E and apy->type=
9020: 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69  =SHIFT..*/.stati
9030: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f  c int resolve_co
9040: 6e 66 6c 69 63 74 28 0a 20 20 73 74 72 75 63 74  nflict(.  struct
9050: 20 61 63 74 69 6f 6e 20 2a 61 70 78 2c 0a 20 20   action *apx,.  
9060: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
9070: 70 79 2c 0a 20 20 73 74 72 75 63 74 20 73 79 6d  py,.  struct sym
9080: 62 6f 6c 20 2a 65 72 72 73 79 6d 20 20 20 2f 2a  bol *errsym   /*
9090: 20 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f   The error symbo
90a0: 6c 20 28 69 66 20 64 65 66 69 6e 65 64 2e 20 20  l (if defined.  
90b0: 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 29 20  NULL otherwise) 
90c0: 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73  */.){.  struct s
90d0: 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79  ymbol *spx, *spy
90e0: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
90f0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70   0;.  assert( ap
9100: 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29  x->sp==apy->sp )
9110: 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  ;  /* Otherwise 
9120: 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e  there would be n
9130: 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  o conflict */.  
9140: 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53  if( apx->type==S
9150: 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70  HIFT && apy->typ
9160: 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20  e==SHIFT ){.    
9170: 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 53 43 4f  apy->type = SSCO
9180: 4e 46 4c 49 43 54 3b 0a 20 20 20 20 65 72 72 63  NFLICT;.    errc
9190: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nt++;.  }.  if( 
91a0: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apx->type==SHIFT
91b0: 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52   && apy->type==R
91c0: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78  EDUCE ){.    spx
91d0: 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20   = apx->sp;.    
91e0: 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d  spy = apy->x.rp-
91f0: 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66  >precsym;.    if
9200: 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d  ( spy==0 || spx-
9210: 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e  >prec<0 || spy->
9220: 70 72 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  prec<0 ){.      
9230: 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72  /* Not enough pr
9240: 65 63 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61  ecedence informa
9250: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  tion. */.      a
9260: 70 79 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e  py->type = SRCON
9270: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
9280: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
9290: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
92a0: 70 79 2d 3e 70 72 65 63 20 29 7b 20 20 20 20 2f  py->prec ){    /
92b0: 2a 20 4c 6f 77 65 72 20 70 72 65 63 65 64 65 6e  * Lower preceden
92c0: 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20 20  ce wins */.     
92d0: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
92e0: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
92f0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
9300: 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c<spy->prec ){. 
9310: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
9320: 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   SH_RESOLVED;.  
9330: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
9340: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
9350: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
9360: 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65 20  RIGHT ){ /* Use 
9370: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
9380: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
9390: 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20 20  _RESOLVED;      
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93b0: 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63 69         /* associ
93c0: 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20 7d  ativity */.    }
93d0: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
93e0: 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26  ec==spy->prec &&
93f0: 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46   spx->assoc==LEF
9400: 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65 61  T ){  /* to brea
9410: 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20 61  k tie */.      a
9420: 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45  px->type = SH_RE
9430: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SOLVED;.    }els
9440: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
9450: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
9460: 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73  >prec && spx->as
9470: 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20  soc==NONE );.   
9480: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53     apy->type = S
9490: 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20  RCONFLICT;.     
94a0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
94b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78  .  }else if( apx
94c0: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
94d0: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44  & apy->type==RED
94e0: 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d  UCE ){.    spx =
94f0: 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apx->x.rp->prec
9500: 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61  sym;.    spy = a
9510: 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  py->x.rp->precsy
9520: 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d  m;.    if( spx==
9530: 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73  0 || spy==0 || s
9540: 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20  px->prec<0 ||.  
9550: 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c    spy->prec<0 ||
9560: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
9570: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
9580: 70 79 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f 4e  py->type = RRCON
9590: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
95a0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
95b0: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
95c0: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
95d0: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
95e0: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
95f0: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
9600: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
9610: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
9620: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
9630: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
9640: 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
9650: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52   apx->type==SH_R
9660: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
9670: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52   apx->type==RD_R
9680: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
9690: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43 4f   apx->type==SSCO
96a0: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
96b0: 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e  apx->type==SRCON
96c0: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
96d0: 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46  px->type==RRCONF
96e0: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
96f0: 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f  y->type==SH_RESO
9700: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
9710: 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f  y->type==RD_RESO
9720: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
9730: 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c  y->type==SSCONFL
9740: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
9750: 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49  ->type==SRCONFLI
9760: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  CT ||.      apy-
9770: 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43  >type==RRCONFLIC
9780: 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20  T.    );.    /* 
9790: 54 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54  The REDUCE/SHIFT
97a0: 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70   case cannot hap
97b0: 70 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46  pen because SHIF
97c0: 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20  Ts come before. 
97d0: 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e     ** REDUCEs on
97e0: 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77   the list.  If w
97f0: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
9800: 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65  nt it must be be
9810: 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
9820: 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74   parser conflict
9830: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
9840: 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20  n resolved. */. 
9850: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
9860: 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  nt;.}./*********
9870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
9880: 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66  m the file "conf
9890: 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  iglist.c" ******
98a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
98b0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
98c0: 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e  nes to processin
98d0: 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  g a configuratio
98e0: 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64  n list and build
98f0: 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69  ing a state.** i
9900: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
9910: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
9920: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
9930: 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74  config *freelist
9940: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69   = 0;      /* Li
9950: 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69  st of free confi
9960: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  gurations */.sta
9970: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
9980: 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20  g *current = 0; 
9990: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
99a0: 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72  list of configur
99b0: 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
99c0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
99d0: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b  *currentend = 0;
99e0: 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69     /* Last on li
99f0: 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f  st of configs */
9a00: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
9a10: 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30  onfig *basis = 0
9a20: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  ;         /* Top
9a30: 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69   of list of basi
9a40: 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61  s configs */.sta
9a50: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
9a60: 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30  g **basisend = 0
9a70: 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20  ;     /* End of 
9a80: 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f  list of basis co
9a90: 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74  nfigs */../* Ret
9aa0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9ab0: 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61   a new configura
9ac0: 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
9ad0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
9ae0: 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74  ewconfig(){.  st
9af0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
9b00: 63 66 67 3b 0a 20 20 69 66 28 20 66 72 65 65 6c  cfg;.  if( freel
9b10: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ist==0 ){.    in
9b20: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74  t i;.    int amt
9b30: 20 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c 69   = 3;.    freeli
9b40: 73 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e  st = (struct con
9b50: 66 69 67 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d  fig *)calloc( am
9b60: 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  t, sizeof(struct
9b70: 20 63 6f 6e 66 69 67 29 20 29 3b 0a 20 20 20 20   config) );.    
9b80: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
9b90: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
9ba0: 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20  (stderr,"Unable 
9bb0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
9bc0: 72 79 20 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e  ry for a new con
9bd0: 66 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20  figuration.");. 
9be0: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
9bf0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
9c00: 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66   i<amt-1; i++) f
9c10: 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20  reelist[i].next 
9c20: 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d  = &freelist[i+1]
9c30: 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61  ;.    freelist[a
9c40: 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
9c50: 20 20 7d 0a 20 20 6e 65 77 63 66 67 20 3d 20 66    }.  newcfg = f
9c60: 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c  reelist;.  freel
9c70: 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e  ist = freelist->
9c80: 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e  next;.  return n
9c90: 65 77 63 66 67 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  ewcfg;.}../* The
9ca0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22   configuration "
9cb0: 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  old" is no longe
9cc0: 72 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41 54  r used */.PRIVAT
9cd0: 45 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e  E void deletecon
9ce0: 66 69 67 28 73 74 72 75 63 74 20 63 6f 6e 66 69  fig(struct confi
9cf0: 67 20 2a 6f 6c 64 29 0a 7b 0a 20 20 6f 6c 64 2d  g *old).{.  old-
9d00: 3e 6e 65 78 74 20 3d 20 66 72 65 65 6c 69 73 74  >next = freelist
9d10: 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 6f  ;.  freelist = o
9d20: 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61  ld;.}../* Initia
9d30: 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67  lized the config
9d40: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69  uration list bui
9d50: 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  lder */.void Con
9d60: 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 7b 0a  figlist_init(){.
9d70: 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20    current = 0;. 
9d80: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
9d90: 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20  urrent;.  basis 
9da0: 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  = 0;.  basisend 
9db0: 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66  = &basis;.  Conf
9dc0: 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a  igtable_init();.
9dd0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
9de0: 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20  Initialized the 
9df0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
9e00: 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f  st builder */.vo
9e10: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65  id Configlist_re
9e20: 73 65 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74  set(){.  current
9e30: 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65   = 0;.  currente
9e40: 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20  nd = &current;. 
9e50: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
9e60: 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b  sisend = &basis;
9e70: 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63  .  Configtable_c
9e80: 6c 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75 72  lear(0);.  retur
9e90: 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f  n;.}../* Add ano
9ea0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  ther configurati
9eb0: 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  on to the config
9ec0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
9ed0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
9ee0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 0a 20  onfiglist_add(. 
9ef0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
9f00: 2c 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65  ,    /* The rule
9f10: 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 20 20 20   */.  int dot   
9f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9f30: 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20  ex into the RHS 
9f40: 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72  of the rule wher
9f50: 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a  e the dot goes *
9f60: 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  /.){.  struct co
9f70: 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c  nfig *cfp, model
9f80: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
9f90: 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20  rentend!=0 );.  
9fa0: 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20  model.rp = rp;. 
9fb0: 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74   model.dot = dot
9fc0: 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67  ;.  cfp = Config
9fd0: 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65  table_find(&mode
9fe0: 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30  l);.  if( cfp==0
9ff0: 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65   ){.    cfp = ne
a000: 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63  wconfig();.    c
a010: 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20  fp->rp = rp;.   
a020: 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b   cfp->dot = dot;
a030: 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20  .    cfp->fws = 
a040: 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66  SetNew();.    cf
a050: 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20  p->stp = 0;.    
a060: 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d  cfp->fplp = cfp-
a070: 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63  >bplp = 0;.    c
a080: 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  fp->next = 0;.  
a090: 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20    cfp->bp = 0;. 
a0a0: 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d     *currentend =
a0b0: 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e   cfp;.    curren
a0c0: 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78  tend = &cfp->nex
a0d0: 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62  t;.    Configtab
a0e0: 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a  le_insert(cfp);.
a0f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70    }.  return cfp
a100: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61  ;.}../* Add a ba
a110: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
a120: 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75  n to the configu
a130: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73  ration list */.s
a140: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
a150: 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69  nfiglist_addbasi
a160: 73 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72  s(struct rule *r
a170: 70 2c 20 69 6e 74 20 64 6f 74 29 0a 7b 0a 20 20  p, int dot).{.  
a180: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
a190: 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73  fp, model;..  as
a1a0: 73 65 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d  sert( basisend!=
a1b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  0 );.  assert( c
a1c0: 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a  urrentend!=0 );.
a1d0: 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b    model.rp = rp;
a1e0: 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64  .  model.dot = d
a1f0: 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66  ot;.  cfp = Conf
a200: 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f  igtable_find(&mo
a210: 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d  del);.  if( cfp=
a220: 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20  =0 ){.    cfp = 
a230: 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20  newconfig();.   
a240: 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20   cfp->rp = rp;. 
a250: 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f     cfp->dot = do
a260: 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20  t;.    cfp->fws 
a270: 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20  = SetNew();.    
a280: 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20  cfp->stp = 0;.  
a290: 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66    cfp->fplp = cf
a2a0: 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20  p->bplp = 0;.   
a2b0: 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a   cfp->next = 0;.
a2c0: 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b      cfp->bp = 0;
a2d0: 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64  .    *currentend
a2e0: 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72   = cfp;.    curr
a2f0: 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e  entend = &cfp->n
a300: 65 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65  ext;.    *basise
a310: 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61  nd = cfp;.    ba
a320: 73 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62  sisend = &cfp->b
a330: 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62  p;.    Configtab
a340: 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a  le_insert(cfp);.
a350: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70    }.  return cfp
a360: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20  ;.}../* Compute 
a370: 74 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74  the closure of t
a380: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
a390: 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f   list */.void Co
a3a0: 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65  nfiglist_closure
a3b0: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
a3c0: 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp).{.  struct 
a3d0: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65  config *cfp, *ne
a3e0: 77 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 72  wcfp;.  struct r
a3f0: 75 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b  ule *rp, *newrp;
a400: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
a410: 20 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e   *sp, *xsp;.  in
a420: 74 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73  t i, dot;..  ass
a430: 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21  ert( currentend!
a440: 3d 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d  =0 );.  for(cfp=
a450: 63 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63 66  current; cfp; cf
a460: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
a470: 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a    rp = cfp->rp;.
a480: 20 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64      dot = cfp->d
a490: 6f 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74 3e  ot;.    if( dot>
a4a0: 3d 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  =rp->nrhs ) cont
a4b0: 69 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20 72  inue;.    sp = r
a4c0: 70 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20  p->rhs[dot];.   
a4d0: 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e   if( sp->type==N
a4e0: 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ONTERMINAL ){.  
a4f0: 20 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c 65      if( sp->rule
a500: 3d 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d  ==0 && sp!=lemp-
a510: 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20  >errsym ){.     
a520: 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
a530: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c  ->filename,rp->l
a540: 69 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c  ine,"Nonterminal
a550: 20 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20 72   \"%s\" has no r
a560: 75 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20  ules.",.        
a570: 20 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20    sp->name);.   
a580: 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
a590: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
a5a0: 20 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d 73       for(newrp=s
a5b0: 70 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20  p->rule; newrp; 
a5c0: 6e 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78  newrp=newrp->nex
a5d0: 74 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20 6e  tlhs){.        n
a5e0: 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69  ewcfp = Configli
a5f0: 73 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29 3b  st_add(newrp,0);
a600: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 64  .        for(i=d
a610: 6f 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  ot+1; i<rp->nrhs
a620: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
a630: 20 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b    xsp = rp->rhs[
a640: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  i];.          if
a650: 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  ( xsp->type==TER
a660: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
a670: 20 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63       SetAdd(newc
a680: 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64  fp->fws,xsp->ind
a690: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex);.           
a6a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a6b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70 2d    }else if( xsp-
a6c0: 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
a6d0: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
a6e0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
a6f0: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
a700: 6b 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20  k<xsp->nsubsym; 
a710: 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  k++){.          
a720: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
a730: 70 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75 62  p->fws, xsp->sub
a740: 73 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a  sym[k]->index);.
a750: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
a760: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a770: 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20  ..  }else{.     
a780: 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f 6e 28         SetUnion(
a790: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d  newcfp->fws,xsp-
a7a0: 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20  >firstset);.    
a7b0: 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d          if( xsp-
a7c0: 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46  >lambda==LEMON_F
a7d0: 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 20  ALSE ) break;.. 
a7e0: 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20 20 69 66   }..}.        if
a7f0: 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20  ( i==rp->nrhs ) 
a800: 50 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e  Plink_add(&cfp->
a810: 66 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20  fplp,newcfp);.  
a820: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a830: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
a840: 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75  Sort the configu
a850: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
a860: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  oid Configlist_s
a870: 6f 72 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74  ort(){.  current
a880: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
a890: 67 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20  g *)msort((char 
a8a0: 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20  *)current,(char 
a8b0: 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65  **)&(current->ne
a8c0: 78 74 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a  xt),Configcmp);.
a8d0: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30    currentend = 0
a8e0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
a8f0: 2a 20 53 6f 72 74 20 74 68 65 20 62 61 73 69 73  * Sort the basis
a900: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
a910: 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ist */.void Conf
a920: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
a930: 28 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73  (){.  basis = (s
a940: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d  truct config *)m
a950: 73 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75 72  sort((char *)cur
a960: 72 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26 28  rent,(char **)&(
a970: 63 75 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e  current->bp),Con
a980: 66 69 67 63 6d 70 29 3b 0a 20 20 62 61 73 69 73  figcmp);.  basis
a990: 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  end = 0;.  retur
a9a0: 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  n;.}../* Return 
a9b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
a9c0: 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e   head of the con
a9d0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
a9e0: 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  and.** reset the
a9f0: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
aa00: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
aa10: 73 74 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20 73  st_return(){.  s
aa20: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
aa30: 64 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65  d;.  old = curre
aa40: 6e 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20  nt;.  current = 
aa50: 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20  0;.  currentend 
aa60: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c  = 0;.  return ol
aa70: 64 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  d;.}../* Return 
aa80: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
aa90: 20 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e   head of the con
aaa0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
aab0: 61 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  and.** reset the
aac0: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
aad0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
aae0: 73 74 5f 62 61 73 69 73 28 29 7b 0a 20 20 73 74  st_basis(){.  st
aaf0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64  ruct config *old
ab00: 3b 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b  ;.  old = basis;
ab10: 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20  .  basis = 0;.  
ab20: 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20  basisend = 0;.  
ab30: 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f  return old;.}../
ab40: 2a 20 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65  * Free all eleme
ab50: 6e 74 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e  nts of the given
ab60: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
ab70: 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ist */.void Conf
ab80: 69 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75 63  iglist_eat(struc
ab90: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b  t config *cfp).{
aba0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
abb0: 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f 72   *nextcfp;.  for
abc0: 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78 74  (; cfp; cfp=next
abd0: 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63 66  cfp){.    nextcf
abe0: 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20  p = cfp->next;. 
abf0: 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e     assert( cfp->
ac00: 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61  fplp==0 );.    a
ac10: 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c 70  ssert( cfp->bplp
ac20: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 63  ==0 );.    if( c
ac30: 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72 65  fp->fws ) SetFre
ac40: 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20  e(cfp->fws);.   
ac50: 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63 66   deleteconfig(cf
ac60: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
ac70: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
ac80: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
ac90: 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20 2a  file "error.c" *
aca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
acb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
acc0: 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72  /./*.** Code for
acd0: 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72 20   printing error 
ace0: 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 76 6f 69  message..*/..voi
acf0: 64 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74  d ErrorMsg(const
ad00: 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c   char *filename,
ad10: 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e   int lineno, con
ad20: 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c  st char *format,
ad30: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
ad40: 20 61 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 73   ap;.  fprintf(s
ad50: 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 22  tderr, "%s:%d: "
ad60: 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 6c 69 6e 65  , filename, line
ad70: 6e 6f 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  no);.  va_start(
ad80: 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 76  ap, format);.  v
ad90: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 66  fprintf(stderr,f
ada0: 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61 5f  ormat,ap);.  va_
adb0: 65 6e 64 28 61 70 29 3b 0a 20 20 66 70 72 69 6e  end(ap);.  fprin
adc0: 74 66 28 73 74 64 65 72 72 2c 20 22 5c 6e 22 29  tf(stderr, "\n")
add0: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
ade0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
adf0: 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a  ile "main.c" ***
ae00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ae10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ae20: 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72  */./*.** Main pr
ae30: 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74  ogram file for t
ae40: 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
ae50: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f  generator..*/../
ae60: 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d  * Report an out-
ae70: 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74  of-memory condit
ae80: 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20  ion and abort.  
ae90: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
aea0: 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20   is used mostly 
aeb0: 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68  by the "MemoryCh
aec0: 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74  eck" macro in st
aed0: 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d  ruct.h.*/.void m
aee0: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a 20  emory_error(){. 
aef0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
af00: 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20  "Out of memory. 
af10: 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29   Aborting...\n")
af20: 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  ;.  exit(1);.}..
af30: 73 74 61 74 69 63 20 69 6e 74 20 6e 44 65 66 69  static int nDefi
af40: 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ne = 0;      /* 
af50: 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f 70 74  Number of -D opt
af60: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  ions on the comm
af70: 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74 61 74  and line */.stat
af80: 69 63 20 63 68 61 72 20 2a 2a 61 7a 44 65 66 69  ic char **azDefi
af90: 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d 65  ne = 0;  /* Name
afa0: 20 6f 66 20 74 68 65 20 2d 44 20 6d 61 63 72 6f   of the -D macro
afb0: 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 72 6f  s */../* This ro
afc0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
afd0: 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e  with the argumen
afe0: 74 20 74 6f 20 65 61 63 68 20 2d 44 20 63 6f 6d  t to each -D com
aff0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
b000: 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d 61 63  ..** Add the mac
b010: 72 6f 20 64 65 66 69 6e 65 64 20 74 6f 20 74 68  ro defined to th
b020: 65 20 61 7a 44 65 66 69 6e 65 20 61 72 72 61 79  e azDefine array
b030: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b040: 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e   handle_D_option
b050: 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61  (char *z){.  cha
b060: 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65 66 69  r **paz;.  nDefi
b070: 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69 6e 65  ne++;.  azDefine
b080: 20 3d 20 28 63 68 61 72 20 2a 2a 29 20 72 65 61   = (char **) rea
b090: 6c 6c 6f 63 28 61 7a 44 65 66 69 6e 65 2c 20 73  lloc(azDefine, s
b0a0: 69 7a 65 6f 66 28 61 7a 44 65 66 69 6e 65 5b 30  izeof(azDefine[0
b0b0: 5d 29 2a 6e 44 65 66 69 6e 65 29 3b 0a 20 20 69  ])*nDefine);.  i
b0c0: 66 28 20 61 7a 44 65 66 69 6e 65 3d 3d 30 20 29  f( azDefine==0 )
b0d0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
b0e0: 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d  derr,"out of mem
b0f0: 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ory\n");.    exi
b100: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 70 61 7a 20  t(1);.  }.  paz 
b110: 3d 20 26 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66  = &azDefine[nDef
b120: 69 6e 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20 3d  ine-1];.  *paz =
b130: 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63   (char *) malloc
b140: 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29  ( lemonStrlen(z)
b150: 2b 31 20 29 3b 0a 20 20 69 66 28 20 2a 70 61 7a  +1 );.  if( *paz
b160: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
b170: 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f  tf(stderr,"out o
b180: 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
b190: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
b1a0: 20 73 74 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29   strcpy(*paz, z)
b1b0: 3b 0a 20 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20  ;.  for(z=*paz; 
b1c0: 2a 7a 20 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a  *z && *z!='='; z
b1d0: 2b 2b 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a  ++){}.  *z = 0;.
b1e0: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
b1f0: 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
b200: 65 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63  e = NULL;.static
b210: 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 54 5f 6f   void handle_T_o
b220: 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a  ption(char *z){.
b230: 20 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e    user_templaten
b240: 61 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 20 6d  ame = (char *) m
b250: 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
b260: 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28  en(z)+1 );.  if(
b270: 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61   user_templatena
b280: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  me==0 ){.    mem
b290: 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d  ory_error();.  }
b2a0: 0a 20 20 73 74 72 63 70 79 28 75 73 65 72 5f 74  .  strcpy(user_t
b2b0: 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 20 7a 29 3b  emplatename, z);
b2c0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20  .}../* The main 
b2d0: 70 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20  program.  Parse 
b2e0: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
b2f0: 20 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f   and do it... */
b300: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
b310: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
b320: 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  .{.  static int 
b330: 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73  version = 0;.  s
b340: 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67  tatic int rpflag
b350: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
b360: 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30  nt basisflag = 0
b370: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  ;.  static int c
b380: 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73  ompress = 0;.  s
b390: 74 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20  tatic int quiet 
b3a0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
b3b0: 74 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30  t statistics = 0
b3c0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d  ;.  static int m
b3d0: 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  hflag = 0;.  sta
b3e0: 74 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f  tic int nolineno
b3f0: 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  sflag = 0;.  sta
b400: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
b410: 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d  ions options[] =
b420: 20 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47   {.    {OPT_FLAG
b430: 2c 20 22 62 22 2c 20 28 63 68 61 72 2a 29 26 62  , "b", (char*)&b
b440: 61 73 69 73 66 6c 61 67 2c 20 22 50 72 69 6e 74  asisflag, "Print
b450: 20 6f 6e 6c 79 20 74 68 65 20 62 61 73 69 73 20   only the basis 
b460: 69 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20  in report."},.  
b470: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22    {OPT_FLAG, "c"
b480: 2c 20 28 63 68 61 72 2a 29 26 63 6f 6d 70 72 65  , (char*)&compre
b490: 73 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72  ss, "Don't compr
b4a0: 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ess the action t
b4b0: 61 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  able."},.    {OP
b4c0: 54 5f 46 53 54 52 2c 20 22 44 22 2c 20 28 63 68  T_FSTR, "D", (ch
b4d0: 61 72 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f 70 74  ar*)handle_D_opt
b4e0: 69 6f 6e 2c 20 22 44 65 66 69 6e 65 20 61 6e 20  ion, "Define an 
b4f0: 25 69 66 64 65 66 20 6d 61 63 72 6f 2e 22 7d 2c  %ifdef macro."},
b500: 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20  .    {OPT_FSTR, 
b510: 22 54 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64  "T", (char*)hand
b520: 6c 65 5f 54 5f 6f 70 74 69 6f 6e 2c 20 22 53 70  le_T_option, "Sp
b530: 65 63 69 66 79 20 61 20 74 65 6d 70 6c 61 74 65  ecify a template
b540: 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f   file."},.    {O
b550: 50 54 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28 63  PT_FLAG, "g", (c
b560: 68 61 72 2a 29 26 72 70 66 6c 61 67 2c 20 22 50  har*)&rpflag, "P
b570: 72 69 6e 74 20 67 72 61 6d 6d 61 72 20 77 69 74  rint grammar wit
b580: 68 6f 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d 2c  hout actions."},
b590: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
b5a0: 22 6d 22 2c 20 28 63 68 61 72 2a 29 26 6d 68 66  "m", (char*)&mhf
b5b0: 6c 61 67 2c 20 22 4f 75 74 70 75 74 20 61 20 6d  lag, "Output a m
b5c0: 61 6b 65 68 65 61 64 65 72 73 20 63 6f 6d 70 61  akeheaders compa
b5d0: 74 69 62 6c 65 20 66 69 6c 65 2e 22 7d 2c 0a 20  tible file."},. 
b5e0: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6c     {OPT_FLAG, "l
b5f0: 22 2c 20 28 63 68 61 72 2a 29 26 6e 6f 6c 69 6e  ", (char*)&nolin
b600: 65 6e 6f 73 66 6c 61 67 2c 20 22 44 6f 20 6e 6f  enosflag, "Do no
b610: 74 20 70 72 69 6e 74 20 23 6c 69 6e 65 20 73 74  t print #line st
b620: 61 74 65 6d 65 6e 74 73 2e 22 7d 2c 0a 20 20 20  atements."},.   
b630: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c   {OPT_FLAG, "q",
b640: 20 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20   (char*)&quiet, 
b650: 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70  "(Quiet) Don't p
b660: 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20  rint the report 
b670: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
b680: 54 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28 63 68  T_FLAG, "s", (ch
b690: 61 72 2a 29 26 73 74 61 74 69 73 74 69 63 73 2c  ar*)&statistics,
b6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 20 20 20 20 22 50 72 69 6e 74 20 70 61 72 73 65      "Print parse
b6d0: 72 20 73 74 61 74 73 20 74 6f 20 73 74 61 6e 64  r stats to stand
b6e0: 61 72 64 20 6f 75 74 70 75 74 2e 22 7d 2c 0a 20  ard output."},. 
b6f0: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 78     {OPT_FLAG, "x
b700: 22 2c 20 28 63 68 61 72 2a 29 26 76 65 72 73 69  ", (char*)&versi
b710: 6f 6e 2c 20 22 50 72 69 6e 74 20 74 68 65 20 76  on, "Print the v
b720: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 22 7d  ersion number."}
b730: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
b740: 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e  0,0,0}.  };.  in
b750: 74 20 69 3b 0a 20 20 69 6e 74 20 65 78 69 74 63  t i;.  int exitc
b760: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 6c 65  ode;.  struct le
b770: 6d 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 61 74 65 78  mon lem;..  atex
b780: 69 74 28 4c 65 6d 6f 6e 41 74 45 78 69 74 29 3b  it(LemonAtExit);
b790: 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61 72 67 76  ..  OptInit(argv
b7a0: 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72 72 29  ,options,stderr)
b7b0: 3b 0a 20 20 69 66 28 20 76 65 72 73 69 6f 6e 20  ;.  if( version 
b7c0: 29 7b 0a 20 20 20 20 20 70 72 69 6e 74 66 28 22  ){.     printf("
b7d0: 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e  Lemon version 1.
b7e0: 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78 69 74  0\n");.     exit
b7f0: 28 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20  (0); .  }.  if( 
b800: 4f 70 74 4e 41 72 67 73 28 29 21 3d 31 20 29 7b  OptNArgs()!=1 ){
b810: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
b820: 65 72 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e 65  err,"Exactly one
b830: 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65   filename argume
b840: 6e 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 5c  nt is required.\
b850: 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
b860: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
b870: 6c 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c  lem, 0, sizeof(l
b880: 65 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 6f  em));.  lem.erro
b890: 72 63 6e 74 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e  rcnt = 0;.  lem.
b8a0: 6e 65 78 70 65 63 74 65 64 20 3d 20 2d 31 3b 0a  nexpected = -1;.
b8b0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
b8c0: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a   the machine */.
b8d0: 20 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29    Strsafe_init()
b8e0: 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28  ;.  Symbol_init(
b8f0: 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69 74 28  );.  State_init(
b900: 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d  );.  lem.argv0 =
b910: 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e   argv[0];.  lem.
b920: 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72  filename = OptAr
b930: 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69  g(0);.  lem.basi
b940: 73 66 6c 61 67 20 3d 20 62 61 73 69 73 66 6c 61  sflag = basisfla
b950: 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65 6e  g;.  lem.nolinen
b960: 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65 6e  osflag = nolinen
b970: 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f 6c  osflag;.  Symbol
b980: 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20 6c 65 6d  _new("$");.  lem
b990: 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c  .errsym = Symbol
b9a0: 5f 6e 65 77 28 22 65 72 72 6f 72 22 29 3b 0a 20  _new("error");. 
b9b0: 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e 75 73 65   lem.errsym->use
b9c0: 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50  Cnt = 0;..  /* P
b9d0: 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 66  arse the input f
b9e0: 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26  ile */.  Parse(&
b9f0: 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e  lem);.  if( lem.
ba00: 65 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28  errorcnt ) exit(
ba10: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20  lem.errorcnt);. 
ba20: 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d 3d   if( lem.nrule==
ba30: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
ba40: 28 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20 67  (stderr,"Empty g
ba50: 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20  rammar.\n");.   
ba60: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20   exit(1);.  }.. 
ba70: 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e   /* Count and in
ba80: 64 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  dex the symbols 
ba90: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  of the grammar *
baa0: 2f 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20  /.  lem.nsymbol 
bab0: 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29  = Symbol_count()
bac0: 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22  ;.  Symbol_new("
bad0: 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c  {default}");.  l
bae0: 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d  em.symbols = Sym
baf0: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20  bol_arrayof();. 
bb00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d   for(i=0; i<=lem
bb10: 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c  .nsymbol; i++) l
bb20: 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69  em.symbols[i]->i
bb30: 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72  ndex = i;.  qsor
bb40: 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65  t(lem.symbols,le
bb50: 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65  m.nsymbol+1,size
bb60: 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
bb70: 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b  *), Symbolcmpp);
bb80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c  .  for(i=0; i<=l
bb90: 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  em.nsymbol; i++)
bba0: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d   lem.symbols[i]-
bbb0: 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 66 6f  >index = i;.  fo
bbc0: 72 28 69 3d 31 3b 20 69 73 75 70 70 65 72 28 6c  r(i=1; isupper(l
bbd0: 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  em.symbols[i]->n
bbe0: 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20  ame[0]); i++);. 
bbf0: 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d   lem.nterminal =
bc00: 20 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61   i;..  /* Genera
bc10: 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f 66 20  te a reprint of 
bc20: 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69 66 20  the grammar, if 
bc30: 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74 68 65  requested on the
bc40: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f   command line */
bc50: 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20 29 7b  .  if( rpflag ){
bc60: 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26 6c 65  .    Reprint(&le
bc70: 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
bc80: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
bc90: 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c 6c 20  he size for all 
bca0: 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72 73 74  follow and first
bcb0: 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53 65 74   sets */.    Set
bcc0: 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d 69 6e  Size(lem.ntermin
bcd0: 61 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  al+1);..    /* F
bce0: 69 6e 64 20 74 68 65 20 70 72 65 63 65 64 65 6e  ind the preceden
bcf0: 63 65 20 66 6f 72 20 65 76 65 72 79 20 70 72 6f  ce for every pro
bd00: 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28 74 68  duction rule (th
bd10: 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20  at has one) */. 
bd20: 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65     FindRulePrece
bd30: 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20  dences(&lem);.. 
bd40: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
bd50: 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d  e lambda-nonterm
bd60: 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20 66 69  inals and the fi
bd70: 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65 76 65  rst-sets for eve
bd80: 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72  ry.    ** nonter
bd90: 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e  minal */.    Fin
bda0: 64 46 69 72 73 74 53 65 74 73 28 26 6c 65 6d 29  dFirstSets(&lem)
bdb0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
bdc0: 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74  e all LR(0) stat
bdd0: 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f 72 64  es.  Also record
bde0: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70   follow-set prop
bdf0: 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c  agation.    ** l
be00: 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74 68 65  inks so that the
be10: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20   follow-set can 
be20: 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65  be computed late
be30: 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74  r */.    lem.nst
be40: 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e  ate = 0;.    Fin
be50: 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20  dStates(&lem);. 
be60: 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20     lem.sorted = 
be70: 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 3b  State_arrayof();
be80: 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75 70 20  ..    /* Tie up 
be90: 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20 74 68  loose ends on th
bea0: 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69  e propagation li
beb0: 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c  nks */.    FindL
bec0: 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  inks(&lem);..   
bed0: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
bee0: 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20 65 76  follow set of ev
bef0: 65 72 79 20 72 65 64 75 63 69 62 6c 65 20 63 6f  ery reducible co
bf00: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20  nfiguration */. 
bf10: 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74     FindFollowSet
bf20: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
bf30: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74   Compute the act
bf40: 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ion tables */.  
bf50: 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c    FindActions(&l
bf60: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  em);..    /* Com
bf70: 70 72 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e  press the action
bf80: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69   tables */.    i
bf90: 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29  f( compress==0 )
bfa0: 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28   CompressTables(
bfb0: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  &lem);..    /* R
bfc0: 65 6f 72 64 65 72 20 61 6e 64 20 72 65 6e 75 6d  eorder and renum
bfd0: 62 65 72 20 74 68 65 20 73 74 61 74 65 73 20 73  ber the states s
bfe0: 6f 20 74 68 61 74 20 73 74 61 74 65 73 20 77 69  o that states wi
bff0: 74 68 20 66 65 77 65 72 20 63 68 6f 69 63 65 73  th fewer choices
c000: 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 61 74  .    ** occur at
c010: 20 74 68 65 20 65 6e 64 2e 20 2a 2f 0a 20 20 20   the end. */.   
c020: 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 26 6c   ResortStates(&l
c030: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  em);..    /* Gen
c040: 65 72 61 74 65 20 61 20 72 65 70 6f 72 74 20 6f  erate a report o
c050: 66 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e  f the parser gen
c060: 65 72 61 74 65 64 2e 20 20 28 74 68 65 20 22 79  erated.  (the "y
c070: 2e 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20 2a  .output" file) *
c080: 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69 65 74  /.    if( !quiet
c090: 20 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28   ) ReportOutput(
c0a0: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  &lem);..    /* G
c0b0: 65 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75 72  enerate the sour
c0c0: 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ce code for the 
c0d0: 70 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52 65  parser */.    Re
c0e0: 70 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20  portTable(&lem, 
c0f0: 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a  mhflag);..    /*
c100: 20 50 72 6f 64 75 63 65 20 61 20 68 65 61 64 65   Produce a heade
c110: 72 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20 62  r file for use b
c120: 79 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20 20  y the scanner.  
c130: 28 54 68 69 73 20 73 74 65 70 20 69 73 0a 20 20  (This step is.  
c140: 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20    ** omitted if 
c150: 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20  the "-m" option 
c160: 69 73 20 75 73 65 64 20 62 65 63 61 75 73 65 20  is used because 
c170: 6d 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c 6c  makeheaders will
c180: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
c190: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75 73   the file for us
c1a0: 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d  .) */.    if( !m
c1b0: 68 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48 65  hflag ) ReportHe
c1c0: 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a  ader(&lem);.  }.
c1d0: 20 20 69 66 28 20 73 74 61 74 69 73 74 69 63 73    if( statistics
c1e0: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
c1f0: 50 61 72 73 65 72 20 73 74 61 74 69 73 74 69 63  Parser statistic
c200: 73 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73 2c  s: %d terminals,
c210: 20 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73   %d nonterminals
c220: 2c 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a 20  , %d rules\n",. 
c230: 20 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e       lem.ntermin
c240: 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20  al, lem.nsymbol 
c250: 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c  - lem.nterminal,
c260: 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20   lem.nrule);.   
c270: 20 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 20   printf("       
c280: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 73              %d s
c290: 74 61 74 65 73 2c 20 25 64 20 70 61 72 73 65 72  tates, %d parser
c2a0: 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c 20   table entries, 
c2b0: 25 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22 2c  %d conflicts\n",
c2c0: 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74  .      lem.nstat
c2d0: 65 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65  e, lem.tablesize
c2e0: 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  , lem.nconflict)
c2f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e  ;.  }.  if( lem.
c300: 6e 65 78 70 65 63 74 65 64 20 3c 20 30 20 29 20  nexpected < 0 ) 
c310: 7b 0a 20 20 20 20 6c 65 6d 2e 6e 65 78 70 65 63  {.    lem.nexpec
c320: 74 65 64 20 3d 20 30 3b 20 20 2f 2a 20 67 72 61  ted = 0;  /* gra
c330: 6d 6d 61 72 20 64 69 64 6e 27 74 20 68 61 76 65  mmar didn't have
c340: 20 61 6e 20 25 65 78 70 65 63 74 20 64 65 63 6c   an %expect decl
c350: 61 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 7d 0a  aration. */.  }.
c360: 20 20 69 66 28 20 6c 65 6d 2e 6e 63 6f 6e 66 6c    if( lem.nconfl
c370: 69 63 74 20 21 3d 20 6c 65 6d 2e 6e 65 78 70 65  ict != lem.nexpe
c380: 63 74 65 64 20 29 7b 0a 20 20 20 20 66 70 72 69  cted ){.    fpri
c390: 6e 74 66 28 73 74 64 65 72 72 2c 22 25 64 20 70  ntf(stderr,"%d p
c3a0: 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73  arsing conflicts
c3b0: 20 28 25 64 20 65 78 70 65 63 74 65 64 29 2e 5c   (%d expected).\
c3c0: 6e 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74  n",lem.nconflict
c3d0: 2c 6c 65 6d 2e 6e 65 78 70 65 63 74 65 64 29 3b  ,lem.nexpected);
c3e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72  .  }..  /* retur
c3f0: 6e 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  n 0 on success, 
c400: 31 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f  1 on failure. */
c410: 0a 20 20 65 78 69 74 63 6f 64 65 20 3d 20 28 28  .  exitcode = ((
c420: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30  lem.errorcnt > 0
c430: 29 20 7c 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c  ) || (lem.nconfl
c440: 69 63 74 20 21 3d 20 6c 65 6d 2e 6e 65 78 70 65  ict != lem.nexpe
c450: 63 74 65 64 29 29 20 3f 20 31 20 3a 20 30 3b 0a  cted)) ? 1 : 0;.
c460: 20 20 73 75 63 63 65 73 73 66 75 6c 5f 65 78 69    successful_exi
c470: 74 20 3d 20 28 65 78 69 74 63 6f 64 65 20 3d 3d  t = (exitcode ==
c480: 20 30 29 3b 0a 20 20 65 78 69 74 28 65 78 69 74   0);.  exit(exit
c490: 63 6f 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  code);.  return 
c4a0: 28 65 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a  (exitcode);.}./*
c4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4c0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
c4d0: 65 20 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a  e "msort.c" ****
c4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
c500: 2a 2a 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72  ** A generic mer
c510: 67 65 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e  ge-sort program.
c520: 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a  .**.** USAGE:.**
c530: 20 4c 65 74 20 22 70 74 72 22 20 62 65 20 61 20   Let "ptr" be a 
c540: 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20  pointer to some 
c550: 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20  structure which 
c560: 69 73 20 61 74 20 74 68 65 20 68 65 61 64 20 6f  is at the head o
c570: 66 0a 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d  f.** a null-term
c580: 69 6e 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68  inated list.  Th
c590: 65 6e 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c  en to sort the l
c5a0: 69 73 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  ist call:.**.** 
c5b0: 20 20 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28      ptr = msort(
c5c0: 70 74 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29  ptr,&(ptr->next)
c5d0: 2c 63 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20  ,cmpfnc);.**.** 
c5e0: 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63  In the above, "c
c5f0: 6d 70 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e  mpfnc" is a poin
c600: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
c610: 6e 20 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73  n which compares
c620: 0a 2a 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65  .** two instance
c630: 73 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  s of the structu
c640: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  re and returns a
c650: 6e 20 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e  n integer, as in
c660: 0a 2a 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65  .** strcmp.  The
c670: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
c680: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c690: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
c6a0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c  the.** second el
c6b0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e  ement of the lin
c6c0: 6b 65 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20  ked list.  This 
c6d0: 61 64 64 72 65 73 73 20 69 73 20 75 73 65 64 20  address is used 
c6e0: 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68  to compute.** th
c6f0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
c700: 22 6e 65 78 74 22 20 66 69 65 6c 64 20 77 69 74  "next" field wit
c710: 68 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hin the structur
c720: 65 2e 20 20 54 68 65 20 6f 66 66 73 65 74 20 74  e.  The offset t
c730: 6f 0a 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20  o.** the "next" 
c740: 66 69 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f  field must be co
c750: 6e 73 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73  nstant for all s
c760: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
c770: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
c780: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
c790: 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  s a new pointer 
c7a0: 77 68 69 63 68 20 69 73 20 74 68 65 20 68 65 61  which is the hea
c7b0: 64 20 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a  d of the list.**
c7c0: 20 61 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a   after sorting..
c7d0: 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a  **.** ALGORITHM:
c7e0: 0a 2a 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a  .** Merge-sort..
c7f0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
c800: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
c810: 65 20 6e 65 78 74 20 73 74 72 75 63 74 75 72 65  e next structure
c820: 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
c830: 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ist..*/.#define 
c840: 4e 45 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a  NEXT(A) (*(char*
c850: 2a 29 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  *)(((unsigned lo
c860: 6e 67 29 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a  ng)A)+offset))..
c870: 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a  /*.** Inputs:.**
c880: 20 20 20 61 3a 20 20 20 20 20 20 20 41 20 73 6f     a:       A so
c890: 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69  rted, null-termi
c8a0: 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73  nated linked lis
c8b0: 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c  t.  (May be null
c8c0: 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20 20  )..**   b:      
c8d0: 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d   A sorted, null-
c8e0: 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65  terminated linke
c8f0: 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65  d list.  (May be
c900: 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70   null)..**   cmp
c910: 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65 72 20  :     A pointer 
c920: 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  to the compariso
c930: 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20  n function..**  
c940: 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73 65 74   offset:  Offset
c950: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
c960: 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20  e to the "next" 
c970: 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  field..**.** Ret
c980: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
c990: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
c9a0: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
c9b0: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
c9c0: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
c9d0: 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20 61 6e  *   of both a an
c9e0: 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20  d b..**.** Side 
c9f0: 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68  effects:.**   Th
ca00: 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72  e "next" pointer
ca10: 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69  s for elements i
ca20: 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20 61 6e  n the lists a an
ca30: 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63 68 61  d b are.**   cha
ca40: 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
ca50: 63 68 61 72 20 2a 6d 65 72 67 65 28 0a 20 20 63  char *merge(.  c
ca60: 68 61 72 20 2a 61 2c 0a 20 20 63 68 61 72 20 2a  har *a,.  char *
ca70: 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29 28  b,.  int (*cmp)(
ca80: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
ca90: 74 20 63 68 61 72 2a 29 2c 0a 20 20 69 6e 74 20  t char*),.  int 
caa0: 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63 68 61 72  offset.){.  char
cab0: 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20   *ptr, *head;.. 
cac0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
cad0: 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c   head = b;.  }el
cae0: 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20  se if( b==0 ){. 
caf0: 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d     head = a;.  }
cb00: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 28 2a  else{.    if( (*
cb10: 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20 29 7b 0a  cmp)(a,b)<=0 ){.
cb20: 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20        ptr = a;. 
cb30: 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29       a = NEXT(a)
cb40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cb50: 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20     ptr = b;.    
cb60: 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20    b = NEXT(b);. 
cb70: 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20 3d 20     }.    head = 
cb80: 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ptr;.    while( 
cb90: 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20 20 20  a && b ){.      
cba0: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
cbb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 45  =0 ){.        NE
cbc0: 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20  XT(ptr) = a;.   
cbd0: 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20       ptr = a;.  
cbe0: 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61        a = NEXT(a
cbf0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
cc00: 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72          NEXT(ptr
cc10: 29 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 70  ) = b;.        p
cc20: 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20  tr = b;.        
cc30: 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20  b = NEXT(b);.   
cc40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
cc50: 66 28 20 61 20 29 20 4e 45 58 54 28 70 74 72 29  f( a ) NEXT(ptr)
cc60: 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65 20 20   = a;.    else  
cc70: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b    NEXT(ptr) = b;
cc80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 65  .  }.  return he
cc90: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  ad;.}../*.** Inp
cca0: 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a 20  uts:.**   list: 
ccb0: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
ccc0: 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20  a singly-linked 
ccd0: 6c 69 73 74 20 6f 66 20 73 74 72 75 63 74 75 72  list of structur
cce0: 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a 20 20  es..**   next:  
ccf0: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 70      Pointer to p
cd00: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 65  ointer to the se
cd10: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
cd20: 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20 20 63  the list..**   c
cd30: 6d 70 3a 20 20 20 20 20 20 20 41 20 63 6f 6d 70  mp:       A comp
cd40: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
cd50: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61  .**.** Return Va
cd60: 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e  lue:.**   A poin
cd70: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
cd80: 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74  of a sorted list
cd90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cda0: 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 72  elements.**   or
cdb0: 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73 74 2e  ginally in list.
cdc0: 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65  .**.** Side effe
cdd0: 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e  cts:.**   The "n
cde0: 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f  ext" pointers fo
cdf0: 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69  r elements in li
ce00: 73 74 20 61 72 65 20 63 68 61 6e 67 65 64 2e 0a  st are changed..
ce10: 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53 54 53  */.#define LISTS
ce20: 49 5a 45 20 33 30 0a 73 74 61 74 69 63 20 63 68  IZE 30.static ch
ce30: 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20 63 68 61  ar *msort(.  cha
ce40: 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68 61 72 20  r *list,.  char 
ce50: 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74 20 28 2a  **next,.  int (*
ce60: 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  cmp)(const char*
ce70: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
ce80: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
ce90: 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20   offset;.  char 
cea0: 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74  *ep;.  char *set
ceb0: 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LISTSIZE];.  in
cec0: 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20  t i;.  offset = 
ced0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6e  (unsigned long)n
cee0: 65 78 74 20 2d 20 28 75 6e 73 69 67 6e 65 64 20  ext - (unsigned 
cef0: 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20 20 66 6f 72  long)list;.  for
cf00: 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45  (i=0; i<LISTSIZE
cf10: 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d 20  ; i++) set[i] = 
cf20: 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69 73 74  0;.  while( list
cf30: 20 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69 73   ){.    ep = lis
cf40: 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e 45  t;.    list = NE
cf50: 58 54 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e 45  XT(list);.    NE
cf60: 58 54 28 65 70 29 20 3d 20 30 3b 0a 20 20 20 20  XT(ep) = 0;.    
cf70: 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53  for(i=0; i<LISTS
cf80: 49 5a 45 2d 31 20 26 26 20 73 65 74 5b 69 5d 21  IZE-1 && set[i]!
cf90: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
cfa0: 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65  ep = merge(ep,se
cfb0: 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29  t[i],cmp,offset)
cfc0: 3b 0a 20 20 20 20 20 20 73 65 74 5b 69 5d 20 3d  ;.      set[i] =
cfd0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65   0;.    }.    se
cfe0: 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a 20  t[i] = ep;.  }. 
cff0: 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69   ep = 0;.  for(i
d000: 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20  =0; i<LISTSIZE; 
d010: 69 2b 2b 29 20 69 66 28 20 73 65 74 5b 69 5d 20  i++) if( set[i] 
d020: 29 20 65 70 20 3d 20 6d 65 72 67 65 28 73 65 74  ) ep = merge(set
d030: 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66 66 73 65  [i],ep,cmp,offse
d040: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 70 3b  t);.  return ep;
d050: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
d060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
d070: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
d080: 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.c" **********
d090: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d0a0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a  /.static char **
d0b0: 61 72 67 76 3b 0a 73 74 61 74 69 63 20 73 74 72  argv;.static str
d0c0: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f  uct s_options *o
d0d0: 70 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  p;.static FILE *
d0e0: 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65 66  errstream;..#def
d0f0: 69 6e 65 20 49 53 4f 50 54 28 58 29 20 28 28 58  ine ISOPT(X) ((X
d100: 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30  )[0]=='-'||(X)[0
d110: 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28 28  ]=='+'||strchr((
d120: 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a  X),'=')!=0)../*.
d130: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6d  ** Print the com
d140: 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74 68 20 61  mand line with a
d150: 20 63 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e 67   carrot pointing
d160: 20 74 6f 20 74 68 65 20 6b 2d 74 68 20 63 68 61   to the k-th cha
d170: 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  racter.** of the
d180: 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a   n-th field..*/.
d190: 73 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c  static void errl
d1a0: 69 6e 65 28 69 6e 74 20 6e 2c 20 69 6e 74 20 6b  ine(int n, int k
d1b0: 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20  , FILE *err).{. 
d1c0: 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a 20   int spcnt, i;. 
d1d0: 20 69 66 28 20 61 72 67 76 5b 30 5d 20 29 20 66   if( argv[0] ) f
d1e0: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 22 2c  printf(err,"%s",
d1f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63 6e  argv[0]);.  spcn
d200: 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  t = lemonStrlen(
d210: 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20  argv[0]) + 1;.  
d220: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20  for(i=1; i<n && 
d230: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
d240: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
d250: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
d260: 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c 65 6d 6f     spcnt += lemo
d270: 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d 29  nStrlen(argv[i])
d280: 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63 6e 74 20  +1;.  }.  spcnt 
d290: 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20 61 72  += k;.  for(; ar
d2a0: 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69  gv[i]; i++) fpri
d2b0: 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72  ntf(err," %s",ar
d2c0: 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20 73 70  gv[i]);.  if( sp
d2d0: 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20 66 70  cnt<20 ){.    fp
d2e0: 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73  rintf(err,"\n%*s
d2f0: 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70 63 6e  ^-- here\n",spcn
d300: 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t,"");.  }else{.
d310: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
d320: 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e  "\n%*shere --^\n
d330: 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b 0a 20  ",spcnt-7,"");. 
d340: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
d350: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
d360: 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69  the N-th non-swi
d370: 74 63 68 20 61 72 67 75 6d 65 6e 74 2e 20 20 52  tch argument.  R
d380: 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e  eturn -1.** if N
d390: 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
d3a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d3b0: 61 72 67 69 6e 64 65 78 28 69 6e 74 20 6e 29 0a  argindex(int n).
d3c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
d3d0: 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20   dashdash = 0;. 
d3e0: 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20   if( argv!=0 && 
d3f0: 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20  *argv!=0 ){.    
d400: 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d  for(i=1; argv[i]
d410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d420: 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49  ( dashdash || !I
d430: 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b  SOPT(argv[i]) ){
d440: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  .        if( n==
d450: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
d460: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
d470: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72   }.      if( str
d480: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22  cmp(argv[i],"--"
d490: 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68 20  )==0 ) dashdash 
d4a0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
d4b0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73   return -1;.}..s
d4c0: 74 61 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b  tatic char emsg[
d4d0: 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e  ] = "Command lin
d4e0: 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20  e syntax error: 
d4f0: 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  ";../*.** Proces
d500: 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64  s a flag command
d510: 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a   line argument..
d520: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
d530: 6e 64 6c 65 66 6c 61 67 73 28 69 6e 74 20 69 2c  ndleflags(int i,
d540: 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20   FILE *err).{.  
d550: 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65 72 72  int v;.  int err
d560: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  cnt = 0;.  int j
d570: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b  ;.  for(j=0; op[
d580: 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a  j].label; j++){.
d590: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
d5a0: 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a  &argv[i][1],op[j
d5b0: 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e 53 74 72  ].label,lemonStr
d5c0: 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29  len(op[j].label)
d5d0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
d5e0: 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b  }.  v = argv[i][
d5f0: 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b  0]=='-' ? 1 : 0;
d600: 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62  .  if( op[j].lab
d610: 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  el==0 ){.    if(
d620: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70   err ){.      fp
d630: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64  rintf(err,"%sund
d640: 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e  efined option.\n
d650: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65  ",emsg);.      e
d660: 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b  rrline(i,1,err);
d670: 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e  .    }.    errcn
d680: 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  t++;.  }else if(
d690: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
d6a0: 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28  _FLAG ){.    *((
d6b0: 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20  int*)op[j].arg) 
d6c0: 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = v;.  }else if(
d6d0: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
d6e0: 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a  _FFLAG ){.    (*
d6f0: 28 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f  (void(*)(int))(o
d700: 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20  p[j].arg))(v);. 
d710: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
d720: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20  .type==OPT_FSTR 
d730: 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a  ){.    (*(void(*
d740: 29 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d  )(char *))(op[j]
d750: 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b  .arg))(&argv[i][
d760: 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2]);.  }else{.  
d770: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
d780: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
d790: 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  %smissing argume
d7a0: 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22  nt on switch.\n"
d7b0: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
d7c0: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
d7d0: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
d7e0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
d7f0: 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   errcnt;.}../*.*
d800: 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d  * Process a comm
d810: 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20  and line switch 
d820: 77 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67  which has an arg
d830: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
d840: 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63   int handleswitc
d850: 68 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65  h(int i, FILE *e
d860: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d  rr).{.  int lv =
d870: 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20   0;.  double dv 
d880: 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73  = 0.0;.  char *s
d890: 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63  v = 0, *end;.  c
d8a0: 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a  har *cp;.  int j
d8b0: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
d8c0: 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68   0;.  cp = strch
d8d0: 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a  r(argv[i],'=');.
d8e0: 20 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20    assert( cp!=0 
d8f0: 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  );.  *cp = 0;.  
d900: 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c  for(j=0; op[j].l
d910: 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  abel; j++){.    
d920: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
d930: 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d  i],op[j].label)=
d940: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
d950: 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69    *cp = '=';.  i
d960: 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d  f( op[j].label==
d970: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  0 ){.    if( err
d980: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
d990: 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e  f(err,"%sundefin
d9a0: 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d  ed option.\n",em
d9b0: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
d9c0: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
d9d0: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
d9e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70  .  }else{.    cp
d9f0: 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ++;.    switch( 
da00: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
da10: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
da20: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
da30: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
da40: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
da50: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
da60: 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75  r,"%soption requ
da70: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
da80: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
da90: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
daa0: 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  0,err);.        
dab0: 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  }.        errcnt
dac0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
dad0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
dae0: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
daf0: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
db00: 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28      dv = strtod(
db10: 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20  cp,&end);.      
db20: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
db30: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
db40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
db50: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c  printf(err,"%sil
db60: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
db70: 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  in floating-poin
db80: 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  t argument.\n",e
db90: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
dba0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e    errline(i,((un
dbb0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29  signed long)end)
dbc0: 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  -(unsigned long)
dbd0: 61 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20  argv[i],err);.  
dbe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dbf0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
dc00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
dc10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
dc20: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
dc30: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
dc40: 20 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74 72          lv = str
dc50: 74 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a  tol(cp,&end,0);.
dc60: 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64          if( *end
dc70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
dc80: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20  ( err ){.       
dc90: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
dca0: 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72  ,"%sillegal char
dcb0: 61 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65 72  acter in integer
dcc0: 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d   argument.\n",em
dcd0: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
dce0: 20 65 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73   errline(i,((uns
dcf0: 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d  igned long)end)-
dd00: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61  (unsigned long)a
dd10: 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20  rgv[i],err);.   
dd20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dd30: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
dd40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
dd50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
dd60: 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20   OPT_STR:.      
dd70: 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20  case OPT_FSTR:. 
dd80: 20 20 20 20 20 20 20 73 76 20 3d 20 63 70 3b 0a         sv = cp;.
dd90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dda0: 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
ddb0: 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20   op[j].type ){. 
ddc0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c       case OPT_FL
ddd0: 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  AG:.      case O
dde0: 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20  PT_FFLAG:.      
ddf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
de00: 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20  ase OPT_DBL:.   
de10: 20 20 20 20 20 2a 28 64 6f 75 62 6c 65 2a 29 28       *(double*)(
de20: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 64 76 3b  op[j].arg) = dv;
de30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
de40: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
de50: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 28 2a 28  DBL:.        (*(
de60: 76 6f 69 64 28 2a 29 28 64 6f 75 62 6c 65 29 29  void(*)(double))
de70: 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64 76 29  (op[j].arg))(dv)
de80: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
de90: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
dea0: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a 28 69  INT:.        *(i
deb0: 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  nt*)(op[j].arg) 
dec0: 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = lv;.        br
ded0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
dee0: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
def0: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 69 6e 74    (*(void(*)(int
df00: 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28  ))(op[j].arg))((
df10: 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20 20 20  int)lv);.       
df20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
df30: 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20  se OPT_STR:.    
df40: 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70      *(char**)(op
df50: 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20  [j].arg) = sv;. 
df60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
df70: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54      case OPT_FST
df80: 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f  R:.        (*(vo
df90: 69 64 28 2a 29 28 63 68 61 72 20 2a 29 29 28 6f  id(*)(char *))(o
dfa0: 70 5b 6a 5d 2e 61 72 67 29 29 28 73 76 29 3b 0a  p[j].arg))(sv);.
dfb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dfc0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
dfd0: 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74  n errcnt;.}..int
dfe0: 20 4f 70 74 49 6e 69 74 28 63 68 61 72 20 2a 2a   OptInit(char **
dff0: 61 2c 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69  a, struct s_opti
e000: 6f 6e 73 20 2a 6f 2c 20 46 49 4c 45 20 2a 65 72  ons *o, FILE *er
e010: 72 29 0a 7b 0a 20 20 69 6e 74 20 65 72 72 63 6e  r).{.  int errcn
e020: 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20 3d 20  t = 0;.  argv = 
e030: 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20 20 65  a;.  op = o;.  e
e040: 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72 3b 0a  rrstream = err;.
e050: 20 20 69 66 28 20 61 72 67 76 20 26 26 20 2a 61    if( argv && *a
e060: 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20 20 20  rgv && op ){.   
e070: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
e080: 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  i=1; argv[i]; i+
e090: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72  +){.      if( ar
e0a0: 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c 7c  gv[i][0]=='+' ||
e0b0: 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27   argv[i][0]=='-'
e0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63   ){.        errc
e0d0: 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c 61 67  nt += handleflag
e0e0: 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  s(i,err);.      
e0f0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 68 72  }else if( strchr
e100: 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20 29 7b  (argv[i],'=') ){
e110: 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 20  .        errcnt 
e120: 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28  += handleswitch(
e130: 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a  i,err);.      }.
e140: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e150: 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20  errcnt>0 ){.    
e160: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56 61 6c  fprintf(err,"Val
e170: 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  id command line 
e180: 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22 25 73  options for \"%s
e190: 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29 3b 0a  \" are:\n",*a);.
e1a0: 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29 3b 0a      OptPrint();.
e1b0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
e1c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e1d0: 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 29 7b 0a  int OptNArgs(){.
e1e0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
e1f0: 20 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20   int dashdash = 
e200: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  0;.  int i;.  if
e210: 28 20 61 72 67 76 21 3d 30 20 26 26 20 61 72 67  ( argv!=0 && arg
e220: 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66  v[0]!=0 ){.    f
e230: 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b  or(i=1; argv[i];
e240: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e250: 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53   dashdash || !IS
e260: 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63  OPT(argv[i]) ) c
e270: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
e280: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
e290: 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61  --")==0 ) dashda
e2a0: 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  sh = 1;.    }.  
e2b0: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a  }.  return cnt;.
e2c0: 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28  }..char *OptArg(
e2d0: 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69  int n).{.  int i
e2e0: 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78  ;.  i = argindex
e2f0: 28 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3e  (n);.  return i>
e300: 3d 30 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 30  =0 ? argv[i] : 0
e310: 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 45 72 72  ;.}..void OptErr
e320: 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20  (int n).{.  int 
e330: 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65  i;.  i = arginde
e340: 78 28 6e 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30  x(n);.  if( i>=0
e350: 20 29 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65   ) errline(i,0,e
e360: 72 72 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f  rrstream);.}..vo
e370: 69 64 20 4f 70 74 50 72 69 6e 74 28 29 7b 0a 20  id OptPrint(){. 
e380: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61   int i;.  int ma
e390: 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20 3d 20  x, len;.  max = 
e3a0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70  0;.  for(i=0; op
e3b0: 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b  [i].label; i++){
e3c0: 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e  .    len = lemon
e3d0: 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62  Strlen(op[i].lab
e3e0: 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73 77 69  el) + 1;.    swi
e3f0: 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20  tch( op[i].type 
e400: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
e410: 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
e420: 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
e430: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e440: 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a     case OPT_INT:
e450: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e460: 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 65  FINT:.        le
e470: 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20 20 2f 2a  n += 9;       /*
e480: 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69 6e 74   length of "<int
e490: 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20 20 20  eger>" */.      
e4a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
e4b0: 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20  ase OPT_DBL:.   
e4c0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c     case OPT_FDBL
e4d0: 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d  :.        len +=
e4e0: 20 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e   6;       /* len
e4f0: 67 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e 22 20  gth of "<real>" 
e500: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
e510: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
e520: 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65  _STR:.      case
e530: 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20   OPT_FSTR:.     
e540: 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20 20 20     len += 8;    
e550: 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
e560: 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a 20 20  "<string>" */.  
e570: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e580: 20 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d   }.    if( len>m
e590: 61 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e 3b 0a  ax ) max = len;.
e5a0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f    }.  for(i=0; o
e5b0: 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29  p[i].label; i++)
e5c0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  {.    switch( op
e5d0: 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20  [i].type ){.    
e5e0: 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a    case OPT_FLAG:
e5f0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e600: 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 66  FFLAG:.        f
e610: 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
e620: 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c 6e 22  ,"  -%-*s  %s\n"
e630: 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c  ,max,op[i].label
e640: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
e650: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e660: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49        case OPT_I
e670: 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  NT:.      case O
e680: 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20  PT_FINT:.       
e690: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
e6a0: 61 6d 2c 22 20 20 25 73 3d 3c 69 6e 74 65 67 65  am,"  %s=<intege
e6b0: 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b  r>%*s  %s\n",op[
e6c0: 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20  i].label,.      
e6d0: 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65      (int)(max-le
e6e0: 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  monStrlen(op[i].
e6f0: 6c 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b  label)-9),"",op[
e700: 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
e710: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e720: 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a    case OPT_DBL:.
e730: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e740: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 66 70 72  DBL:.        fpr
e750: 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22  intf(errstream,"
e760: 20 20 25 73 3d 3c 72 65 61 6c 3e 25 2a 73 20 20    %s=<real>%*s  
e770: 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65  %s\n",op[i].labe
e780: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  l,.          (in
e790: 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c  t)(max-lemonStrl
e7a0: 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d  en(op[i].label)-
e7b0: 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73  6),"",op[i].mess
e7c0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
e7d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
e7e0: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63  OPT_STR:.      c
e7f0: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
e800: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
e810: 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 73  rstream,"  %s=<s
e820: 74 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c 6e 22  tring>%*s  %s\n"
e830: 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20  ,op[i].label,.  
e840: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61          (int)(ma
e850: 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  x-lemonStrlen(op
e860: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c 22 22  [i].label)-8),""
e870: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
e880: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e890: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a      }.  }.}./***
e8a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8b0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
e8c0: 6c 65 20 22 70 61 72 73 65 2e 63 22 20 2a 2a 2a  le "parse.c" ***
e8d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
e8f0: 20 49 6e 70 75 74 20 66 69 6c 65 20 70 61 72 73   Input file pars
e900: 65 72 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  er for the LEMON
e910: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
e920: 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20 73 74  r..*/../* The st
e930: 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ate of the parse
e940: 72 20 2a 2f 0a 65 6e 75 6d 20 65 5f 73 74 61 74  r */.enum e_stat
e950: 65 20 7b 0a 20 20 49 4e 49 54 49 41 4c 49 5a 45  e {.  INITIALIZE
e960: 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
e970: 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20  DECL_OR_RULE,.  
e980: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
e990: 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 57 41 49 54  _KEYWORD,.  WAIT
e9a0: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
e9b0: 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
e9c0: 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
e9d0: 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  L,.  WAITING_FOR
e9e0: 5f 41 52 52 4f 57 2c 0a 20 20 49 4e 5f 52 48 53  _ARROW,.  IN_RHS
e9f0: 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c  ,.  LHS_ALIAS_1,
ea00: 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a  .  LHS_ALIAS_2,.
ea10: 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c 0a 20    LHS_ALIAS_3,. 
ea20: 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20   RHS_ALIAS_1,.  
ea30: 52 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 50  RHS_ALIAS_2,.  P
ea40: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
ea50: 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  ,.  PRECEDENCE_M
ea60: 41 52 4b 5f 32 2c 0a 20 20 52 45 53 59 4e 43 5f  ARK_2,.  RESYNC_
ea70: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
ea80: 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ,.  RESYNC_AFTER
ea90: 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 57  _DECL_ERROR,.  W
eaa0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
eab0: 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20  UCTOR_SYMBOL,.  
eac0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
ead0: 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57  TYPE_SYMBOL,.  W
eae0: 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42  AITING_FOR_FALLB
eaf0: 41 43 4b 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e  ACK_ID,.  WAITIN
eb00: 47 5f 46 4f 52 5f 45 58 50 45 43 54 5f 56 41 4c  G_FOR_EXPECT_VAL
eb10: 55 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f  UE,.  WAITING_FO
eb20: 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 0a 7d 3b  R_WILDCARD_ID.};
eb30: 0a 73 74 72 75 63 74 20 70 73 74 61 74 65 20 7b  .struct pstate {
eb40: 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  .  char *filenam
eb50: 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e;       /* Name
eb60: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
eb70: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65  le */.  int toke
eb80: 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a  nlineno;      /*
eb90: 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20 77   Linenumber at w
eba0: 68 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f 6b  hich current tok
ebb0: 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20 69  en starts */.  i
ebc0: 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20  nt errorcnt;    
ebd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ebe0: 66 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72 20  f errors so far 
ebf0: 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e  */.  char *token
ec00: 73 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54 65  start;     /* Te
ec10: 78 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f  xt of current to
ec20: 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ken */.  struct 
ec30: 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f  lemon *gp;     /
ec40: 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20 76  * Global state v
ec50: 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20  ector */.  enum 
ec60: 65 5f 73 74 61 74 65 20 73 74 61 74 65 3b 20 20  e_state state;  
ec70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
ec80: 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
ec90: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
eca0: 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20  bol *fallback;  
ecb0: 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b   /* The fallback
ecc0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
ecd0: 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20  ct symbol *lhs; 
ece0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68         /* Left-h
ecf0: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 75 72 72  and side of curr
ed00: 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 6f  ent rule */.  co
ed10: 6e 73 74 20 63 68 61 72 20 2a 6c 68 73 61 6c 69  nst char *lhsali
ed20: 61 73 3b 20 20 20 20 20 20 2f 2a 20 41 6c 69 61  as;      /* Alia
ed30: 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f  s for the LHS */
ed40: 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20  .  int nrhs;    
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ed60: 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74   Number of right
ed70: 2d 68 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f  -hand side symbo
ed80: 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72  ls seen */.  str
ed90: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b  uct symbol *rhs[
eda0: 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53  MAXRHS];  /* RHS
edb0: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 6f   symbols */.  co
edc0: 6e 73 74 20 63 68 61 72 20 2a 61 6c 69 61 73 5b  nst char *alias[
edd0: 4d 41 58 52 48 53 5d 3b 20 2f 2a 20 41 6c 69 61  MAXRHS]; /* Alia
ede0: 73 65 73 20 66 6f 72 20 65 61 63 68 20 52 48 53  ses for each RHS
edf0: 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c   symbol (or NULL
ee00: 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  ) */.  struct ru
ee10: 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20  le *prevrule;   
ee20: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75    /* Previous ru
ee30: 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63  le parsed */.  c
ee40: 6f 6e 73 74 20 63 68 61 72 20 2a 64 65 63 6c 6b  onst char *declk
ee50: 65 79 77 6f 72 64 3b 20 20 20 2f 2a 20 4b 65 79  eyword;   /* Key
ee60: 77 6f 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72  word of a declar
ee70: 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ation */.  char 
ee80: 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20  **declargslot;  
ee90: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
eea0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61  he declaration a
eeb0: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
eec0: 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69  e put */.  int i
eed0: 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 3b 20  nsertLineMacro; 
eee0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 23 6c 69        /* Add #li
eef0: 6e 65 20 62 65 66 6f 72 65 20 64 65 63 6c 61 72  ne before declar
ef00: 61 74 69 6f 6e 20 69 6e 73 65 72 74 20 2a 2f 0a  ation insert */.
ef10: 20 20 69 6e 74 20 2a 64 65 63 6c 6c 69 6e 65 6e    int *decllinen
ef20: 6f 73 6c 6f 74 3b 20 20 20 20 20 20 20 2f 2a 20  oslot;       /* 
ef30: 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 64  Where to write d
ef40: 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69 6e 65 20  eclaration line 
ef50: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 65 6e 75 6d  number */.  enum
ef60: 20 65 5f 61 73 73 6f 63 20 64 65 63 6c 61 73 73   e_assoc declass
ef70: 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73 69 67 6e  oc;    /* Assign
ef80: 20 74 68 69 73 20 61 73 73 6f 63 69 61 74 69 6f   this associatio
ef90: 6e 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65  n to decl argume
efa0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65  nts */.  int pre
efb0: 63 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20  ccounter;       
efc0: 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68      /* Assign th
efd0: 69 73 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f  is precedence to
efe0: 20 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20   decl arguments 
eff0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
f000: 20 2a 66 69 72 73 74 72 75 6c 65 3b 20 20 20 20   *firstrule;    
f010: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69  /* Pointer to fi
f020: 72 73 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20  rst rule in the 
f030: 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 73 74 72  grammar */.  str
f040: 75 63 74 20 72 75 6c 65 20 2a 6c 61 73 74 72 75  uct rule *lastru
f050: 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  le;     /* Point
f060: 65 72 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  er to the most r
f070: 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 72  ecently parsed r
f080: 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61  ule */.};../* Pa
f090: 72 73 65 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b  rse a single tok
f0a0: 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  en */.static voi
f0b0: 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28  d parseonetoken(
f0c0: 73 74 72 75 63 74 20 70 73 74 61 74 65 20 2a 70  struct pstate *p
f0d0: 73 70 29 0a 7b 0a 20 20 63 68 61 72 20 2a 65 6e  sp).{.  char *en
f0e0: 64 70 74 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68  dptr;.  const ch
f0f0: 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20 53 74 72  ar *x;.  x = Str
f100: 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b 65 6e 73  safe(psp->tokens
f110: 74 61 72 74 29 3b 20 20 20 20 20 2f 2a 20 53 61  tart);     /* Sa
f120: 76 65 20 74 68 65 20 74 6f 6b 65 6e 20 70 65 72  ve the token per
f130: 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23 69 66 20  manently */.#if 
f140: 30 0a 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25  0.  printf("%s:%
f150: 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d 20 73 74  d: Token=[%s] st
f160: 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70 2d 3e 66  ate=%d\n",psp->f
f170: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f180: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 78 2c  enlineno,.    x,
f190: 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a 23 65 6e  psp->state);.#en
f1a0: 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 73  dif.  switch( ps
f1b0: 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20  p->state ){.    
f1c0: 63 61 73 65 20 49 4e 49 54 49 41 4c 49 5a 45 3a  case INITIALIZE:
f1d0: 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76  .      psp->prev
f1e0: 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
f1f0: 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
f200: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d   = 0;.      psp-
f210: 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73 70  >firstrule = psp
f220: 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 30 3b 0a  ->lastrule = 0;.
f230: 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 6e        psp->gp->n
f240: 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
f250: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20  /* Fall thru to 
f260: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
f270: 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
f280: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3a 0a  R_DECL_OR_RULE:.
f290: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
f2a0: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '%' ){.        p
f2b0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
f2c0: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
f2d0: 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73  WORD;.      }els
f2e0: 65 20 69 66 28 20 69 73 6c 6f 77 65 72 28 78 5b  e if( islower(x[
f2f0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
f300: 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d 62 6f 6c  sp->lhs = Symbol
f310: 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
f320: 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20 30 3b 0a   psp->nrhs = 0;.
f330: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
f340: 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  alias = 0;.     
f350: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f360: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f  WAITING_FOR_ARRO
f370: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  W;.      }else i
f380: 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 29 7b 0a  f( x[0]=='{' ){.
f390: 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
f3a0: 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a  >prevrule==0 ){.
f3b0: 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
f3c0: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f3d0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f3e0: 6f 2c 0a 22 54 68 65 72 65 20 69 73 20 6e 6f 20  o,."There is no 
f3f0: 70 72 69 6f 72 20 72 75 6c 65 20 6f 70 6f 6e 20  prior rule opon 
f400: 77 68 69 63 68 20 74 6f 20 61 74 74 61 63 68 20  which to attach 
f410: 74 68 65 20 63 6f 64 65 20 5c 0a 66 72 61 67 6d  the code \.fragm
f420: 65 6e 74 20 77 68 69 63 68 20 62 65 67 69 6e 73  ent which begins
f430: 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 2e 22 29   on this line.")
f440: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
f450: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65  >errorcnt++;..}e
f460: 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65  lse if( psp->pre
f470: 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29  vrule->code!=0 )
f480: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
f490: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f4a0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f4b0: 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d  eno,."Code fragm
f4c0: 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e  ent beginning on
f4d0: 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
f4e0: 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f  t the first \.to
f4f0: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76   follow the prev
f500: 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  ious rule.");.  
f510: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
f520: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
f530: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f540: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
f550: 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b  >line = psp->tok
f560: 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
f570: 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
f580: 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b  e->code = &x[1];
f590: 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ..}.      }else 
f5a0: 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27 20 29 7b  if( x[0]=='[' ){
f5b0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
f5c0: 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45  ate = PRECEDENCE
f5d0: 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20 20 20 7d  _MARK_1;.      }
f5e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
f5f0: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
f600: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f610: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
f620: 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c 22 20 73   "Token \"%s\" s
f630: 68 6f 75 6c 64 20 62 65 20 65 69 74 68 65 72 20  hould be either 
f640: 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e 6f 6e 74  \"%%\" or a nont
f650: 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22 2c 0a  erminal name.",.
f660: 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a 20 20            x);.  
f670: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f680: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
f690: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f6a0: 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f  case PRECEDENCE_
f6b0: 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20 20 69 66  MARK_1:.      if
f6c0: 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29  ( !isupper(x[0])
f6d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
f6e0: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f6f0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f700: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
f710: 54 68 65 20 70 72 65 63 65 64 65 6e 63 65 20 73  The precedence s
f720: 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65 20 61 20  ymbol must be a 
f730: 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20 20 20  terminal.");.   
f740: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f750: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
f760: 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72  e if( psp->prevr
f770: 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ule==0 ){.      
f780: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f790: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f7a0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
f7b0: 20 20 20 20 20 22 54 68 65 72 65 20 69 73 20 6e       "There is n
f7c0: 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 74 6f 20  o prior rule to 
f7d0: 61 73 73 69 67 6e 20 70 72 65 63 65 64 65 6e 63  assign precedenc
f7e0: 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78 29 3b  e \"[%s]\".",x);
f7f0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
f800: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f810: 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70  }else if( psp->p
f820: 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d  revrule->precsym
f830: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  !=0 ){.        E
f840: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f850: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f860: 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63 65 64 65  lineno,."Precede
f870: 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74 68 69 73  nce mark on this
f880: 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65   line is not the
f890: 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c   first \.to foll
f8a0: 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ow the previous 
f8b0: 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  rule.");.       
f8c0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f8d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f8e0: 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
f8f0: 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 20 3d 20  rule->precsym = 
f900: 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
f910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70       }.      psp
f920: 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45 44  ->state = PRECED
f930: 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20 20 20  ENCE_MARK_2;.   
f940: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
f950: 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41  se PRECEDENCE_MA
f960: 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20  RK_2:.      if( 
f970: 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a 20 20 20  x[0]!=']' ){.   
f980: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f990: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f9a0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f9b0: 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
f9c0: 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65 63 65 64   \"]\" on preced
f9d0: 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b 0a 20 20  ence mark.");.  
f9e0: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f9f0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
fa00: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
fa10: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
fa20: 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
fa30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
fa40: 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52  e WAITING_FOR_AR
fa50: 52 4f 57 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ROW:.      if( x
fa60: 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d  [0]==':' && x[1]
fa70: 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27  ==':' && x[2]=='
fa80: 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  =' ){.        ps
fa90: 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48  p->state = IN_RH
faa0: 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  S;.      }else i
fab0: 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a  f( x[0]=='(' ){.
fac0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
fad0: 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 31  te = LHS_ALIAS_1
fae0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
faf0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
fb00: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
fb10: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
fb20: 20 20 20 20 20 20 20 20 20 20 22 45 78 70 65 63            "Expec
fb30: 74 65 64 20 74 6f 20 73 65 65 20 61 20 5c 22 3a  ted to see a \":
fb40: 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  \" following the
fb50: 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73   LHS symbol \"%s
fb60: 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  \".",.          
fb70: 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  psp->lhs->name);
fb80: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
fb90: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
fba0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
fbb0: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
fbc0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
fbd0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
fbe0: 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f   case LHS_ALIAS_
fbf0: 31 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61  1:.      if( isa
fc00: 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20  lpha(x[0]) ){.  
fc10: 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c        psp->lhsal
fc20: 69 61 73 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  ias = x;.       
fc30: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
fc40: 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20  S_ALIAS_2;.     
fc50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fc60: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
fc70: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
fc80: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
fc90: 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f     "\"%s\" is no
fca0: 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61 73 20  t a valid alias 
fcb0: 66 6f 72 20 74 68 65 20 4c 48 53 20 5c 22 25 73  for the LHS \"%s
fcc0: 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \"\n",.         
fcd0: 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d   x,psp->lhs->nam
fce0: 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  e);.        psp-
fcf0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
fd00: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
fd10: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
fd20: 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
fd30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
fd40: 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49      case LHS_ALI
fd50: 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_2:.      if( 
fd60: 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20  x[0]==')' ){.   
fd70: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
fd80: 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3b 0a 20  = LHS_ALIAS_3;. 
fd90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fda0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
fdb0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
fdc0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
fdd0: 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20         "Missing 
fde0: 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20  \")\" following 
fdf0: 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c  LHS alias name \
fe00: 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73  "%s\".",psp->lhs
fe10: 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20  alias);.        
fe20: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
fe30: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
fe40: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
fe50: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
fe60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
fe70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53  ak;.    case LHS
fe80: 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20 20 20 20  _ALIAS_3:.      
fe90: 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26  if( x[0]==':' &&
fea0: 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[1]==':' && x[
feb0: 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20  2]=='=' ){.     
fec0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
fed0: 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65  IN_RHS;.      }e
fee0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
fef0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
ff00: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
ff10: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
ff20: 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e 5c 22 20  "Missing \"->\" 
ff30: 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25 73 28  following: \"%s(
ff40: 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  %s)\".",.       
ff50: 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61      psp->lhs->na
ff60: 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73  me,psp->lhsalias
ff70: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
ff80: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
ff90: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
ffa0: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
ffb0: 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
ffc0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ffd0: 20 20 20 63 61 73 65 20 49 4e 5f 52 48 53 3a 0a     case IN_RHS:.
ffe0: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
fff0: 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73  '.' ){.        s
10000 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
10010 20 20 20 20 20 20 20 20 72 70 20 3d 20 28 73 74          rp = (st
10020 72 75 63 74 20 72 75 6c 65 20 2a 29 63 61 6c 6c  ruct rule *)call
10030 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
10040 74 20 72 75 6c 65 29 20 2b 20 0a 20 20 20 20 20  t rule) + .     
10050 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 73          sizeof(s
10060 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 70  truct symbol*)*p
10070 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69 7a 65 6f  sp->nrhs + sizeo
10080 66 28 63 68 61 72 2a 29 2a 70 73 70 2d 3e 6e 72  f(char*)*psp->nr
10090 68 73 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  hs, 1);.        
100a0 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a 20 20 20  if( rp==0 ){.   
100b0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
100c0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
100d0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
100e0 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6e              "Can
100f0 27 74 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f 75  't allocate enou
10100 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68  gh memory for th
10110 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20  is rule.");.    
10120 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10130 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
10140 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d   psp->prevrule =
10150 20 30 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20   0;..}else{.    
10160 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
10170 20 20 20 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c         rp->rulel
10180 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e  ine = psp->token
10190 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
101a0 20 20 72 70 2d 3e 72 68 73 20 3d 20 28 73 74 72    rp->rhs = (str
101b0 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70  uct symbol**)&rp
101c0 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  [1];.          r
101d0 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20 28 63  p->rhsalias = (c
101e0 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 28 72 70  onst char**)&(rp
101f0 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
10200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
10210 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68  (i=0; i<psp->nrh
10220 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  s; i++){.       
10230 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20       rp->rhs[i] 
10240 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20  = psp->rhs[i];. 
10250 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72             rp->r
10260 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70  hsalias[i] = psp
10270 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20 20 7d  ->alias[i];..  }
10280 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  .          rp->l
10290 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20  hs = psp->lhs;. 
102a0 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73           rp->lhs
102b0 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73  alias = psp->lhs
102c0 61 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  alias;.         
102d0 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d   rp->nrhs = psp-
102e0 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20  >nrhs;.         
102f0 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20   rp->code = 0;. 
10300 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65           rp->pre
10310 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  csym = 0;.      
10320 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20      rp->index = 
10330 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b  psp->gp->nrule++
10340 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
10350 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68  nextlhs = rp->lh
10360 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20  s->rule;.       
10370 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65     rp->lhs->rule
10380 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20   = rp;.         
10390 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20   rp->next = 0;. 
103a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70           if( psp
103b0 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29  ->firstrule==0 )
103c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73  {.            ps
103d0 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70  p->firstrule = p
103e0 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72  sp->lastrule = r
103f0 70 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p;..  }else{.   
10400 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61           psp->la
10410 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72  strule->next = r
10420 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  p;.            p
10430 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72  sp->lastrule = r
10440 70 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20 20  p;..  }.        
10450 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
10460 3d 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20 20 20  = rp;..}.       
10470 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
10480 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
10490 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
104a0 6c 73 65 20 69 66 28 20 69 73 61 6c 70 68 61 28  lse if( isalpha(
104b0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
104c0 20 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d   if( psp->nrhs>=
104d0 4d 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20 20  MAXRHS ){.      
104e0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
104f0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10500 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10510 20 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 61           "Too ma
10520 6e 79 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 52 48  ny symbols on RH
10530 53 20 6f 66 20 72 75 6c 65 20 62 65 67 69 6e 6e  S of rule beginn
10540 69 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c  ing at \"%s\".",
10550 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 29 3b  .            x);
10560 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10570 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10580 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10590 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
105a0 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c  RULE_ERROR;..}el
105b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73  se{.          ps
105c0 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
105d0 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  ] = Symbol_new(x
105e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
105f0 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68  ->alias[psp->nrh
10600 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s] = 0;.        
10610 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 09    psp->nrhs++;..
10620 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
10630 28 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20  ( (x[0]=='|' || 
10640 78 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 70 73  x[0]=='/') && ps
10650 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20  p->nrhs>0 ){.   
10660 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
10670 6f 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e 72  ol *msp = psp->r
10680 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 3b  hs[psp->nrhs-1];
10690 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 73 70  .        if( msp
106a0 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
106b0 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
106c0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
106d0 20 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70 3b 0a   *origsp = msp;.
106e0 20 20 20 20 20 20 20 20 20 20 6d 73 70 20 3d 20            msp = 
106f0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
10700 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f  ) calloc(1,sizeo
10710 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20  f(*msp));.      
10720 20 20 20 20 6d 65 6d 73 65 74 28 6d 73 70 2c 20      memset(msp, 
10730 30 2c 20 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29  0, sizeof(*msp))
10740 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d  ;.          msp-
10750 3e 74 79 70 65 20 3d 20 4d 55 4c 54 49 54 45 52  >type = MULTITER
10760 4d 49 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  MINAL;.         
10770 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 20 3d 20   msp->nsubsym = 
10780 31 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70  1;.          msp
10790 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75  ->subsym = (stru
107a0 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 63 61  ct symbol **) ca
107b0 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28 73 74  lloc(1,sizeof(st
107c0 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 29 3b 0a  ruct symbol*));.
107d0 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73            msp->s
107e0 75 62 73 79 6d 5b 30 5d 20 3d 20 6f 72 69 67 73  ubsym[0] = origs
107f0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70  p;.          msp
10800 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69 67 73 70 2d  ->name = origsp-
10810 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  >name;.         
10820 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e   psp->rhs[psp->n
10830 72 68 73 2d 31 5d 20 3d 20 6d 73 70 3b 0a 20 20  rhs-1] = msp;.  
10840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10850 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b 3b 0a  msp->nsubsym++;.
10860 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62          msp->sub
10870 73 79 6d 20 3d 20 28 73 74 72 75 63 74 20 73 79  sym = (struct sy
10880 6d 62 6f 6c 20 2a 2a 29 20 72 65 61 6c 6c 6f 63  mbol **) realloc
10890 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 0a 20 20  (msp->subsym,.  
108a0 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 73          sizeof(s
108b0 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d  truct symbol*)*m
108c0 73 70 2d 3e 6e 73 75 62 73 79 6d 29 3b 0a 20 20  sp->nsubsym);.  
108d0 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79        msp->subsy
108e0 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2d 31  m[msp->nsubsym-1
108f0 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 26  ] = Symbol_new(&
10900 78 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  x[1]);.        i
10910 66 28 20 69 73 6c 6f 77 65 72 28 78 5b 31 5d 29  f( islower(x[1])
10920 20 7c 7c 20 69 73 6c 6f 77 65 72 28 6d 73 70 2d   || islower(msp-
10930 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65  >subsym[0]->name
10940 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
10950 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
10960 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
10970 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
10980 20 20 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 66         "Cannot f
10990 6f 72 6d 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63  orm a compound c
109a0 6f 6e 74 61 69 6e 69 6e 67 20 61 20 6e 6f 6e 2d  ontaining a non-
109b0 74 65 72 6d 69 6e 61 6c 22 29 3b 0a 20 20 20 20  terminal");.    
109c0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
109d0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
109e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
109f0 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26 20 70 73   x[0]=='(' && ps
10a00 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20  p->nrhs>0 ){.   
10a10 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10a20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20  = RHS_ALIAS_1;. 
10a30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10a40 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10a50 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10a60 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10a70 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20         "Illegal 
10a80 63 68 61 72 61 63 74 65 72 20 6f 6e 20 52 48 53  character on RHS
10a90 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22   of rule: \"%s\"
10aa0 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
10ab0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10ac0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10ad0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
10ae0 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
10af0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
10b00 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f  k;.    case RHS_
10b10 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69  ALIAS_1:.      i
10b20 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
10b30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
10b40 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
10b50 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  -1] = x;.       
10b60 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48   psp->state = RH
10b70 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20  S_ALIAS_2;.     
10b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10b90 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10ba0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10bb0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10bc0 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f     "\"%s\" is no
10bd0 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61 73 20  t a valid alias 
10be0 66 6f 72 20 74 68 65 20 52 48 53 20 73 79 6d 62  for the RHS symb
10bf0 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20  ol \"%s\"\n",.  
10c00 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 72          x,psp->r
10c10 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d  hs[psp->nrhs-1]-
10c20 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
10c30 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
10c40 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10c50 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
10c60 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
10c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
10c80 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48 53  ak;.    case RHS
10c90 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20  _ALIAS_2:.      
10ca0 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b  if( x[0]==')' ){
10cb0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10cc0 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20  ate = IN_RHS;.  
10cd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10ce0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
10cf0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
10d00 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
10d10 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c        "Missing \
10d20 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c  ")\" following L
10d30 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22  HS alias name \"
10d40 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61  %s\".",psp->lhsa
10d50 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70  lias);.        p
10d60 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10d70 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10d80 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
10d90 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
10da0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
10db0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
10dc0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
10dd0 57 4f 52 44 3a 0a 20 20 20 20 20 20 69 66 28 20  WORD:.      if( 
10de0 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
10df0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
10e00 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20  clkeyword = x;. 
10e10 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10e20 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20  argslot = 0;.   
10e30 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69       psp->declli
10e40 6e 65 6e 6f 73 6c 6f 74 20 3d 20 30 3b 0a 20 20  nenoslot = 0;.  
10e50 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
10e60 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a  tLineMacro = 1;.
10e70 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10e80 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
10e90 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20  _DECL_ARG;.     
10ea0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c     if( strcmp(x,
10eb0 22 6e 61 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "name")==0 ){.  
10ec0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10ed0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
10ee0 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ->gp->name);.   
10ef0 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
10f00 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
10f10 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
10f20 6d 70 28 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d  mp(x,"include")=
10f30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10f40 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10f50 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e   = &(psp->gp->in
10f60 63 6c 75 64 65 29 3b 0a 09 7d 65 6c 73 65 20 69  clude);..}else i
10f70 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63 6f 64  f( strcmp(x,"cod
10f80 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
10f90 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10fa0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
10fb0 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a 09 7d  ->extracode);..}
10fc0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10fd0 78 2c 22 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63  x,"token_destruc
10fe0 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tor")==0 ){.    
10ff0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11000 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  rgslot = &psp->g
11010 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 09 7d  p->tokendest;..}
11020 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11030 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72  x,"default_destr
11040 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20  uctor")==0 ){.  
11050 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11060 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d  largslot = &psp-
11070 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a 09 7d  >gp->vardest;..}
11080 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11090 78 2c 22 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22  x,"token_prefix"
110a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
110b0 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
110c0 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74  ot = &psp->gp->t
110d0 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20 20  okenprefix;.    
110e0 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
110f0 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
11100 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
11110 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f  p(x,"syntax_erro
11120 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
11130 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
11140 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
11150 2d 3e 65 72 72 6f 72 29 3b 0a 09 7d 65 6c 73 65  ->error);..}else
11160 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70   if( strcmp(x,"p
11170 61 72 73 65 5f 61 63 63 65 70 74 22 29 3d 3d 30  arse_accept")==0
11180 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11190 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
111a0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65   &(psp->gp->acce
111b0 70 74 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  pt);..}else if( 
111c0 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f  strcmp(x,"parse_
111d0 66 61 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a  failure")==0 ){.
111e0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
111f0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
11200 73 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29  sp->gp->failure)
11210 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
11220 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 6f 76 65  cmp(x,"stack_ove
11230 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20  rflow")==0 ){.  
11240 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11250 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
11260 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b  ->gp->overflow);
11270 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11280 66 28 20 73 74 72 63 6d 70 28 78 2c 22 65 78 74  f( strcmp(x,"ext
11290 72 61 5f 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30  ra_argument")==0
112a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
112b0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
112c0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29   &(psp->gp->arg)
112d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
112e0 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
112f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
11300 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11310 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22 29 3d 3d  ,"token_type")==
11320 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11330 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
11340 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b  = &(psp->gp->tok
11350 65 6e 74 79 70 65 29 3b 0a 20 20 20 20 20 20 20  entype);.       
11360 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
11370 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
11380 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11390 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75 6c 74  trcmp(x,"default
113a0 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _type")==0 ){.  
113b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
113c0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
113d0 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a  ->gp->vartype);.
113e0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
113f0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
11400 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
11410 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11420 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d 3d 30 20  stack_size")==0 
11430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11440 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
11450 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 63 6b  &(psp->gp->stack
11460 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  size);.         
11470 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
11480 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
11490 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
114a0 63 6d 70 28 78 2c 22 73 74 61 72 74 5f 73 79 6d  cmp(x,"start_sym
114b0 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  bol")==0 ){.    
114c0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
114d0 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
114e0 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20  gp->start);.    
114f0 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
11500 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
11510 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11520 28 20 73 74 72 63 6d 70 28 78 2c 22 6c 65 66 74  ( strcmp(x,"left
11530 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
11540 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
11550 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ter++;.         
11560 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20   psp->declassoc 
11570 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20 20 20 20  = LEFT;.        
11580 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11590 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45  AITING_FOR_PRECE
115a0 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20  DENCE_SYMBOL;.  
115b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
115c0 73 74 72 63 6d 70 28 78 2c 22 72 69 67 68 74 22  strcmp(x,"right"
115d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
115e0 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74    psp->preccount
115f0 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  er++;.          
11600 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d  psp->declassoc =
11610 20 52 49 47 48 54 3b 0a 20 20 20 20 20 20 20 20   RIGHT;.        
11620 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11630 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45  AITING_FOR_PRECE
11640 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20  DENCE_SYMBOL;.  
11650 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11660 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e 61 73 73  strcmp(x,"nonass
11670 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  oc")==0 ){.     
11680 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
11690 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  unter++;.       
116a0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f     psp->declasso
116b0 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  c = NONE;.      
116c0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
116d0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
116e0 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a  CEDENCE_SYMBOL;.
116f0 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
11700 70 28 78 2c 22 64 65 73 74 72 75 63 74 6f 72 22  p(x,"destructor"
11710 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11720 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11730 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
11740 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 09 7d  UCTOR_SYMBOL;..}
11750 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11760 78 2c 22 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a  x,"type")==0 ){.
11770 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
11780 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11790 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42  OR_DATATYPE_SYMB
117a0 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
117b0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
117c0 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b  fallback")==0 ){
117d0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
117e0 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  fallback = 0;.  
117f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11800 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11810 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20  _FALLBACK_ID;.  
11820 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
11830 73 74 72 63 6d 70 28 78 2c 22 77 69 6c 64 63 61  strcmp(x,"wildca
11840 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rd")==0 ){.     
11850 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11860 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49  = WAITING_FOR_WI
11870 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20 20 20 20  LDCARD_ID;.     
11880 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11890 63 6d 70 28 78 2c 22 65 78 70 65 63 74 22 29 3d  cmp(x,"expect")=
118a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
118b0 69 66 20 28 70 73 70 2d 3e 67 70 2d 3e 6e 65 78  if (psp->gp->nex
118c0 70 65 63 74 65 64 20 3e 3d 20 30 29 20 7b 0a 20  pected >= 0) {. 
118d0 20 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72             Error
118e0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
118f0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11900 6e 6f 2c 20 22 4d 75 6c 74 69 70 6c 65 20 25 65  no, "Multiple %e
11910 78 70 65 63 74 20 64 65 63 6c 61 72 61 74 69 6f  xpect declaratio
11920 6e 73 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ns.");.         
11930 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11940 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
11950 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
11960 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
11970 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
11980 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
11990 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
119a0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 45 58  = WAITING_FOR_EX
119b0 50 45 43 54 5f 56 41 4c 55 45 3b 0a 20 20 20 20  PECT_VALUE;.    
119c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
119d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
119e0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
119f0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
11a00 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11a10 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64        "Unknown d
11a20 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f  eclaration keywo
11a30 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78  rd: \"%%%s\".",x
11a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11a50 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11a60 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11a70 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11a80 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  R_DECL_ERROR;..}
11a90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11aa0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11ab0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11ac0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11ad0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
11ae0 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  l declaration ke
11af0 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c  yword: \"%s\".",
11b00 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
11b10 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11b20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11b30 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
11b40 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
11b50 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11b60 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
11b70 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
11b80 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
11b90 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  ( !isalpha(x[0])
11ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
11bb0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11bc0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
11bd0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
11be0 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73  Symbol name miss
11bf0 69 6e 67 20 61 66 74 65 72 20 25 64 65 73 74 72  ing after %destr
11c00 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b  uctor keyword");
11c10 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11c20 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11c30 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11c40 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
11c50 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
11c60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
11c70 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
11c80 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
11c90 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11ca0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  largslot = &sp->
11cb0 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20  destructor;.    
11cc0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e      psp->decllin
11cd0 65 6e 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  enoslot = &sp->d
11ce0 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  estLineno;.     
11cf0 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
11d00 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
11d10 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11d20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11d30 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a  CL_ARG;.      }.
11d40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11d50 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
11d60 52 5f 45 58 50 45 43 54 5f 56 41 4c 55 45 3a 0a  R_EXPECT_VALUE:.
11d70 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d          psp->gp-
11d80 3e 6e 65 78 70 65 63 74 65 64 20 3d 20 28 69 6e  >nexpected = (in
11d90 74 29 20 73 74 72 74 6f 6c 28 78 2c 20 26 65 6e  t) strtol(x, &en
11da0 64 70 74 72 2c 20 31 30 29 3b 0a 20 20 20 20 20  dptr, 10);.     
11db0 20 20 20 69 66 28 20 28 2a 65 6e 64 70 74 72 20     if( (*endptr 
11dc0 21 3d 20 27 5c 30 27 29 20 7c 7c 20 28 65 6e 64  != '\0') || (end
11dd0 70 74 72 20 3d 3d 20 78 29 20 29 20 7b 0a 20 20  ptr == x) ) {.  
11de0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11df0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11e00 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11e10 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 49 6e  .            "In
11e20 74 65 67 65 72 20 65 78 70 65 63 74 65 64 20 61  teger expected a
11e30 66 74 65 72 20 25 25 65 78 70 65 63 74 20 6b 65  fter %%expect ke
11e40 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20  yword");.       
11e50 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11e60 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  ++;.        } el
11e70 73 65 20 69 66 20 28 70 73 70 2d 3e 67 70 2d 3e  se if (psp->gp->
11e80 6e 65 78 70 65 63 74 65 64 20 3c 20 30 29 20 7b  nexpected < 0) {
11e90 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
11ea0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11eb0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11ec0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11ed0 22 49 6e 74 65 67 65 72 20 63 61 6e 27 74 20 62  "Integer can't b
11ee0 65 20 6e 65 67 61 74 69 76 65 20 61 66 74 65 72  e negative after
11ef0 20 25 25 65 78 70 65 63 74 20 6b 65 79 77 6f 72   %%expect keywor
11f00 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  d");.          p
11f10 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
11f20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11f30 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11f40 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
11f50 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 20  OR_RULE;.       
11f60 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11f70 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54   WAITING_FOR_DAT
11f80 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20  ATYPE_SYMBOL:.  
11f90 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68 61      if( !isalpha
11fa0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
11fb0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11fc0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11fd0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11fe0 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d       "Symbol nam
11ff0 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20  e missing after 
12000 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77  %destructor keyw
12010 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ord");.        p
12020 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
12030 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
12040 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
12050 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
12060 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12070 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
12080 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65   *sp = Symbol_ne
12090 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  w(x);.        ps
120a0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
120b0 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a   &sp->datatype;.
120c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
120d0 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
120e0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
120f0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
12100 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20  OR_DECL_ARG;.   
12110 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
12120 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
12130 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
12140 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20  E_SYMBOL:.      
12150 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
12160 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
12170 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12180 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
12190 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
121a0 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b  isupper(x[0]) ){
121b0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
121c0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20  symbol *sp;.    
121d0 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f      sp = Symbol_
121e0 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
121f0 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20  if( sp->prec>=0 
12200 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
12210 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
12220 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
12230 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
12240 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22    "Symbol \"%s\"
12250 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 20   has already be 
12260 67 69 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e  given a preceden
12270 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  ce.",x);.       
12280 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12290 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20  ++;..}else{.    
122a0 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d        sp->prec =
122b0 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65   psp->preccounte
122c0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  r;.          sp-
122d0 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65  >assoc = psp->de
122e0 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20 20 20  classoc;..}.    
122f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12300 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12310 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
12320 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12330 20 20 20 20 22 43 61 6e 27 74 20 61 73 73 69 67      "Can't assig
12340 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 74  n a precedence t
12350 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  o \"%s\".",x);. 
12360 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12370 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
12380 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12390 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
123a0 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20 20  R_DECL_ARG:.    
123b0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20    if( x[0]=='{' 
123c0 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c  || x[0]=='\"' ||
123d0 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29 20 29   isalnum(x[0]) )
123e0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
123f0 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65  char *zOld, *zNe
12400 77 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  w;.        char 
12410 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20 20 20  *zBuf, *z;.     
12420 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e 2c 20     int nOld, n, 
12430 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c 20 6e 42 61  nLine, nNew, nBa
12440 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ck;.        int 
12450 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a 20 20  addLineMacro;.  
12460 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65        char zLine
12470 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4e  [50];.        zN
12480 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  ew = x;.        
12490 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27 22 27  if( zNew[0]=='"'
124a0 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27 7b 27   || zNew[0]=='{'
124b0 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20 20 20   ) zNew++;.     
124c0 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f 6e 53     nNew = lemonS
124d0 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20 20 20  trlen(zNew);.   
124e0 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d 3e 64       if( *psp->d
124f0 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a 20 20  eclargslot ){.  
12500 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 2a          zOld = *
12510 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
12520 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12530 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
12540 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = "";.        }.
12550 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d 20 6c          nOld = l
12560 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c 64 29  emonStrlen(zOld)
12570 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f  ;.        n = nO
12580 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a  ld + nNew + 20;.
12590 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e 65 4d          addLineM
125a0 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67 70 2d  acro = !psp->gp-
125b0 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 26  >nolinenosflag &
125c0 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e  & psp->insertLin
125d0 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20 20 20  eMacro &&.      
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125f0 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65    (psp->declline
12600 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70 73 70  noslot==0 || psp
12610 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74  ->decllinenoslot
12620 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  [0]!=0);.       
12630 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72   if( addLineMacr
12640 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  o ){.          f
12650 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61  or(z=psp->filena
12660 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b  me, nBack=0; *z;
12670 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   z++){.         
12680 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20     if( *z=='\\' 
12690 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20 20 20  ) nBack++;.     
126a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
126b0 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20   sprintf(zLine, 
126c0 22 23 6c 69 6e 65 20 25 64 20 22 2c 20 70 73 70  "#line %d ", psp
126d0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29 3b 0a  ->tokenlineno);.
126e0 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 20            nLine 
126f0 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c  = lemonStrlen(zL
12700 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ine);.          
12710 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c 65 6d  n += nLine + lem
12720 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e 66 69  onStrlen(psp->fi
12730 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63 6b 3b  lename) + nBack;
12740 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12750 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67     *psp->declarg
12760 73 6c 6f 74 20 3d 20 28 63 68 61 72 20 2a 29 20  slot = (char *) 
12770 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65  realloc(*psp->de
12780 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20  clargslot, n);. 
12790 20 20 20 20 20 20 20 7a 42 75 66 20 3d 20 2a 70         zBuf = *p
127a0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
127b0 2b 20 6e 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20  + nOld;.        
127c0 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f  if( addLineMacro
127d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
127e0 28 20 6e 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d  ( nOld && zBuf[-
127f0 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]!='\n' ){.    
12800 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
12810 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  ) = '\n';.      
12820 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12830 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69  memcpy(zBuf, zLi
12840 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
12850 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c        zBuf += nL
12860 69 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ine;.          *
12870 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a  (zBuf++) = '"';.
12880 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d            for(z=
12890 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a  psp->filename; *
128a0 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
128b0 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c       if( *z=='\\
128c0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
128d0 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27     *(zBuf++) = '
128e0 5c 5c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \\';.           
128f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
12900 28 7a 42 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20  (zBuf++) = *z;. 
12910 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12920 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
12930 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '"';.          
12940 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27  *(zBuf++) = '\n'
12950 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12960 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64 65 63      if( psp->dec
12970 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70  llinenoslot && p
12980 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
12990 6f 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ot[0]==0 ){.    
129a0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
129b0 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70  inenoslot[0] = p
129c0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  sp->tokenlineno;
129d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
129e0 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
129f0 7a 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  zNew, nNew);.   
12a00 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65       zBuf += nNe
12a10 77 3b 0a 20 20 20 20 20 20 20 20 2a 7a 42 75 66  w;.        *zBuf
12a20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
12a30 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
12a40 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
12a50 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
12a60 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
12a70 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
12a80 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
12a90 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
12aa0 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 74  legal argument t
12ab0 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73 70 2d  o %%%s: %s",psp-
12ac0 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b  >declkeyword,x);
12ad0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
12ae0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12af0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
12b00 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
12b10 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
12b20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12b30 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
12b40 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20  R_FALLBACK_ID:. 
12b50 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
12b60 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
12b70 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
12b80 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
12b90 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
12ba0 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78 5b   if( !isupper(x[
12bb0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
12bc0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
12bd0 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
12be0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12bf0 20 20 20 22 25 25 66 61 6c 6c 62 61 63 6b 20 61     "%%fallback a
12c00 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73  rgument \"%s\" s
12c10 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e  hould be a token
12c20 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
12c30 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
12c40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12c50 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
12c60 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ol *sp = Symbol_
12c70 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
12c80 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  if( psp->fallbac
12c90 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
12ca0 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20    psp->fallback 
12cb0 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65  = sp;.        }e
12cc0 6c 73 65 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c  lse if( sp->fall
12cd0 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
12ce0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12cf0 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
12d00 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12d10 20 20 20 20 20 20 20 20 22 4d 6f 72 65 20 74 68          "More th
12d20 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20  an one fallback 
12d30 61 73 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65  assigned to toke
12d40 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20  n %s", x);.     
12d50 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12d60 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
12d70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
12d80 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73  p->fallback = ps
12d90 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20  p->fallback;.   
12da0 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e         psp->gp->
12db0 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31  has_fallback = 1
12dc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12dd0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12de0 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
12df0 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49  G_FOR_WILDCARD_I
12e00 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  D:.      if( x[0
12e10 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
12e20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
12e30 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
12e40 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d  OR_RULE;.      }
12e50 65 6c 73 65 20 69 66 28 20 21 69 73 75 70 70 65  else if( !isuppe
12e60 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  r(x[0]) ){.     
12e70 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12e80 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e  >filename, psp->
12e90 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
12ea0 20 20 20 20 20 20 20 22 25 25 77 69 6c 64 63 61         "%%wildca
12eb0 72 64 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73  rd argument \"%s
12ec0 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74  \" should be a t
12ed0 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20  oken", x);.     
12ee0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12ef0 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
12f00 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12f10 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
12f20 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
12f30 20 20 20 20 69 66 28 20 70 73 70 2d 3e 67 70 2d      if( psp->gp-
12f40 3e 77 69 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a  >wildcard==0 ){.
12f50 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67            psp->g
12f60 70 2d 3e 77 69 6c 64 63 61 72 64 20 3d 20 73 70  p->wildcard = sp
12f70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12f80 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
12f90 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
12fa0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
12fb0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
12fc0 20 22 45 78 74 72 61 20 77 69 6c 64 63 61 72 64   "Extra wildcard
12fd0 20 74 6f 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20   to token: %s", 
12fe0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
12ff0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
13000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13010 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13020 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
13030 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a  TER_RULE_ERROR:.
13040 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  /*      if( x[0]
13050 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61  =='.' ) psp->sta
13060 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
13070 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a  _DECL_OR_RULE;.*
13080 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f  *      break; */
13090 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43  .    case RESYNC
130a0 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
130b0 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  R:.      if( x[0
130c0 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74  ]=='.' ) psp->st
130d0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
130e0 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
130f0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
13100 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '%' ) psp->state
13110 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
13120 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20  ECL_KEYWORD;.   
13130 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a     break;.  }.}.
13140 0a 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 65 70  ./* Run the prep
13150 72 6f 63 65 73 73 6f 72 20 6f 76 65 72 20 74 68  rocessor over th
13160 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74 65 78  e input file tex
13170 74 2e 20 20 54 68 65 20 67 6c 6f 62 61 6c 20 76  t.  The global v
13180 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 7a 44 65  ariables.** azDe
13190 66 69 6e 65 5b 30 5d 20 74 68 72 6f 75 67 68 20  fine[0] through 
131a0 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65  azDefine[nDefine
131b0 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  -1] contains the
131c0 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 64 65   names of all de
131d0 66 69 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f 73 2e  fined.** macros.
131e0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c    This routine l
131f0 6f 6f 6b 73 20 66 6f 72 20 22 25 69 66 64 65 66  ooks for "%ifdef
13200 22 20 61 6e 64 20 22 25 69 66 6e 64 65 66 22 20  " and "%ifndef" 
13210 61 6e 64 20 22 25 65 6e 64 69 66 22 20 61 6e 64  and "%endif" and
13220 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 74 68 65  .** comments the
13230 6d 20 6f 75 74 2e 20 20 54 65 78 74 20 69 6e 20  m out.  Text in 
13240 62 65 74 77 65 65 6e 20 69 73 20 61 6c 73 6f 20  between is also 
13250 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20 61 73  commented out as
13260 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
13270 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 65  .static void pre
13280 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 63 68  process_input(ch
13290 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c  ar *z){.  int i,
132a0 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20   j, k, n;.  int 
132b0 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 69  exclude = 0;.  i
132c0 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
132d0 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  int lineno = 1;.
132e0 20 20 69 6e 74 20 73 74 61 72 74 5f 6c 69 6e 65    int start_line
132f0 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  no = 1;.  for(i=
13300 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
13310 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
13320 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
13330 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 25 27 20    if( z[i]!='%' 
13340 7c 7c 20 28 69 3e 30 20 26 26 20 7a 5b 69 2d 31  || (i>0 && z[i-1
13350 5d 21 3d 27 5c 6e 27 29 20 29 20 63 6f 6e 74 69  ]!='\n') ) conti
13360 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 72  nue;.    if( str
13370 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 65 6e 64  ncmp(&z[i],"%end
13380 69 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73 73  if",6)==0 && iss
13390 70 61 63 65 28 7a 5b 69 2b 36 5d 29 20 29 7b 0a  pace(z[i+6]) ){.
133a0 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
133b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63  e ){.        exc
133c0 6c 75 64 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20  lude--;.        
133d0 69 66 28 20 65 78 63 6c 75 64 65 3d 3d 30 20 29  if( exclude==0 )
133e0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
133f0 6a 3d 73 74 61 72 74 3b 20 6a 3c 69 3b 20 6a 2b  j=start; j<i; j+
13400 2b 29 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c 6e  +) if( z[j]!='\n
13410 27 20 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a  ' ) z[j] = ' ';.
13420 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13430 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b  }.      for(j=i;
13440 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27   z[j] && z[j]!='
13450 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d  \n'; j++) z[j] =
13460 20 27 20 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20   ' ';.    }else 
13470 69 66 28 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b  if( (strncmp(&z[
13480 69 5d 2c 22 25 69 66 64 65 66 22 2c 36 29 3d 3d  i],"%ifdef",6)==
13490 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
134a0 2b 36 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20  +6])).          
134b0 7c 7c 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69  || (strncmp(&z[i
134c0 5d 2c 22 25 69 66 6e 64 65 66 22 2c 37 29 3d 3d  ],"%ifndef",7)==
134d0 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
134e0 2b 37 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 69  +7])) ){.      i
134f0 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20  f( exclude ){.  
13500 20 20 20 20 20 20 65 78 63 6c 75 64 65 2b 2b 3b        exclude++;
13510 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13520 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 37 3b        for(j=i+7;
13530 20 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20   isspace(z[j]); 
13540 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 66  j++){}.        f
13550 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20 26  or(n=0; z[j+n] &
13560 26 20 21 69 73 73 70 61 63 65 28 7a 5b 6a 2b 6e  & !isspace(z[j+n
13570 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); n++){}.     
13580 20 20 20 65 78 63 6c 75 64 65 20 3d 20 31 3b 0a     exclude = 1;.
13590 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
135a0 20 6b 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b 29   k<nDefine; k++)
135b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
135c0 73 74 72 6e 63 6d 70 28 61 7a 44 65 66 69 6e 65  strncmp(azDefine
135d0 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20  [k],&z[j],n)==0 
135e0 26 26 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  && lemonStrlen(a
135f0 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d 3d 6e 20 29  zDefine[k])==n )
13600 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  {.            ex
13610 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  clude = 0;.     
13620 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13640 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
13650 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20 29 20 65 78  z[i+3]=='n' ) ex
13660 63 6c 75 64 65 20 3d 20 21 65 78 63 6c 75 64 65  clude = !exclude
13670 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
13680 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20  clude ){.       
13690 20 20 20 73 74 61 72 74 20 3d 20 69 3b 0a 20 20     start = i;.  
136a0 20 20 20 20 20 20 20 20 73 74 61 72 74 5f 6c 69          start_li
136b0 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20  neno = lineno;. 
136c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
136d0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20  .      for(j=i; 
136e0 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c  z[j] && z[j]!='\
136f0 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20  n'; j++) z[j] = 
13700 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ' ';.    }.  }. 
13710 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a   if( exclude ){.
13720 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
13730 72 72 2c 22 75 6e 74 65 72 6d 69 6e 61 74 65 64  rr,"unterminated
13740 20 25 25 69 66 64 65 66 20 73 74 61 72 74 69 6e   %%ifdef startin
13750 67 20 6f 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c  g on line %d\n",
13760 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 29 3b 0a   start_lineno);.
13770 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
13780 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69 74 65 20  .}../* In spite 
13790 6f 66 20 69 74 73 20 6e 61 6d 65 2c 20 74 68 69  of its name, thi
137a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
137b0 61 6c 6c 79 20 61 20 73 63 61 6e 6e 65 72 2e 20  ally a scanner. 
137c0 20 49 74 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74   It read.** in t
137d0 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75 74 20  he entire input 
137e0 66 69 6c 65 20 28 61 6c 6c 20 61 74 20 6f 6e 63  file (all at onc
137f0 65 29 20 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65  e) then tokenize
13800 73 20 69 74 2e 20 20 45 61 63 68 0a 2a 2a 20 74  s it.  Each.** t
13810 6f 6b 65 6e 20 69 73 20 70 61 73 73 65 64 20 74  oken is passed t
13820 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22  o the function "
13830 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 22 20 77  parseonetoken" w
13840 68 69 63 68 20 62 75 69 6c 64 73 20 61 6c 6c 0a  hich builds all.
13850 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
13860 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
13870 65 73 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c  es in the global
13880 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 22 67   state vector "g
13890 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61 72 73  p"..*/.void Pars
138a0 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  e(struct lemon *
138b0 67 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70  gp).{.  struct p
138c0 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c 45  state ps;.  FILE
138d0 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66 69   *fp;.  char *fi
138e0 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c  lebuf;.  int fil
138f0 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e  esize;.  int lin
13900 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  eno;.  int c;.  
13910 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63  char *cp, *nextc
13920 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69  p;.  int startli
13930 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65  ne = 0;..  memse
13940 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a  t(&ps, '\0', siz
13950 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e 67  eof(ps));.  ps.g
13960 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c  p = gp;.  ps.fil
13970 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65  ename = gp->file
13980 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72  name;.  ps.error
13990 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74  cnt = 0;.  ps.st
139a0 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45  ate = INITIALIZE
139b0 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
139c0 20 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70   reading the inp
139d0 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20  ut file */.  fp 
139e0 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e  = fopen(ps.filen
139f0 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  ame,"rb");.  if(
13a00 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72   fp==0 ){.    Er
13a10 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
13a20 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e  me,0,"Can't open
13a30 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72   this file for r
13a40 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67  eading.");.    g
13a50 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
13a60 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
13a70 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a   fseek(fp,0,2);.
13a80 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65    filesize = fte
13a90 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64  ll(fp);.  rewind
13aa0 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20  (fp);.  filebuf 
13ab0 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
13ac0 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a  ( filesize+1 );.
13ad0 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d 30    if( filebuf==0
13ae0 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
13af0 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22  (ps.filename,0,"
13b00 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 25  Can't allocate %
13b10 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68  d of memory to h
13b20 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22 2c  old this file.",
13b30 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 2b  .      filesize+
13b40 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f  1);.    gp->erro
13b50 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
13b60 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  rn;.  }.  if( fr
13b70 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69  ead(filebuf,1,fi
13b80 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65  lesize,fp)!=file
13b90 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f  size ){.    Erro
13ba0 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65  rMsg(ps.filename
13bb0 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69  ,0,"Can't read i
13bc0 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f  n all %d bytes o
13bd0 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20  f this file.",. 
13be0 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a       filesize);.
13bf0 20 20 20 20 66 72 65 65 28 66 69 6c 65 62 75 66      free(filebuf
13c00 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72  );.    gp->error
13c10 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
13c20 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  n;.  }.  fclose(
13c30 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66  fp);.  filebuf[f
13c40 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20  ilesize] = 0;.. 
13c50 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74   /* Make an init
13c60 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68  ial pass through
13c70 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61 6e   the file to han
13c80 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20 25  dle %ifdef and %
13c90 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65 70  ifndef */.  prep
13ca0 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69 6c  rocess_input(fil
13cb0 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77  ebuf);..  /* Now
13cc0 20 73 63 61 6e 20 74 68 65 20 74 65 78 74 20 6f   scan the text o
13cd0 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
13ce0 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31   */.  lineno = 1
13cf0 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65 62  ;.  for(cp=fileb
13d00 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b  uf; (c= *cp)!=0;
13d10 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ){.    if( c=='
13d20 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n' ) lineno++; 
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d40 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
13d50 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f  e line number */
13d60 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65  .    if( isspace
13d70 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e  (c) ){ cp++; con
13d80 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69  tinue; }  /* Ski
13d90 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61 63  p all white spac
13da0 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d  e */.    if( c==
13db0 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f  '/' && cp[1]=='/
13dc0 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ' ){          /*
13dd0 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20   Skip C++ style 
13de0 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  comments */.    
13df0 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77    cp+=2;.      w
13e00 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
13e10 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63  0 && c!='\n' ) c
13e20 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  p++;.      conti
13e30 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
13e40 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b  f( c=='/' && cp[
13e50 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20 20  1]=='*' ){      
13e60 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73 74      /* Skip C st
13e70 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a  yle comments */.
13e80 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20        cp+=2;.   
13e90 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
13ea0 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27  p)!=0 && (c!='/'
13eb0 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29   || cp[-1]!='*')
13ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13ed0 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
13ee0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b  ++;.        cp++
13ef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13f00 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20  if( c ) cp++;.  
13f10 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
13f20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e    }.    ps.token
13f30 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20 20  start = cp;     
13f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
13f50 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  rk the beginning
13f60 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f   of the token */
13f70 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e  .    ps.tokenlin
13f80 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20  eno = lineno;   
13f90 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e          /* Linen
13fa0 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74  umber on which t
13fb0 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20  oken begins */. 
13fc0 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20 29     if( c=='\"' )
13fd0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
13fe0 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20        /* String 
13ff0 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20  literals */.    
14000 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68    cp++;.      wh
14010 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
14020 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20   && c!='\"' ){. 
14030 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
14040 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
14050 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20         cp++;.   
14060 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
14070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
14080 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
14090 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22  ame,startline,."
140a0 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67 20  String starting 
140b0 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  on this line is 
140c0 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
140d0 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66  efore the end of
140e0 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20   the file.");.  
140f0 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e        ps.errorcn
14100 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78  t++;.        nex
14110 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20  tcp = cp;.      
14120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
14130 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20  extcp = cp+1;.  
14140 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
14150 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20  if( c=='{' ){   
14160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
14170 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65   block of C code
14180 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65   */.      int le
14190 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b  vel;.      cp++;
141a0 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65 6c  .      for(level
141b0 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  =1; (c= *cp)!=0 
141c0 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63  && (level>1 || c
141d0 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20  !='}'); cp++){. 
141e0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
141f0 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
14200 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
14210 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b  c=='{' ) level++
14220 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  ;.        else i
14230 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65  f( c=='}' ) leve
14240 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c 73  l--;.        els
14250 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20  e if( c=='/' && 
14260 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f  cp[1]=='*' ){  /
14270 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20  * Skip comments 
14280 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
14290 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20   prevc;.        
142a0 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20    cp = &cp[2];. 
142b0 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
142c0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68   0;.          wh
142d0 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
142e0 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70   && (c!='/' || p
142f0 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20  revc!='*') ){.  
14300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
14310 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
14320 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  ;.            pr
14330 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  evc = c;.       
14340 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d 0a       cp++;..  }.
14350 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f  .}else if( c=='/
14360 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20  ' && cp[1]=='/' 
14370 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20  ){  /* Skip C++ 
14380 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74  style comments t
14390 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  oo */.          
143a0 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20  cp = &cp[2];.   
143b0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
143c0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
143d0 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '\n' ) cp++;.   
143e0 20 20 20 20 20 20 20 69 66 28 20 63 20 29 20 6c         if( c ) l
143f0 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65 20  ineno++;..}else 
14400 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63  if( c=='\'' || c
14410 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20  =='\"' ){    /* 
14420 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74  String a charact
14430 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20  er literals */. 
14440 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61           int sta
14450 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20  rtchar, prevc;. 
14460 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68           startch
14470 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  ar = c;.        
14480 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20    prevc = 0;.   
14490 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b         for(cp++;
144a0 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
144b0 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c  (c!=startchar ||
144c0 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63   prevc=='\\'); c
144d0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  p++){.          
144e0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
144f0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
14500 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d        if( prevc=
14510 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20  ='\\' ) prevc = 
14520 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  0;.            e
14530 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
14540 20 70 72 65 76 63 20 3d 20 63 3b 0a 09 20 20 7d   prevc = c;..  }
14550 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ..}.      }.    
14560 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
14570 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
14580 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f  s.filename,ps.to
14590 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f  kenlineno,."C co
145a0 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74  de starting on t
145b0 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
145c0 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72  terminated befor
145d0 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
145e0 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   file.");.      
145f0 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b    ps.errorcnt++;
14600 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
14610 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = cp;.      }els
14620 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  e{.        nextc
14630 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20  p = cp+1;.      
14640 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
14650 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20 20  isalnum(c) ){   
14660 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69         /* Identi
14670 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77  fiers */.      w
14680 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
14690 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63 29  0 && (isalnum(c)
146a0 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70   || c=='_') ) cp
146b0 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
146c0 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
146d0 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63   if( c==':' && c
146e0 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b  p[1]==':' && cp[
146f0 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68  2]=='=' ){ /* Th
14700 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22  e operator "::="
14710 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20   */.      cp += 
14720 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  3;.      nextcp 
14730 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = cp;.    }else 
14740 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63  if( (c=='/' || c
14750 3d 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70 68  =='|') && isalph
14760 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20  a(cp[1]) ){.    
14770 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20    cp += 2;.     
14780 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70   while( (c = *cp
14790 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d  )!=0 && (isalnum
147a0 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29  (c) || c=='_') )
147b0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78   cp++;.      nex
147c0 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65  tcp = cp;.    }e
147d0 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
147f0 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20   All other (one 
14800 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61  character) opera
14810 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  tors */.      cp
14820 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
14830 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20   = cp;.    }.   
14840 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
14850 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14870 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   Null terminate 
14880 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20  the token */.   
14890 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26   parseonetoken(&
148a0 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ps);            
148b0 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f   /* Parse the to
148c0 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d  ken */.    *cp =
148d0 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   c;             
148e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
148f0 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  store the buffer
14900 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78   */.    cp = nex
14910 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  tcp;.  }.  free(
14920 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20  filebuf);       
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14940 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66  Release the buff
14950 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67  er after parsing
14960 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d   */.  gp->rule =
14970 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20   ps.firstrule;. 
14980 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20   gp->errorcnt = 
14990 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f  ps.errorcnt;.}./
149a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
149c0 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b   the file "plink
149d0 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
149e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
149f0 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73   Routines proces
14a00 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69  sing configurati
14a10 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  on follow-set pr
14a20 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
14a30 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  ** in the LEMON 
14a40 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
14a50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
14a60 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f  ct plink *plink_
14a70 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f  freelist = 0;../
14a80 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
14a90 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74   plink */.struct
14aa0 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65   plink *Plink_ne
14ab0 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  w(){.  struct pl
14ac0 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a 0a 20  ink *newlink;.. 
14ad0 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c   if( plink_freel
14ae0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ist==0 ){.    in
14af0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74  t i;.    int amt
14b00 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e   = 100;.    plin
14b10 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74  k_freelist = (st
14b20 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c  ruct plink *)cal
14b30 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66  loc( amt, sizeof
14b40 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 29 20 29  (struct plink) )
14b50 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f  ;.    if( plink_
14b60 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
14b70 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
14b80 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62  err,.      "Unab
14b90 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
14ba0 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
14bb0 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61  follow-set propa
14bc0 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29  gation link.\n")
14bd0 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
14be0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
14bf0 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
14c00 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  ) plink_freelist
14c10 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e  [i].next = &plin
14c20 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b  k_freelist[i+1];
14c30 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  .    plink_freel
14c40 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20  ist[amt-1].next 
14c50 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 6c 69  = 0;.  }.  newli
14c60 6e 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  nk = plink_freel
14c70 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65  ist;.  plink_fre
14c80 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72  elist = plink_fr
14c90 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20  eelist->next;.  
14ca0 72 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b 3b 0a  return newlink;.
14cb0 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69 6e  }../* Add a plin
14cc0 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69 73  k to a plink lis
14cd0 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  t */.void Plink_
14ce0 61 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  add(struct plink
14cf0 20 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63 74 20   **plpp, struct 
14d00 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20  config *cfp).{. 
14d10 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
14d20 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e  ewlink;.  newlin
14d30 6b 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b  k = Plink_new();
14d40 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65 78 74  .  newlink->next
14d50 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70   = *plpp;.  *plp
14d60 70 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e  p = newlink;.  n
14d70 65 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20 63 66  ewlink->cfp = cf
14d80 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65  p;.}../* Transfe
14d90 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e  r every plink on
14da0 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22   the list "from"
14db0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f   to the list "to
14dc0 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  " */.void Plink_
14dd0 63 6f 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e  copy(struct plin
14de0 6b 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74 20 70  k **to, struct p
14df0 6c 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a 20 20  link *from).{.  
14e00 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
14e10 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66  xtpl;.  while( f
14e20 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  rom ){.    nextp
14e30 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a  l = from->next;.
14e40 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d      from->next =
14e50 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20   *to;.    *to = 
14e60 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d  from;.    from =
14e70 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a   nextpl;.  }.}..
14e80 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20  /* Delete every 
14e90 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73  plink on the lis
14ea0 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  t */.void Plink_
14eb0 64 65 6c 65 74 65 28 73 74 72 75 63 74 20 70 6c  delete(struct pl
14ec0 69 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20 73 74  ink *plp).{.  st
14ed0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74  ruct plink *next
14ee0 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c  pl;..  while( pl
14ef0 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20  p ){.    nextpl 
14f00 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  = plp->next;.   
14f10 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69   plp->next = pli
14f20 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20  nk_freelist;.   
14f30 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20   plink_freelist 
14f40 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d  = plp;.    plp =
14f50 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f   nextpl;.  }.}./
14f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14f70 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
14f80 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22   file "report.c"
14f90 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
14fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
14fb0 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f  ** Procedures fo
14fc0 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70  r generating rep
14fd0 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20  orts and tables 
14fe0 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
14ff0 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
15000 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  /../* Generate a
15010 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74   filename with t
15020 68 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e  he given suffix.
15030 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
15040 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65  the.** name come
15050 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  s from malloc() 
15060 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
15070 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
15080 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
15090 0a 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 66  .PRIVATE char *f
150a0 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73 74 72  ile_makename(str
150b0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c  uct lemon *lemp,
150c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66   const char *suf
150d0 66 69 78 29 0a 7b 0a 20 20 63 68 61 72 20 2a 6e  fix).{.  char *n
150e0 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
150f0 0a 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68 61 72  ..  name = (char
15100 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
15110 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c 65  trlen(lemp->file
15120 6e 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53 74 72  name) + lemonStr
15130 6c 65 6e 28 73 75 66 66 69 78 29 20 2b 20 35 20  len(suffix) + 5 
15140 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30  );.  if( name==0
15150 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
15160 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c  stderr,"Can't al
15170 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
15180 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29   a filename.\n")
15190 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
151a0 20 7d 0a 20 20 73 74 72 63 70 79 28 6e 61 6d 65   }.  strcpy(name
151b0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
151c0 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72  ;.  cp = strrchr
151d0 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66  (name,'.');.  if
151e0 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30 3b 0a  ( cp ) *cp = 0;.
151f0 20 20 73 74 72 63 61 74 28 6e 61 6d 65 2c 73 75    strcat(name,su
15200 66 66 69 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  ffix);.  return 
15210 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e  name;.}../* Open
15220 20 61 20 66 69 6c 65 20 77 69 74 68 20 61 20 6e   a file with a n
15230 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ame based on the
15240 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70   name of the inp
15250 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20  ut file,.** but 
15260 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
15270 20 28 73 70 65 63 69 66 69 65 64 29 20 73 75 66   (specified) suf
15280 66 69 78 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  fix, and return 
15290 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
152a0 74 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52  the stream */.PR
152b0 49 56 41 54 45 20 46 49 4c 45 20 2a 66 69 6c 65  IVATE FILE *file
152c0 5f 6f 70 65 6e 28 0a 20 20 73 74 72 75 63 74 20  _open(.  struct 
152d0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 63  lemon *lemp,.  c
152e0 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66 66 69  onst char *suffi
152f0 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
15300 2a 6d 6f 64 65 0a 29 7b 0a 20 20 46 49 4c 45 20  *mode.){.  FILE 
15310 2a 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70  *fp;..  if( lemp
15320 2d 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72 65 65  ->outname ) free
15330 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  (lemp->outname);
15340 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  .  lemp->outname
15350 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65   = file_makename
15360 28 6c 65 6d 70 2c 20 73 75 66 66 69 78 29 3b 0a  (lemp, suffix);.
15370 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c 65 6d    fp = fopen(lem
15380 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64 65 29  p->outname,mode)
15390 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 26 26  ;.  if( fp==0 &&
153a0 20 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b 0a 20   *mode=='w' ){. 
153b0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
153c0 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 66 69  r,"Can't open fi
153d0 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65  le \"%s\".\n",le
153e0 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20  mp->outname);.  
153f0 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
15400 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ++;.    return 0
15410 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
15420 66 69 6c 65 73 20 77 65 20 63 72 65 61 74 65 20  files we create 
15430 74 6f 20 61 20 6c 69 73 74 2c 20 73 6f 20 77 65  to a list, so we
15440 20 63 61 6e 20 64 65 6c 65 74 65 20 74 68 65 6d   can delete them
15450 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 69   if we fail. Thi
15460 73 0a 20 20 2a 2a 20 69 73 20 74 6f 20 6b 65 65  s.  ** is to kee
15470 70 20 6d 61 6b 65 66 69 6c 65 73 20 66 72 6f 6d  p makefiles from
15480 20 67 65 74 74 69 6e 67 20 63 6f 6e 66 75 73 65   getting confuse
15490 64 2e 20 57 65 20 64 6f 6e 27 74 20 69 6e 63 6c  d. We don't incl
154a0 75 64 65 20 2e 6f 75 74 20 66 69 6c 65 73 2c 0a  ude .out files,.
154b0 20 20 2a 2a 20 74 68 6f 75 67 68 3a 20 74 68 69    ** though: thi
154c0 73 20 69 73 20 64 65 62 75 67 20 69 6e 66 6f 72  s is debug infor
154d0 6d 61 74 69 6f 6e 2c 20 61 6e 64 20 79 6f 75 20  mation, and you 
154e0 64 6f 6e 27 74 20 77 61 6e 74 20 69 74 20 64 65  don't want it de
154f0 6c 65 74 65 64 20 69 66 20 74 68 65 72 65 0a 20  leted if there. 
15500 20 2a 2a 20 77 61 73 20 61 6e 20 65 72 72 6f 72   ** was an error
15510 20 79 6f 75 20 6e 65 65 64 20 74 6f 20 74 72 61   you need to tra
15520 63 6b 20 64 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  ck down..  */.  
15530 69 66 28 28 20 2a 6d 6f 64 65 3d 3d 27 77 27 20  if(( *mode=='w' 
15540 29 20 26 26 20 28 73 74 72 63 6d 70 28 73 75 66  ) && (strcmp(suf
15550 66 69 78 2c 20 22 2e 6f 75 74 22 29 20 21 3d 20  fix, ".out") != 
15560 30 29 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0)){.    const c
15570 68 61 72 20 2a 2a 70 74 72 20 3d 20 28 63 6f 6e  har **ptr = (con
15580 73 74 20 63 68 61 72 20 2a 2a 29 0a 20 20 20 20  st char **).    
15590 20 20 20 20 72 65 61 6c 6c 6f 63 28 6d 61 64 65      realloc(made
155a0 5f 66 69 6c 65 73 2c 20 73 69 7a 65 6f 66 20 28  _files, sizeof (
155b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 20 2a  const char **) *
155c0 20 28 6d 61 64 65 5f 66 69 6c 65 73 5f 63 6f 75   (made_files_cou
155d0 6e 74 20 2b 20 31 29 29 3b 0a 20 20 20 20 63 68  nt + 1));.    ch
155e0 61 72 20 2a 66 6e 61 6d 65 20 3d 20 73 74 72 64  ar *fname = strd
155f0 75 70 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  up(lemp->outname
15600 29 3b 0a 20 20 20 20 69 66 20 28 28 70 74 72 20  );.    if ((ptr 
15610 3d 3d 20 4e 55 4c 4c 29 20 7c 7c 20 28 66 6e 61  == NULL) || (fna
15620 6d 65 20 3d 3d 20 4e 55 4c 4c 29 29 20 7b 0a 20  me == NULL)) {. 
15630 20 20 20 20 20 20 20 66 72 65 65 28 70 74 72 29         free(ptr)
15640 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 66  ;.        free(f
15650 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6d  name);.        m
15660 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20  emory_error();. 
15670 20 20 20 7d 0a 20 20 20 20 6d 61 64 65 5f 66 69     }.    made_fi
15680 6c 65 73 20 3d 20 70 74 72 3b 0a 20 20 20 20 6d  les = ptr;.    m
15690 61 64 65 5f 66 69 6c 65 73 5b 6d 61 64 65 5f 66  ade_files[made_f
156a0 69 6c 65 73 5f 63 6f 75 6e 74 2b 2b 5d 20 3d 20  iles_count++] = 
156b0 66 6e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74  fname;.  }.  ret
156c0 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20 44 75  urn fp;.}../* Du
156d0 70 6c 69 63 61 74 65 20 74 68 65 20 69 6e 70 75  plicate the inpu
156e0 74 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 63  t file without c
156f0 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77 69 74 68  omments and with
15700 6f 75 74 20 61 63 74 69 6f 6e 73 20 0a 2a 2a 20  out actions .** 
15710 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76 6f 69 64  on rules */.void
15720 20 52 65 70 72 69 6e 74 28 73 74 72 75 63 74 20   Reprint(struct 
15730 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
15740 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
15750 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
15760 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20  l *sp;.  int i, 
15770 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20  j, maxlen, len, 
15780 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a  ncolumns, skip;.
15790 20 20 70 72 69 6e 74 66 28 22 2f 2f 20 52 65 70    printf("// Rep
157a0 72 69 6e 74 20 6f 66 20 69 6e 70 75 74 20 66 69  rint of input fi
157b0 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53  le \"%s\".\n// S
157c0 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d  ymbols:\n",lemp-
157d0 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61  >filename);.  ma
157e0 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72  xlen = 10;.  for
157f0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
15800 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
15810 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
15820 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20  ols[i];.    len 
15830 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 70  = lemonStrlen(sp
15840 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  ->name);.    if(
15850 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61   len>maxlen ) ma
15860 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a  xlen = len;.  }.
15870 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37 36 2f    ncolumns = 76/
15880 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20 20 69 66  (maxlen+5);.  if
15890 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29 20 6e  ( ncolumns<1 ) n
158a0 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 73  columns = 1;.  s
158b0 6b 69 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e 73 79  kip = (lemp->nsy
158c0 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e 73 20  mbol + ncolumns 
158d0 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b 0a 20  - 1)/ncolumns;. 
158e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 6b 69 70   for(i=0; i<skip
158f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e  ; i++){.    prin
15900 74 66 28 22 2f 2f 22 29 3b 0a 20 20 20 20 66 6f  tf("//");.    fo
15910 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e  r(j=i; j<lemp->n
15920 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69 70 29  symbol; j+=skip)
15930 7b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d  {.      sp = lem
15940 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20  p->symbols[j];. 
15950 20 20 20 20 20 61 73 73 65 72 74 28 20 73 70 2d       assert( sp-
15960 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20 20 20  >index==j );.   
15970 20 20 20 70 72 69 6e 74 66 28 22 20 25 33 64 20     printf(" %3d 
15980 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c 65 6e  %-*.*s",j,maxlen
15990 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61 6d 65  ,maxlen,sp->name
159a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  );.    }.    pri
159b0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ntf("\n");.  }. 
159c0 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
159d0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
159e0 65 78 74 29 7b 0a 20 20 20 20 70 72 69 6e 74 66  ext){.    printf
159f0 28 22 25 73 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e  ("%s",rp->lhs->n
15a00 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20 20 20 20  ame);.    /*    
15a10 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
15a20 20 29 20 70 72 69 6e 74 66 28 22 28 25 73 29 22   ) printf("(%s)"
15a30 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 20  ,rp->lhsalias); 
15a40 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  */.    printf(" 
15a50 3a 3a 3d 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  ::=");.    for(i
15a60 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
15a70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70 20 3d  i++){.      sp =
15a80 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
15a90 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
15aa0 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
15ab0 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
15ac0 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
15ad0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  .        for(j=1
15ae0 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
15af0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
15b00 20 70 72 69 6e 74 66 28 22 7c 25 73 22 2c 20 73   printf("|%s", s
15b10 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61  p->subsym[j]->na
15b20 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
15b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
15b40 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
15b50 5b 69 5d 20 29 20 70 72 69 6e 74 66 28 22 28 25  [i] ) printf("(%
15b60 73 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  s)",rp->rhsalias
15b70 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20  [i]); */.    }. 
15b80 20 20 20 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a     printf(".");.
15b90 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63      if( rp->prec
15ba0 73 79 6d 20 29 20 70 72 69 6e 74 66 28 22 20 5b  sym ) printf(" [
15bb0 25 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d  %s]",rp->precsym
15bc0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a 20  ->name);.    /* 
15bd0 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 70  if( rp->code ) p
15be0 72 69 6e 74 66 28 22 5c 6e 20 20 20 20 25 73 22  rintf("\n    %s"
15bf0 2c 72 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20  ,rp->code); */. 
15c00 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b     printf("\n");
15c10 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64 20 43 6f 6e  .  }.}..void Con
15c20 66 69 67 50 72 69 6e 74 28 46 49 4c 45 20 2a 66  figPrint(FILE *f
15c30 70 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  p, struct config
15c40 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72 75 63   *cfp).{.  struc
15c50 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74  t rule *rp;.  st
15c60 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
15c70 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 72  .  int i, j;.  r
15c80 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 66  p = cfp->rp;.  f
15c90 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a  printf(fp,"%s ::
15ca0 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  =",rp->lhs->name
15cb0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
15cc0 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  =rp->nrhs; i++){
15cd0 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66 70 2d  .    if( i==cfp-
15ce0 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66 28 66  >dot ) fprintf(f
15cf0 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69 66 28  p," *");.    if(
15d00 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62   i==rp->nrhs ) b
15d10 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72  reak;.    sp = r
15d20 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 66  p->rhs[i];.    f
15d30 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c  printf(fp," %s",
15d40 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
15d50 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
15d60 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
15d70 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
15d80 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b  sp->nsubsym; j++
15d90 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
15da0 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d 3e  tf(fp,"|%s",sp->
15db0 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29  subsym[j]->name)
15dc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15dd0 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e    }.}../* #defin
15de0 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30 0a  e TEST */.#if 0.
15df0 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20 2a  /* Print a set *
15e00 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 53  /.PRIVATE void S
15e10 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c  etPrint(out,set,
15e20 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  lemp).FILE *out;
15e30 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72 75  .char *set;.stru
15e40 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
15e50 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
15e60 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70 61  r *spacer;.  spa
15e70 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72 69  cer = "";.  fpri
15e80 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c  ntf(out,"%12s[",
15e90 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  "");.  for(i=0; 
15ea0 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
15eb0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
15ec0 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29 20   SetFind(set,i) 
15ed0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
15ee0 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61 63  (out,"%s%s",spac
15ef0 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  er,lemp->symbols
15f00 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
15f10 20 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b 0a    spacer = " ";.
15f20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
15f30 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a  ntf(out,"]\n");.
15f40 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c  }../* Print a pl
15f50 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49  ink chain */.PRI
15f60 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50  VATE void PlinkP
15f70 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67  rint(out,plp,tag
15f80 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
15f90 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
15fa0 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77  char *tag;.{.  w
15fb0 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20  hile( plp ){.   
15fc0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31   fprintf(out,"%1
15fd0 32 73 25 73 20 28 73 74 61 74 65 20 25 32 64 29  2s%s (state %2d)
15fe0 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63   ","",tag,plp->c
15ff0 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e 75  fp->stp->statenu
16000 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50 72  m);.    ConfigPr
16010 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70  int(out,plp->cfp
16020 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
16030 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c  ut,"\n");.    pl
16040 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  p = plp->next;. 
16050 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20   }.}.#endif../* 
16060 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20  Print an action 
16070 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
16080 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
16090 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a  eturn FALSE if.*
160a0 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61 63  * nothing was ac
160b0 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a  tually printed..
160c0 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74 69  */.int PrintActi
160d0 6f 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  on(struct action
160e0 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20   *ap, FILE *fp, 
160f0 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69  int indent){.  i
16100 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20  nt result = 1;. 
16110 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
16120 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
16130 49 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  IFT:.      fprin
16140 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74  tf(fp,"%*s shift
16150 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d    %d",indent,ap-
16160 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e  >sp->name,ap->x.
16170 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
16180 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16190 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20 20   case REDUCE:.  
161a0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
161b0 25 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c 69  %*s reduce %d",i
161c0 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
161d0 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64  me,ap->x.rp->ind
161e0 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
161f0 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50  ;.    case ACCEP
16200 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
16210 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74 22  (fp,"%*s accept"
16220 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
16230 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
16240 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52  ak;.    case ERR
16250 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  OR:.      fprint
16260 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72 22  f(fp,"%*s error"
16270 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
16280 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
16290 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 52 43  ak;.    case SRC
162a0 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63 61 73  ONFLICT:.    cas
162b0 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20  e RRCONFLICT:.  
162c0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
162d0 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64 20  %*s reduce %-3d 
162e0 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c  ** Parsing confl
162f0 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20  ict **",.       
16300 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
16310 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69  name,ap->x.rp->i
16320 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  ndex);.      bre
16330 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 43  ak;.    case SSC
16340 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66  ONFLICT:.      f
16350 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
16360 68 69 66 74 20 20 25 64 20 2a 2a 20 50 61 72 73  hift  %d ** Pars
16370 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22  ing conflict **"
16380 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e  , .        inden
16390 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
163a0 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
163b0 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  um);.      break
163c0 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45  ;.    case SH_RE
163d0 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SOLVED:.    case
163e0 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20   RD_RESOLVED:.  
163f0 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a    case NOT_USED:
16400 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
16410 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
16420 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
16430 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  ult;.}../* Gener
16440 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70 75  ate the "y.outpu
16450 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76  t" log file */.v
16460 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
16470 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
16480 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp).{.  int i;.
16490 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
164a0 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 63 6f  stp;.  struct co
164b0 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72  nfig *cfp;.  str
164c0 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
164d0 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66    FILE *fp;..  f
164e0 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  p = file_open(le
164f0 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62 22 29 3b  mp,".out","wb");
16500 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 20 72  .  if( fp==0 ) r
16510 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
16520 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
16530 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
16540 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
16550 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66  ];.    fprintf(f
16560 70 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c  p,"State %d:\n",
16570 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
16580 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61      if( lemp->ba
16590 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 73 74  sisflag ) cfp=st
165a0 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65 20  p->bp;.    else 
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165c0 20 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a 20   cfp=stp->cfp;. 
165d0 20 20 20 77 68 69 6c 65 28 20 63 66 70 20 29 7b     while( cfp ){
165e0 0a 20 20 20 20 20 20 63 68 61 72 20 62 75 66 5b  .      char buf[
165f0 32 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63  20];.      if( c
16600 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72 70  fp->dot==cfp->rp
16610 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  ->nrhs ){.      
16620 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22 28    sprintf(buf,"(
16630 25 64 29 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 6e  %d)",cfp->rp->in
16640 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 66 70  dex);.        fp
16650 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20 25 35  rintf(fp,"    %5
16660 73 20 22 2c 62 75 66 29 3b 0a 20 20 20 20 20 20  s ",buf);.      
16670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
16680 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20 20 20  printf(fp,"     
16690 20 20 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d       ");.      }
166a0 0a 20 20 20 20 20 20 43 6f 6e 66 69 67 50 72 69  .      ConfigPri
166b0 6e 74 28 66 70 2c 63 66 70 29 3b 0a 20 20 20 20  nt(fp,cfp);.    
166c0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e    fprintf(fp,"\n
166d0 22 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20  ");.#if 0.      
166e0 53 65 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  SetPrint(fp,cfp-
166f0 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20  >fws,lemp);.    
16700 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c    PlinkPrint(fp,
16710 63 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22  cfp->fplp,"To  "
16720 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
16730 69 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70  int(fp,cfp->bplp
16740 2c 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66  ,"From");.#endif
16750 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  .      if( lemp-
16760 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70  >basisflag ) cfp
16770 3d 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20  =cfp->bp;.      
16780 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
16790 20 20 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e        cfp=cfp->n
167a0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ext;.    }.    f
167b0 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
167c0 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
167d0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
167e0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
167f0 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c   PrintAction(ap,
16800 66 70 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66  fp,30) ) fprintf
16810 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  (fp,"\n");.    }
16820 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
16830 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 70 72  "\n");.  }.  fpr
16840 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d 2d 2d 2d  intf(fp, "------
16850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
16880 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70  ");.  fprintf(fp
16890 2c 20 22 53 79 6d 62 6f 6c 73 3a 5c 6e 22 29 3b  , "Symbols:\n");
168a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
168b0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
168c0 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  ){.    int j;.  
168d0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
168e0 2a 73 70 3b 0a 0a 20 20 20 20 73 70 20 3d 20 6c  *sp;..    sp = l
168f0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
16900 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
16910 20 22 20 20 25 33 64 3a 20 25 73 22 2c 20 69 2c   "  %3d: %s", i,
16920 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
16930 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f  if( sp->type==NO
16940 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  NTERMINAL ){.   
16950 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22     fprintf(fp, "
16960 3a 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  :");.      if( s
16970 70 2d 3e 6c 61 6d 62 64 61 20 29 7b 0a 20 20 20  p->lambda ){.   
16980 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
16990 20 22 20 3c 6c 61 6d 62 64 61 3e 22 29 3b 0a 20   " <lambda>");. 
169a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
169b0 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74  (j=0; j<lemp->nt
169c0 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20  erminal; j++){. 
169d0 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 66         if( sp->f
169e0 69 72 73 74 73 65 74 20 26 26 20 53 65 74 46 69  irstset && SetFi
169f0 6e 64 28 73 70 2d 3e 66 69 72 73 74 73 65 74 2c  nd(sp->firstset,
16a00 20 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   j) ){.         
16a10 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 20 25   fprintf(fp, " %
16a20 73 22 2c 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  s", lemp->symbol
16a30 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[j]->name);.   
16a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16a50 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
16a60 28 66 70 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a  (fp, "\n");.  }.
16a70 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20    fclose(fp);.  
16a80 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65  return;.}../* Se
16a90 61 72 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c  arch for the fil
16aa0 65 20 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69  e "name" which i
16ab0 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
16ac0 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
16ad0 65 20 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a  e exacutable */.
16ae0 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 70 61  PRIVATE char *pa
16af0 74 68 73 65 61 72 63 68 28 63 68 61 72 20 2a 61  thsearch(char *a
16b00 72 67 76 30 2c 20 63 68 61 72 20 2a 6e 61 6d 65  rgv0, char *name
16b10 2c 20 69 6e 74 20 6d 6f 64 65 6d 61 73 6b 29 0a  , int modemask).
16b20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
16b30 70 61 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72  pathlist;.  char
16b40 20 2a 70 61 74 68 62 75 66 70 74 72 3b 0a 20 20   *pathbufptr;.  
16b50 63 68 61 72 20 2a 70 61 74 68 62 75 66 3b 0a 20  char *pathbuf;. 
16b60 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b   char *path,*cp;
16b70 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69 66 64  .  char c;..#ifd
16b80 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63  ef __WIN32__.  c
16b90 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76  p = strrchr(argv
16ba0 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20  0,'\\');.#else. 
16bb0 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72   cp = strrchr(ar
16bc0 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66  gv0,'/');.#endif
16bd0 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20  .  if( cp ){.   
16be0 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
16bf0 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20  p = 0;.    path 
16c00 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
16c10 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72  ( lemonStrlen(ar
16c20 67 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c  gv0) + lemonStrl
16c30 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a  en(name) + 2 );.
16c40 20 20 20 20 69 66 28 20 70 61 74 68 20 29 20 73      if( path ) s
16c50 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f  printf(path,"%s/
16c60 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b  %s",argv0,name);
16c70 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20  .    *cp = c;.  
16c80 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 74 68 6c  }else{.    pathl
16c90 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50 41  ist = getenv("PA
16ca0 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70 61  TH");.    if( pa
16cb0 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74 68  thlist==0 ) path
16cc0 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f  list = ".:/bin:/
16cd0 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61  usr/bin";.    pa
16ce0 74 68 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29  thbuf = (char *)
16cf0 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74   malloc( lemonSt
16d00 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 20 2b  rlen(pathlist) +
16d10 20 31 20 29 3b 0a 20 20 20 20 70 61 74 68 20 3d   1 );.    path =
16d20 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
16d30 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
16d40 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c  hlist)+lemonStrl
16d50 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20  en(name)+2 );.  
16d60 20 20 69 66 28 20 28 70 61 74 68 62 75 66 20 21    if( (pathbuf !
16d70 3d 20 30 29 20 26 26 20 28 70 61 74 68 21 3d 30  = 0) && (path!=0
16d80 29 20 29 7b 0a 20 20 20 20 20 20 70 61 74 68 62  ) ){.      pathb
16d90 75 66 70 74 72 20 3d 20 70 61 74 68 62 75 66 3b  ufptr = pathbuf;
16da0 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 70 61  .      strcpy(pa
16db0 74 68 62 75 66 2c 20 70 61 74 68 6c 69 73 74 29  thbuf, pathlist)
16dc0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  ;.      while( *
16dd0 70 61 74 68 62 75 66 20 29 7b 0a 20 20 20 20 20  pathbuf ){.     
16de0 20 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 70     cp = strchr(p
16df0 61 74 68 62 75 66 2c 27 3a 27 29 3b 0a 20 20 20  athbuf,':');.   
16e00 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29       if( cp==0 )
16e10 20 63 70 20 3d 20 26 70 61 74 68 62 75 66 5b 6c   cp = &pathbuf[l
16e20 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 62  emonStrlen(pathb
16e30 75 66 29 5d 3b 0a 20 20 20 20 20 20 20 20 63 20  uf)];.        c 
16e40 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20 2a  = *cp;.        *
16e50 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  cp = 0;.        
16e60 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
16e70 2f 25 73 22 2c 70 61 74 68 62 75 66 2c 6e 61 6d  /%s",pathbuf,nam
16e80 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20  e);.        *cp 
16e90 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = c;.        if(
16ea0 20 63 3d 3d 30 20 29 20 70 61 74 68 62 75 66 5b   c==0 ) pathbuf[
16eb0 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
16ec0 65 6c 73 65 20 70 61 74 68 62 75 66 20 3d 20 26  else pathbuf = &
16ed0 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  cp[1];.        i
16ee0 66 28 20 61 63 63 65 73 73 28 70 61 74 68 2c 6d  f( access(path,m
16ef0 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62 72  odemask)==0 ) br
16f00 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
16f10 20 20 20 66 72 65 65 28 70 61 74 68 62 75 66 70     free(pathbufp
16f20 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  tr);.    }.  }. 
16f30 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a   return path;.}.
16f40 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61 63 74  ./* Given an act
16f50 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68 65  ion, compute the
16f60 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
16f70 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a  or that action.*
16f80 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20 62 65  * which is to be
16f90 20 70 75 74 20 69 6e 20 74 68 65 20 61 63 74 69   put in the acti
16fa0 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  on table of the 
16fb0 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e  generated machin
16fc0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67  e..** Return neg
16fd0 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63 74 69  ative if no acti
16fe0 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67 65 6e  on should be gen
16ff0 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41  erated..*/.PRIVA
17000 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61  TE int compute_a
17010 63 74 69 6f 6e 28 73 74 72 75 63 74 20 6c 65 6d  ction(struct lem
17020 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74  on *lemp, struct
17030 20 61 63 74 69 6f 6e 20 2a 61 70 29 0a 7b 0a 20   action *ap).{. 
17040 20 69 6e 74 20 61 63 74 3b 0a 20 20 73 77 69 74   int act;.  swit
17050 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a  ch( ap->type ){.
17060 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 20      case SHIFT: 
17070 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74 70   act = ap->x.stp
17080 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20 20 20 20  ->statenum;     
17090 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
170a0 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 20 61    case REDUCE: a
170b0 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e 69  ct = ap->x.rp->i
170c0 6e 64 65 78 20 2b 20 6c 65 6d 70 2d 3e 6e 73 74  ndex + lemp->nst
170d0 61 74 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ate; break;.    
170e0 63 61 73 65 20 45 52 52 4f 52 3a 20 20 61 63 74  case ERROR:  act
170f0 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20   = lemp->nstate 
17100 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20 20  + lemp->nrule;  
17110 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
17120 73 65 20 41 43 43 45 50 54 3a 20 61 63 74 20 3d  se ACCEPT: act =
17130 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
17140 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 31 3b  lemp->nrule + 1;
17150 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
17160 75 6c 74 3a 20 20 20 20 20 61 63 74 20 3d 20 2d  ult:     act = -
17170 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  1; break;.  }.  
17180 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a 23  return act;.}..#
17190 64 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a 45 20  define LINESIZE 
171a0 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65 78 74  1000./* The next
171b0 20 63 6c 75 73 74 65 72 20 6f 66 20 72 6f 75 74   cluster of rout
171c0 69 6e 65 73 20 61 72 65 20 66 6f 72 20 72 65 61  ines are for rea
171d0 64 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74  ding the templat
171e0 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 77 72  e file.** and wr
171f0 69 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  iting the result
17200 73 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74  s to the generat
17210 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f 2a 20  ed parser */./* 
17220 54 68 65 20 66 69 72 73 74 20 66 75 6e 63 74 69  The first functi
17230 6f 6e 20 74 72 61 6e 73 66 65 72 73 20 64 61 74  on transfers dat
17240 61 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f 20 22  a from "in" to "
17250 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20 61 20  out" until.** a 
17260 6c 69 6e 65 20 69 73 20 73 65 65 6e 20 77 68 69  line is seen whi
17270 63 68 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  ch begins with "
17280 25 25 22 2e 20 20 54 68 65 20 6c 69 6e 65 20 6e  %%".  The line n
17290 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72 61 63  umber is.** trac
172a0 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e 61  ked..**.** if na
172b0 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e 79 20  me!=0, then any 
172c0 77 6f 72 64 20 74 68 61 74 20 62 65 67 69 6e 20  word that begin 
172d0 77 69 74 68 20 22 50 61 72 73 65 22 20 69 73 20  with "Parse" is 
172e0 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20 62 65  changed to.** be
172f0 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65 20 69  gin with *name i
17300 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49 56 41  nstead..*/.PRIVA
17310 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 78 66 65  TE void tplt_xfe
17320 72 28 63 68 61 72 20 2a 6e 61 6d 65 2c 20 46 49  r(char *name, FI
17330 4c 45 20 2a 69 6e 2c 20 46 49 4c 45 20 2a 6f 75  LE *in, FILE *ou
17340 74 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a  t, int *lineno).
17350 7b 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72  {.  int i, iStar
17360 74 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c  t;.  char line[L
17370 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c  INESIZE];.  whil
17380 65 28 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49  e( fgets(line,LI
17390 4e 45 53 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c  NESIZE,in) && (l
173a0 69 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c  ine[0]!='%' || l
173b0 69 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a  ine[1]!='%') ){.
173c0 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
173d0 0a 20 20 20 20 69 53 74 61 72 74 20 3d 20 30 3b  .    iStart = 0;
173e0 0a 20 20 20 20 69 66 28 20 6e 61 6d 65 20 29 7b  .    if( name ){
173f0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
17400 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  line[i]; i++){. 
17410 20 20 20 20 20 20 20 69 66 28 20 6c 69 6e 65 5b         if( line[
17420 69 5d 3d 3d 27 50 27 20 26 26 20 73 74 72 6e 63  i]=='P' && strnc
17430 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72  mp(&line[i],"Par
17440 73 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20  se",5)==0.      
17450 20 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20      && (i==0 || 
17460 21 69 73 61 6c 70 68 61 28 6c 69 6e 65 5b 69 2d  !isalpha(line[i-
17470 31 5d 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  1])).        ){.
17480 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
17490 69 53 74 61 72 74 20 29 20 66 70 72 69 6e 74 66  iStart ) fprintf
174a0 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53  (out,"%.*s",i-iS
174b0 74 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72  tart,&line[iStar
174c0 74 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  t]);.          f
174d0 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
174e0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
174f0 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20   i += 4;.       
17500 20 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b     iStart = i+1;
17510 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17520 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72   }.    }.    fpr
17530 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c  intf(out,"%s",&l
17540 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20  ine[iStart]);.  
17550 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74  }.}../* The next
17560 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
17570 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
17580 65 20 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20  e and opens it, 
17590 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70  returning.** a p
175a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 70  ointer to the op
175b0 65 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52  ened file. */.PR
175c0 49 56 41 54 45 20 46 49 4c 45 20 2a 74 70 6c 74  IVATE FILE *tplt
175d0 5f 6f 70 65 6e 28 73 74 72 75 63 74 20 6c 65 6d  _open(struct lem
175e0 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74  on *lemp).{.  st
175f0 61 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61  atic char templa
17600 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70  tename[] = "lemp
17610 61 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75  ar.c";.  char bu
17620 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20  f[1000];.  FILE 
17630 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c  *in;.  char *tpl
17640 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63  tname;.  char *c
17650 70 3b 0a 0a 20 20 2f 2a 20 66 69 72 73 74 2c 20  p;..  /* first, 
17660 73 65 65 20 69 66 20 75 73 65 72 20 73 70 65 63  see if user spec
17670 69 66 69 65 64 20 61 20 74 65 6d 70 6c 61 74 65  ified a template
17680 20 66 69 6c 65 6e 61 6d 65 20 6f 6e 20 74 68 65   filename on the
17690 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 2a   command line. *
176a0 2f 0a 20 20 69 66 20 28 75 73 65 72 5f 74 65 6d  /.  if (user_tem
176b0 70 6c 61 74 65 6e 61 6d 65 20 21 3d 20 30 29 20  platename != 0) 
176c0 7b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73  {.    if( access
176d0 28 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61  (user_templatena
176e0 6d 65 2c 30 30 34 29 3d 3d 2d 31 20 29 7b 0a 20  me,004)==-1 ){. 
176f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
17700 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20  err,"Can't find 
17710 74 68 65 20 70 61 72 73 65 72 20 64 72 69 76 65  the parser drive
17720 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20  r template file 
17730 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20  \"%s\".\n",.    
17740 20 20 20 20 75 73 65 72 5f 74 65 6d 70 6c 61 74      user_templat
17750 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65  ename);.      le
17760 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
17770 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
17780 20 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66      }.    in = f
17790 6f 70 65 6e 28 75 73 65 72 5f 74 65 6d 70 6c 61  open(user_templa
177a0 74 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20  tename,"rb");.  
177b0 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
177c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
177d0 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  err,"Can't open 
177e0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
177f0 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 75 73 65  e \"%s\".\n",use
17800 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  r_templatename);
17810 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  .      lemp->err
17820 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72  orcnt++;.      r
17830 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
17840 20 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 20 20     return in;.  
17850 7d 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  }..  cp = strrch
17860 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  r(lemp->filename
17870 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20  ,'.');.  if( cp 
17880 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62  ){.    sprintf(b
17890 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e  uf,"%.*s.lt",(in
178a0 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65  t)(cp-lemp->file
178b0 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65  name),lemp->file
178c0 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
178d0 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c      sprintf(buf,
178e0 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69  "%s.lt",lemp->fi
178f0 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  lename);.  }.  i
17900 66 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30  f( access(buf,00
17910 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c  4)==0 ){.    tpl
17920 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d  tname = buf;.  }
17930 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28  else if( access(
17940 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34  templatename,004
17950 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
17960 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e  name = templaten
17970 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
17980 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74    tpltname = pat
17990 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72  hsearch(lemp->ar
179a0 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  gv0,templatename
179b0 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  ,0);.  }.  if( t
179c0 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  pltname==0 ){.  
179d0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
179e0 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65  ,"Can't find the
179f0 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74   parser driver t
17a00 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
17a10 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d  s\".\n",.    tem
17a20 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20  platename);.    
17a30 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
17a40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
17a50 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e    }.  in = fopen
17a60 28 74 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b  (tpltname,"rb");
17a70 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
17a80 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17a90 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
17aa0 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
17ab0 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70   \"%s\".\n",temp
17ac0 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
17ad0 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
17ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
17af0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a   }.  return in;.
17b00 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c  }../* Print a #l
17b10 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 6c 69  ine directive li
17b20 6e 65 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ne to the output
17b30 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54   file. */.PRIVAT
17b40 45 20 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65  E void tplt_line
17b50 64 69 72 28 46 49 4c 45 20 2a 6f 75 74 2c 20 69  dir(FILE *out, i
17b60 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 68 61 72 20  nt lineno, char 
17b70 2a 66 69 6c 65 6e 61 6d 65 29 0a 7b 0a 20 20 66  *filename).{.  f
17b80 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e  printf(out,"#lin
17b90 65 20 25 64 20 5c 22 22 2c 6c 69 6e 65 6e 6f 29  e %d \"",lineno)
17ba0 3b 0a 20 20 77 68 69 6c 65 28 20 2a 66 69 6c 65  ;.  while( *file
17bb0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66 28 20  name ){.    if( 
17bc0 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d 20 27 5c 5c  *filename == '\\
17bd0 27 20 29 20 70 75 74 63 28 27 5c 5c 27 2c 6f 75  ' ) putc('\\',ou
17be0 74 29 3b 0a 20 20 20 20 70 75 74 63 28 2a 66 69  t);.    putc(*fi
17bf0 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a 20 20 20  lename,out);.   
17c00 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a 20 20 7d   filename++;.  }
17c10 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
17c20 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72  \"\n");.}../* Pr
17c30 69 6e 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20  int a string to 
17c40 74 68 65 20 66 69 6c 65 20 61 6e 64 20 6b 65 65  the file and kee
17c50 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72  p the linenumber
17c60 20 75 70 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50   up to date */.P
17c70 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
17c80 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 6f 75 74  _print(FILE *out
17c90 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  , struct lemon *
17ca0 6c 65 6d 70 2c 20 63 68 61 72 20 2a 73 74 72 2c  lemp, char *str,
17cb0 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 29 0a 7b 0a   int *lineno).{.
17cc0 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29 20 72    if( str==0 ) r
17cd0 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
17ce0 2a 73 74 72 20 29 7b 0a 20 20 20 20 70 75 74 63  *str ){.    putc
17cf0 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20 20 20 20  (*str,out);.    
17d00 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29  if( *str=='\n' )
17d10 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
17d20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69    str++;.  }.  i
17d30 66 28 20 73 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27  f( str[-1]!='\n'
17d40 20 29 7b 0a 20 20 20 20 70 75 74 63 28 27 5c 6e   ){.    putc('\n
17d50 27 2c 6f 75 74 29 3b 0a 20 20 20 20 28 2a 6c 69  ',out);.    (*li
17d60 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a 20 20 69  neno)++;.  }.  i
17d70 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f (!lemp->noline
17d80 6e 6f 73 66 6c 61 67 29 20 7b 0a 20 20 20 20 28  nosflag) {.    (
17d90 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74  *lineno)++; tplt
17da0 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69  _linedir(out,*li
17db0 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
17dc0 6d 65 29 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75  me); .  }.  retu
17dd0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rn;.}../*.** The
17de0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
17df0 6e 65 20 65 6d 69 74 73 20 63 6f 64 65 20 66 6f  ne emits code fo
17e00 72 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  r the destructor
17e10 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62   for the.** symb
17e20 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d  ol sp.*/.void em
17e30 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
17e40 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  de(.  FILE *out,
17e50 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
17e60 20 2a 73 70 2c 0a 20 20 73 74 72 75 63 74 20 6c   *sp,.  struct l
17e70 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e  emon *lemp,.  in
17e80 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 68  t *lineno.){. ch
17e90 61 72 20 2a 63 70 20 3d 20 30 3b 0a 0a 20 69 66  ar *cp = 0;.. if
17ea0 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( sp->type==TERM
17eb0 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20  INAL ){.   cp = 
17ec0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b  lemp->tokendest;
17ed0 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20  .   if( cp==0 ) 
17ee0 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e  return;.   fprin
17ef0 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28  tf(out,"{\n"); (
17f00 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c  *lineno)++;. }el
17f10 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72  se if( sp->destr
17f20 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d  uctor ){.   cp =
17f30 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b   sp->destructor;
17f40 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
17f50 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f  "{\n"); (*lineno
17f60 29 2b 2b 3b 0a 20 20 20 69 66 20 28 21 6c 65 6d  )++;.   if (!lem
17f70 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
17f80 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ) { (*lineno)++;
17f90 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75   tplt_linedir(ou
17fa0 74 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f  t,sp->destLineno
17fb0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
17fc0 3b 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28 20 6c  ; }. }else if( l
17fd0 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a  emp->vardest ){.
17fe0 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61     cp = lemp->va
17ff0 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70  rdest;.   if( cp
18000 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
18010 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c   fprintf(out,"{\
18020 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
18030 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73 73  ;. }else{.   ass
18040 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61  ert( 0 );  /* Ca
18050 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20  nnot happen */. 
18060 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70  }. for(; *cp; cp
18070 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d  ++){.   if( *cp=
18080 3d 27 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='$' && cp[1]=='
18090 24 27 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e  $' ){.     fprin
180a0 74 66 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f  tf(out,"(yypmino
180b0 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74  r->yy%d)",sp->dt
180c0 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b  num);.     cp++;
180d0 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a  .     continue;.
180e0 20 20 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d     }.   if( *cp=
180f0 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f  ='\n' ) (*lineno
18100 29 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28 2a 63  )++;.   fputc(*c
18110 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70 72 69  p,out);. }. fpri
18120 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 28  ntf(out,"\n"); (
18130 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69 66 20  *lineno)++;. if 
18140 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
18150 73 66 6c 61 67 29 20 7b 20 0a 20 20 20 28 2a 6c  sflag) { .   (*l
18160 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c  ineno)++; tplt_l
18170 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65  inedir(out,*line
18180 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  no,lemp->outname
18190 29 3b 20 0a 20 7d 0a 20 66 70 72 69 6e 74 66 28  ); . }. fprintf(
181a0 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c 69  out,"}\n"); (*li
181b0 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75 72 6e  neno)++;. return
181c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
181d0 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
181e0 29 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  ) if the given s
181f0 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65 73 74  ymbol has a dest
18200 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68  ructor..*/.int h
18210 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 73 74  as_destructor(st
18220 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
18230 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c   struct lemon *l
18240 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 72 65 74  emp).{.  int ret
18250 3b 0a 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65  ;.  if( sp->type
18260 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
18270 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f    ret = lemp->to
18280 6b 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65  kendest!=0;.  }e
18290 6c 73 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c  lse{.    ret = l
182a0 65 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20  emp->vardest!=0 
182b0 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  || sp->destructo
182c0 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r!=0;.  }.  retu
182d0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
182e0 20 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20   Append text to 
182f0 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  a dynamically al
18300 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67 2e 20  located string. 
18310 20 49 66 20 7a 54 65 78 74 20 69 73 20 30 20 74   If zText is 0 t
18320 68 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  hen.** reset the
18330 20 73 74 72 69 6e 67 20 74 6f 20 62 65 20 65 6d   string to be em
18340 70 74 79 20 61 67 61 69 6e 2e 20 20 41 6c 77 61  pty again.  Alwa
18350 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f  ys return the co
18360 6d 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f  mplete text.** o
18370 66 20 74 68 65 20 73 74 72 69 6e 67 20 28 77 68  f the string (wh
18380 69 63 68 20 69 73 20 6f 76 65 72 77 72 69 74 74  ich is overwritt
18390 65 6e 20 77 69 74 68 20 65 61 63 68 20 63 61 6c  en with each cal
183a0 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65  l)..**.** n byte
183b0 73 20 6f 66 20 7a 54 65 78 74 20 61 72 65 20 73  s of zText are s
183c0 74 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20  tored.  If n==0 
183d0 74 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78  then all of zTex
183e0 74 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  t up to the firs
183f0 74 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e  t.** \000 termin
18400 61 74 6f 72 20 69 73 20 73 74 6f 72 65 64 2e 20  ator is stored. 
18410 20 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e 74 61   zText can conta
18420 69 6e 20 75 70 20 74 6f 20 74 77 6f 20 69 6e 73  in up to two ins
18430 74 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e  tances of.** %d.
18440 20 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20    The values of 
18450 70 31 20 61 6e 64 20 70 32 20 61 72 65 20 77 72  p1 and p2 are wr
18460 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 66  itten into the f
18470 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a  irst and second.
18480 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ** %d..**.** If 
18490 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  n==-1, then the 
184a0 70 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74  previous charact
184b0 65 72 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  er is overwritte
184c0 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  n..*/.PRIVATE ch
184d0 61 72 20 2a 61 70 70 65 6e 64 5f 73 74 72 28 63  ar *append_str(c
184e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
184f0 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70 31 2c  , int n, int p1,
18500 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74 61 74   int p2){.  stat
18510 69 63 20 63 68 61 72 20 65 6d 70 74 79 5b 31 5d  ic char empty[1]
18520 20 3d 20 7b 20 30 20 7d 3b 0a 20 20 73 74 61 74   = { 0 };.  stat
18530 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  ic char *z = 0;.
18540 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c    static int all
18550 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74 61 74  oced = 0;.  stat
18560 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20 30 3b  ic int used = 0;
18570 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61 72  .  int c;.  char
18580 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20 20 69 66 28   zInt[40];.  if(
18590 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20   zText==0 ){.   
185a0 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20 20 72   used = 0;.    r
185b0 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20 69  eturn z;.  }.  i
185c0 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 69  f( n<=0 ){.    i
185d0 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( n<0 ){.      
185e0 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  used += n;.     
185f0 20 61 73 73 65 72 74 28 20 75 73 65 64 3e 3d 30   assert( used>=0
18600 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   );.    }.    n 
18610 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 54  = lemonStrlen(zT
18620 65 78 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ext);.  }.  if( 
18630 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32  n+sizeof(zInt)*2
18640 2b 75 73 65 64 20 3e 3d 20 61 6c 6c 6f 63 65 64  +used >= alloced
18650 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20   ){.    alloced 
18660 3d 20 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e  = n + sizeof(zIn
18670 74 29 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30  t)*2 + used + 20
18680 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  0;.    z = (char
18690 20 2a 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20   *) realloc(z,  
186a0 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20  alloced);.  }.  
186b0 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
186c0 6e 20 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65  n empty;.  while
186d0 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
186e0 20 63 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b   c = *(zText++);
186f0 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20  .    if( c=='%' 
18700 26 26 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b  && n>0 && zText[
18710 30 5d 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20  0]=='d' ){.     
18720 20 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22   sprintf(zInt, "
18730 25 64 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20  %d", p1);.      
18740 70 31 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 73  p1 = p2;.      s
18750 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20  trcpy(&z[used], 
18760 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65  zInt);.      use
18770 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  d += lemonStrlen
18780 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20  (&z[used]);.    
18790 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20    zText++;.     
187a0 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   n--;.    }else{
187b0 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d  .      z[used++]
187c0 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = c;.    }.  }.
187d0 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20    z[used] = 0;. 
187e0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
187f0 0a 2a 2a 20 7a 43 6f 64 65 20 69 73 20 61 20 73  .** zCode is a s
18800 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 74 68  tring that is th
18810 65 20 61 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  e action associa
18820 74 65 64 20 77 69 74 68 20 61 20 72 75 6c 65 2e  ted with a rule.
18830 20 20 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20    Expand.** the 
18840 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73 20  symbols in this 
18850 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 74  string so that t
18860 68 65 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d  he refer to elem
18870 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 72 73  ents of the pars
18880 65 72 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a  er.** stack..*/.
18890 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 72 61  PRIVATE void tra
188a0 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75  nslate_code(stru
188b0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
188c0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29  struct rule *rp)
188d0 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78  {.  char *cp, *x
188e0 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
188f0 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20  ar lhsused = 0; 
18900 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
18910 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61  e LHS element ha
18920 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
18930 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48   char used[MAXRH
18940 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  S];   /* True fo
18950 72 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65  r each RHS eleme
18960 6e 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64  nt which is used
18970 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */..  for(i=0; 
18980 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
18990 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20   used[i] = 0;.  
189a0 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  lhsused = 0;..  
189b0 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
189c0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
189d0 61 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d  ar newlinestr[2]
189e0 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20   = { '\n', '\0' 
189f0 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20  };.    rp->code 
18a00 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20  = newlinestr;.  
18a10 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d    rp->line = rp-
18a20 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a  >ruleline;.  }..
18a30 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30    append_str(0,0
18a40 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ,0,0);..  /* Thi
18a50 73 20 63 6f 6e 73 74 20 63 61 73 74 20 69 73 20  s const cast is 
18a60 77 72 6f 6e 67 20 62 75 74 20 68 61 72 6d 6c 65  wrong but harmle
18a70 73 73 2c 20 69 66 20 77 65 27 72 65 20 63 61 72  ss, if we're car
18a80 65 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28 63  eful. */.  for(c
18a90 70 3d 28 63 68 61 72 20 2a 29 72 70 2d 3e 63 6f  p=(char *)rp->co
18aa0 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a  de; *cp; cp++){.
18ab0 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28      if( isalpha(
18ac0 2a 63 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d  *cp) && (cp==rp-
18ad0 3e 63 6f 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e  >code || (!isaln
18ae0 75 6d 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70  um(cp[-1]) && cp
18af0 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20  [-1]!='_')) ){. 
18b00 20 20 20 20 20 63 68 61 72 20 73 61 76 65 64 3b       char saved;
18b10 0a 20 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26  .      for(xp= &
18b20 63 70 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a  cp[1]; isalnum(*
18b30 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b  xp) || *xp=='_';
18b40 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61   xp++);.      sa
18b50 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20  ved = *xp;.     
18b60 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *xp = 0;.      
18b70 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
18b80 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
18b90 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29  ->lhsalias)==0 )
18ba0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
18bb0 5f 73 74 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f  _str("yygotomino
18bc0 72 2e 79 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68  r.yy%d",0,rp->lh
18bd0 73 2d 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20  s->dtnum,0);.   
18be0 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20       cp = xp;.  
18bf0 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20        lhsused = 
18c00 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
18c10 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
18c20 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
18c30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
18c40 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
18c50 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
18c60 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d  ->rhsalias[i])==
18c70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
18c80 20 69 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64   if( cp!=rp->cod
18c90 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27  e && cp[-1]=='@'
18ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
18cb0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75    /* If the argu
18cc0 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
18cd0 6f 72 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73  orm @X then subs
18ce0 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20  tituted.        
18cf0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b        ** the tok
18d00 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20  en number of X, 
18d10 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  not the value of
18d20 20 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   X */.          
18d30 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
18d40 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22  yymsp[%d].major"
18d50 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ,-1,i-rp->nrhs+1
18d60 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,0);.           
18d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18d80 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
18d90 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
18da0 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
18db0 20 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20      int dtnum;. 
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
18dd0 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
18de0 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
18df0 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
18e00 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  m = sp->subsym[0
18e10 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ]->dtnum;.      
18e20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
18e40 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d  tnum = sp->dtnum
18e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18e60 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
18e70 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73  append_str("yyms
18e80 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64  p[%d].minor.yy%d
18e90 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ",0,i-rp->nrhs+1
18ea0 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  , dtnum);.      
18eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18ec0 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
18ed0 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d           used[i]
18ee0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
18ef0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
18f00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
18f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70       }.      *xp
18f20 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a   = saved;.    }.
18f30 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63      append_str(c
18f40 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  p, 1, 0, 0);.  }
18f50 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a   /* End loop */.
18f60 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  /* Check to m
18f70 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c 48 53  ake sure the LHS
18f80 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a   has been used *
18f90 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61  /.  if( rp->lhsa
18fa0 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73 65 64  lias && !lhsused
18fb0 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
18fc0 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
18fd0 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
18fe0 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c      "Label \"%s\
18ff0 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22  " for \"%s(%s)\"
19000 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22   is never used."
19010 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  ,.        rp->lh
19020 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e  salias,rp->lhs->
19030 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  name,rp->lhsalia
19040 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  s);.    lemp->er
19050 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20  rorcnt++;.  }.. 
19060 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73   /* Generate des
19070 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72  tructor code for
19080 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69   RHS symbols whi
19090 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
190a0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75  in the.  ** redu
190b0 63 65 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72  ce code */.  for
190c0 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
190d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
190e0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
190f0 26 26 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20  && !used[i] ){. 
19100 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
19110 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
19120 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
19130 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72     "Label %s for
19140 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e   \"%s(%s)\" is n
19150 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20  ever used.",.   
19160 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
19170 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  s[i],rp->rhs[i]-
19180 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69  >name,rp->rhsali
19190 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65  as[i]);.      le
191a0 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
191b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70      }else if( rp
191c0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30  ->rhsalias[i]==0
191d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61   ){.      if( ha
191e0 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d  s_destructor(rp-
191f0 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b  >rhs[i],lemp) ){
19200 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f  .        append_
19210 73 74 72 28 22 20 20 79 79 5f 64 65 73 74 72 75  str("  yy_destru
19220 63 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25  ctor(yypParser,%
19230 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  d,&yymsp[%d].min
19240 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20  or);\n", 0,.    
19250 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
19260 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e  ]->index,i-rp->n
19270 72 68 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  rhs+1);.      }e
19280 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
19290 4e 6f 20 64 65 73 74 72 75 63 74 6f 72 20 64 65  No destructor de
192a0 66 69 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74  fined for this t
192b0 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  erm */.      }. 
192c0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
192d0 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63  p->code ){.    c
192e0 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30  p = append_str(0
192f0 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d  ,0,0,0);.    rp-
19300 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28  >code = Strsafe(
19310 63 70 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d  cp?cp:"");.  }.}
19320 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74  ../* .** Generat
19330 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
19340 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72  cutes when the r
19350 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75  ule "rp" is redu
19360 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74  ced.  Write.** t
19370 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22  he code to "out"
19380 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e  .  Make sure lin
19390 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d  eno stays up-to-
193a0 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  date..*/.PRIVATE
193b0 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28   void emit_code(
193c0 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20  .  FILE *out,.  
193d0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
193e0 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
193f0 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69  *lemp,.  int *li
19400 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20 63  neno.){. const c
19410 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65  har *cp;.. /* Ge
19420 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
19430 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  o the reduce act
19440 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  ion */. if( rp->
19450 63 6f 64 65 20 29 7b 0a 20 20 20 69 66 20 28 21  code ){.   if (!
19460 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  lemp->nolinenosf
19470 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29  lag) { (*lineno)
19480 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
19490 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65  (out,rp->line,le
194a0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 7d  mp->filename); }
194b0 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
194c0 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b  "{%s",rp->code);
194d0 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63  .   for(cp=rp->c
194e0 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b  ode; *cp; cp++){
194f0 0a 20 20 20 20 20 69 66 28 20 2a 63 70 3d 3d 27  .     if( *cp=='
19500 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
19510 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  +;.   } /* End l
19520 6f 6f 70 20 2a 2f 0a 20 20 20 66 70 72 69 6e 74  oop */.   fprint
19530 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a  f(out,"}\n"); (*
19540 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66  lineno)++;.   if
19550 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
19560 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65  osflag) { (*line
19570 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65  no)++; tplt_line
19580 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c  dir(out,*lineno,
19590 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20  lemp->outname); 
195a0 7d 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20  }. } /* End if( 
195b0 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20  rp->code ) */.. 
195c0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
195d0 20 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e   Print the defin
195e0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69  ition of the uni
195f0 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  on used for the 
19600 70 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74  parser's data st
19610 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69  ack..** This uni
19620 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c  on contains fiel
19630 64 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ds for every pos
19640 73 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20  sible data type 
19650 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e  for tokens.** an
19660 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20  d nonterminals. 
19670 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   In the process 
19680 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64  of computing and
19690 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a   printing this.*
196a0 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65  * union, also se
196b0 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  t the ".dtnum" f
196c0 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65  ield of every te
196d0 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65  rminal and nonte
196e0 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
196f0 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f  ..*/.void print_
19700 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46  stack_union(.  F
19710 49 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20  ILE *out,       
19720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19730 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20  e output stream 
19740 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  */.  struct lemo
19750 6e 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20  n *lemp,        
19760 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66   /* The main inf
19770 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
19780 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20  this parser */. 
19790 20 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20   int *plineno,  
197a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
197b0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  Pointer to the l
197c0 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
197d0 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20  int mhflag      
197e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
197f0 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e  rue if generatin
19800 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75  g makeheaders ou
19810 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tput */.){.  int
19820 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65   lineno = *pline
19830 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69  no;    /* The li
19840 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ne number of the
19850 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61   output */.  cha
19860 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20  r **types;      
19870 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68         /* A hash
19880 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79   table of dataty
19890 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72  pes */.  int arr
198a0 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  aysize;         
198b0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
198c0 65 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20  e "types" array 
198d0 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65  */.  int maxdtle
198e0 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f  ngth;          /
198f0 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68  * Maximum length
19900 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79   of any ".dataty
19910 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  pe" field. */.  
19920 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20  char *stddt;    
19930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
19940 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66  ndardized name f
19950 6f 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f  or a datatype */
19960 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20  .  int i,j;     
19970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19980 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
19990 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20 20 20  .  int hash;    
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
199b0 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20  For hashing the 
199c0 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a  name of a type *
199d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
199e0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  name;         /*
199f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   Name of the par
19a00 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ser */..  /* All
19a10 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
19a20 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64  lize types[] and
19a30 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b   allocate stddt[
19a40 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65  ] */.  arraysize
19a50 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   = lemp->nsymbol
19a60 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20   * 2;.  types = 
19a70 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20  (char**)calloc( 
19a80 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f  arraysize, sizeo
19a90 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 66 6f  f(char*) );.  fo
19aa0 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69  r(i=0; i<arraysi
19ab0 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69  ze; i++) types[i
19ac0 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65  ] = 0;.  maxdtle
19ad0 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20  ngth = 0;.  if( 
19ae0 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b  lemp->vartype ){
19af0 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68  .    maxdtlength
19b00 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c   = lemonStrlen(l
19b10 65 6d 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20  emp->vartype);. 
19b20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
19b30 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
19b40 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  ++){.    int len
19b50 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  ;.    struct sym
19b60 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
19b70 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
19b80 69 66 28 20 73 70 2d 3e 64 61 74 61 74 79 70 65  if( sp->datatype
19b90 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
19ba0 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53      len = lemonS
19bb0 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74 79  trlen(sp->dataty
19bc0 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e  pe);.    if( len
19bd0 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29 20 6d  >maxdtlength ) m
19be0 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e  axdtlength = len
19bf0 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20 3d 20  ;.  }.  stddt = 
19c00 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d  (char*)malloc( m
19c10 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31  axdtlength*2 + 1
19c20 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73 3d   );.  if( types=
19c30 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30 20 29  =0 || stddt==0 )
19c40 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
19c50 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
19c60 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  ory.\n");.    ex
19c70 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  it(1);.  }..  /*
19c80 20 42 75 69 6c 64 20 61 20 68 61 73 68 20 74 61   Build a hash ta
19c90 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73  ble of datatypes
19ca0 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  . The ".dtnum" f
19cb0 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d  ield of each sym
19cc0 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c  bol.  ** is fill
19cd0 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 20 68  ed in with the h
19ce0 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31  ash index plus 1
19cf0 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61  .  A ".dtnum" va
19d00 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a  lue of 0 is.  **
19d10 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e   used for termin
19d20 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20  al symbols.  If 
19d30 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66  there is no %def
19d40 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65  ault_type define
19d50 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73  d then.  ** 0 is
19d60 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68   also used as th
19d70 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66  e .dtnum value f
19d80 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20  or nonterminals 
19d90 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65  which do not spe
19da0 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61  cify.  ** a data
19db0 74 79 70 65 20 75 73 69 6e 67 20 74 68 65 20 25  type using the %
19dc0 74 79 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a  type directive..
19dd0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
19de0 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
19df0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
19e00 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
19e10 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
19e20 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20  .    char *cp;. 
19e30 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d     if( sp==lemp-
19e40 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20  >errsym ){.     
19e50 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72   sp->dtnum = arr
19e60 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20  aysize+1;.      
19e70 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
19e80 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
19e90 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c  !=NONTERMINAL ||
19ea0 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d   (sp->datatype==
19eb0 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79  0 && lemp->varty
19ec0 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  pe==0) ){.      
19ed0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20  sp->dtnum = 0;. 
19ee0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
19ef0 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70     }.    cp = sp
19f00 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20  ->datatype;.    
19f10 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d  if( cp==0 ) cp =
19f20 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a   lemp->vartype;.
19f30 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77      j = 0;.    w
19f40 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 63  hile( isspace(*c
19f50 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77  p) ) cp++;.    w
19f60 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64  hile( *cp ) stdd
19f70 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a  t[j++] = *cp++;.
19f80 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
19f90 26 20 69 73 73 70 61 63 65 28 73 74 64 64 74 5b  & isspace(stddt[
19fa0 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20  j-1]) ) j--;.   
19fb0 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20   stddt[j] = 0;. 
19fc0 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b     if( lemp->tok
19fd0 65 6e 74 79 70 65 20 26 26 20 73 74 72 63 6d 70  entype && strcmp
19fe0 28 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f  (stddt, lemp->to
19ff0 6b 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20  kentype)==0 ){. 
1a000 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
1a010 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
1a020 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61  ue;.    }.    ha
1a030 73 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  sh = 0;.    for(
1a040 6a 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a  j=0; stddt[j]; j
1a050 2b 2b 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20  ++){.      hash 
1a060 3d 20 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64  = hash*53 + stdd
1a070 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t[j];.    }.    
1a080 68 61 73 68 20 3d 20 28 68 61 73 68 20 26 20 30  hash = (hash & 0
1a090 78 37 66 66 66 66 66 66 66 29 25 61 72 72 61 79  x7fffffff)%array
1a0a0 73 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  size;.    while(
1a0b0 20 74 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a   types[hash] ){.
1a0c0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
1a0d0 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64  (types[hash],std
1a0e0 64 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dt)==0 ){.      
1a0f0 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61    sp->dtnum = ha
1a100 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  sh + 1;.        
1a110 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1a120 20 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20       hash++;.   
1a130 20 20 20 69 66 28 20 68 61 73 68 3e 3d 61 72 72     if( hash>=arr
1a140 61 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20  aysize ) hash = 
1a150 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1a160 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20   types[hash]==0 
1a170 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  ){.      sp->dtn
1a180 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20  um = hash + 1;. 
1a190 20 20 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d       types[hash]
1a1a0 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63   = (char*)malloc
1a1b0 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74  ( lemonStrlen(st
1a1c0 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20  ddt)+1 );.      
1a1d0 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d  if( types[hash]=
1a1e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
1a1f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75  rintf(stderr,"Ou
1a200 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29  t of memory.\n")
1a210 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31  ;.        exit(1
1a220 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a230 20 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61   strcpy(types[ha
1a240 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20  sh],stddt);.    
1a250 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e  }.  }..  /* Prin
1a260 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69  t out the defini
1a270 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54  tion of YYTOKENT
1a280 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54  YPE and YYMINORT
1a290 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20  YPE */.  name = 
1a2a0 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d  lemp->name ? lem
1a2b0 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65  p->name : "Parse
1a2c0 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70  ";.  lineno = *p
1a2d0 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68  lineno;.  if( mh
1a2e0 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28  flag ){ fprintf(
1a2f0 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41  out,"#if INTERFA
1a300 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  CE\n"); lineno++
1a310 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ; }.  fprintf(ou
1a320 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b  t,"#define %sTOK
1a330 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d  ENTYPE %s\n",nam
1a340 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b  e,.    lemp->tok
1a350 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b  entype?lemp->tok
1a360 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b  entype:"void*");
1a370 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
1a380 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69  ( mhflag ){ fpri
1a390 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c  ntf(out,"#endif\
1a3a0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
1a3b0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1a3c0 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c  typedef union {\
1a3d0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1a3e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1a3f0 69 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b  int yyinit;\n");
1a400 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1a410 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f  intf(out,"  %sTO
1a420 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c  KENTYPE yy0;\n",
1a430 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1a440 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
1a450 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20  raysize; i++){. 
1a460 20 20 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d     if( types[i]=
1a470 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1a480 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a490 20 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79    %s yy%d;\n",ty
1a4a0 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e  pes[i],i+1); lin
1a4b0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28  eno++;.    free(
1a4c0 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20  types[i]);.  }. 
1a4d0 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79   if( lemp->errsy
1a4e0 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20  m->useCnt ){.   
1a4f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1a500 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d  int yy%d;\n",lem
1a510 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d  p->errsym->dtnum
1a520 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1a530 0a 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a  .  free(stddt);.
1a540 20 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20    free(types);. 
1a550 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20   fprintf(out,"} 
1a560 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29  YYMINORTYPE;\n")
1a570 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70  ; lineno++;.  *p
1a580 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b  lineno = lineno;
1a590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a5a0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43   the name of a C
1a5b0 20 64 61 74 61 74 79 70 65 20 61 62 6c 65 20 74   datatype able t
1a5c0 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75  o represent valu
1a5d0 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77  es between.** lw
1a5e0 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75  r and upr, inclu
1a5f0 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sive..*/.static 
1a600 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69  const char *mini
1a610 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e  mum_size_type(in
1a620 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29 7b  t lwr, int upr){
1a630 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b  .  if( lwr>=0 ){
1a640 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35  .    if( upr<=25
1a650 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  5 ){.      retur
1a660 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n "unsigned char
1a670 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
1a680 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20   upr<65535 ){.  
1a690 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69      return "unsi
1a6a0 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b  gned short int";
1a6b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a6c0 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e    return "unsign
1a6d0 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20  ed int";.    }. 
1a6e0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1a6f0 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37  -127 && upr<=127
1a700 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22   ){.    return "
1a710 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20  signed char";.  
1a720 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
1a730 33 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37  32767 && upr<327
1a740 36 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  67 ){.    return
1a750 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73   "short";.  }els
1a760 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 69  e{.    return "i
1a770 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nt";.  }.}../*.*
1a780 2a 20 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e  * Each state con
1a790 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74  tains a set of t
1a7a0 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  oken transaction
1a7b0 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a   and a set of.**
1a7c0 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61   nonterminal tra
1a7d0 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  nsactions.  Each
1a7e0 20 6f 66 20 74 68 65 73 65 20 73 65 74 73 20 6d   of these sets m
1a7f0 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  akes an instance
1a800 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
1a810 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  wing structure. 
1a820 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65   An array of the
1a830 73 65 20 73 74 72 75 63 74 75 72 65 73 20 69 73  se structures is
1a840 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65   used.** to orde
1a850 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  r the creation o
1a860 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
1a870 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
1a880 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78  le..*/.struct ax
1a890 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73  set {.  struct s
1a8a0 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20  tate *stp;   /* 
1a8b0 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  A pointer to a s
1a8c0 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tate */.  int is
1a8d0 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tkn;           /
1a8e0 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f  * True to use to
1a8f0 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72  kens.  False for
1a900 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a   non-terminals *
1a910 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b  /.  int nAction;
1a920 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1a930 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f  er of actions */
1a940 0a 20 20 69 6e 74 20 69 4f 72 64 65 72 3b 20 20  .  int iOrder;  
1a950 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1a960 6e 61 6c 20 6f 72 64 65 72 20 6f 66 20 61 63 74  nal order of act
1a970 69 6f 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a  ion sets */.};..
1a980 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f  /*.** Compare to
1a990 20 61 78 73 65 74 20 73 74 72 75 63 74 75 72 65   axset structure
1a9a0 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75  s for sorting pu
1a9b0 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63  rposes.*/.static
1a9c0 20 69 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70 61   int axset_compa
1a9d0 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61  re(const void *a
1a9e0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29  , const void *b)
1a9f0 7b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74  {.  struct axset
1aa00 20 2a 70 31 20 3d 20 28 73 74 72 75 63 74 20 61   *p1 = (struct a
1aa10 78 73 65 74 2a 29 61 3b 0a 20 20 73 74 72 75 63  xset*)a;.  struc
1aa20 74 20 61 78 73 65 74 20 2a 70 32 20 3d 20 28 73  t axset *p2 = (s
1aa30 74 72 75 63 74 20 61 78 73 65 74 2a 29 62 3b 0a  truct axset*)b;.
1aa40 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70    int c;.  c = p
1aa50 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d  2->nAction - p1-
1aa60 3e 6e 41 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20  >nAction;.  if( 
1aa70 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20  c==0 ){.    c = 
1aa80 70 32 2d 3e 69 4f 72 64 65 72 20 2d 20 70 31 2d  p2->iOrder - p1-
1aa90 3e 69 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61  >iOrder;.  }.  a
1aaa0 73 73 65 72 74 28 20 63 21 3d 30 20 7c 7c 20 70  ssert( c!=0 || p
1aab0 31 3d 3d 70 32 20 29 3b 0a 20 20 72 65 74 75 72  1==p2 );.  retur
1aac0 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  n c;.}../*.** Wr
1aad0 69 74 65 20 74 65 78 74 20 6f 6e 20 22 6f 75 74  ite text on "out
1aae0 22 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  " that describes
1aaf0 20 74 68 65 20 72 75 6c 65 20 22 72 70 22 2e 0a   the rule "rp"..
1ab00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1ab10 72 69 74 65 52 75 6c 65 54 65 78 74 28 46 49 4c  riteRuleText(FIL
1ab20 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72  E *out, struct r
1ab30 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20  ule *rp){.  int 
1ab40 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  j;.  fprintf(out
1ab50 2c 22 25 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c  ,"%s ::=", rp->l
1ab60 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72  hs->name);.  for
1ab70 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73  (j=0; j<rp->nrhs
1ab80 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; j++){.    stru
1ab90 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1aba0 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20  rp->rhs[j];.    
1abb0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73  fprintf(out," %s
1abc0 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ", sp->name);.  
1abd0 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
1abe0 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
1abf0 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
1ac00 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73      for(k=1; k<s
1ac10 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29  p->nsubsym; k++)
1ac20 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1ac30 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e  f(out,"|%s",sp->
1ac40 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29  subsym[k]->name)
1ac50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ac60 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72    }.}.../* Gener
1ac70 61 74 65 20 43 20 73 6f 75 72 63 65 20 63 6f 64  ate C source cod
1ac80 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  e for the parser
1ac90 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 54   */.void ReportT
1aca0 61 62 6c 65 28 0a 20 20 73 74 72 75 63 74 20 6c  able(.  struct l
1acb0 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e  emon *lemp,.  in
1acc0 74 20 6d 68 66 6c 61 67 20 20 20 20 20 2f 2a 20  t mhflag     /* 
1acd0 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65  Output in makehe
1ace0 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20  aders format if 
1acf0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 46 49 4c  true */.){.  FIL
1ad00 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63  E *out, *in;.  c
1ad10 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
1ad20 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e  E];.  int  linen
1ad30 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  o;.  struct stat
1ad40 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
1ad50 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73   action *ap;.  s
1ad60 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
1ad70 20 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20    struct acttab 
1ad80 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20  *pActtab;.  int 
1ad90 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 63 6f  i, j, k, n;.  co
1ada0 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a  nst char *name;.
1adb0 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c    int mnTknOfst,
1adc0 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e   mxTknOfst;.  in
1add0 74 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e 74  t mnNtOfst, mxNt
1ade0 4f 66 73 74 3b 0a 20 20 73 74 72 75 63 74 20 61  Ofst;.  struct a
1adf0 78 73 65 74 20 2a 61 78 3b 0a 0a 20 20 69 6e 20  xset *ax;..  in 
1ae00 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70  = tplt_open(lemp
1ae10 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
1ae20 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20 3d   return;.  out =
1ae30 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
1ae40 22 2e 63 22 2c 22 77 62 22 29 3b 0a 20 20 69 66  ".c","wb");.  if
1ae50 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( out==0 ){.    
1ae60 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
1ae70 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69  return;.  }.  li
1ae80 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c 74  neno = 1;.  tplt
1ae90 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1aea0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1aeb0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1aec0 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63 6f 64   the include cod
1aed0 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 74  e, if any */.  t
1aee0 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1aef0 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65  mp,lemp->include
1af00 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66 28  ,&lineno);.  if(
1af10 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63   mhflag ){.    c
1af20 68 61 72 20 2a 6e 61 6d 65 20 3d 20 66 69 6c 65  har *name = file
1af30 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20  _makename(lemp, 
1af40 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72 69 6e  ".h");.    fprin
1af50 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75 64 65  tf(out,"#include
1af60 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 6e 61 6d 65   \"%s\"\n", name
1af70 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1af80 20 66 72 65 65 28 6e 61 6d 65 29 3b 0a 20 20 7d   free(name);.  }
1af90 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1afa0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1afb0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1afc0 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e 65 73  enerate #defines
1afd0 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20   for all tokens 
1afe0 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  */.  if( mhflag 
1aff0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
1b000 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20 66  r *prefix;.    f
1b010 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
1b020 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
1b030 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
1b040 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
1b050 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65  ix ) prefix = le
1b060 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  mp->tokenprefix;
1b070 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20  .    else       
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
1b090 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f  fix = "";.    fo
1b0a0 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
1b0b0 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
1b0c0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1b0d0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  t,"#define %s%-3
1b0e0 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78  0s %2d\n",prefix
1b0f0 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1b100 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
1b110 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1b120 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
1b130 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
1b140 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1b150 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1b160 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1b170 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1b180 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73 20  ate the defines 
1b190 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1b1a0 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45  ,"#define YYCODE
1b1b0 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
1b1c0 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1b1d0 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  e(0, lemp->nsymb
1b1e0 6f 6c 2b 31 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ol+1)); lineno++
1b1f0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1b200 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44  "#define YYNOCOD
1b210 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73  E %d\n",lemp->ns
1b220 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e  ymbol+1);  linen
1b230 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1b240 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43  ut,"#define YYAC
1b250 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a  TIONTYPE %s\n",.
1b260 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
1b270 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e  _type(0, lemp->n
1b280 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c  state+lemp->nrul
1b290 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  e+5));  lineno++
1b2a0 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69  ;.  if( lemp->wi
1b2b0 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 66 70  ldcard ){.    fp
1b2c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1b2d0 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20 25 64  ne YYWILDCARD %d
1b2e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70  \n",.       lemp
1b2f0 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65  ->wildcard->inde
1b300 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
1b310 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  }.  print_stack_
1b320 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26  union(out,lemp,&
1b330 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a  lineno,mhflag);.
1b340 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b350 23 69 66 6e 64 65 66 20 59 59 53 54 41 43 4b 44  #ifndef YYSTACKD
1b360 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  EPTH\n"); lineno
1b370 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
1b380 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20  stacksize ){.   
1b390 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1b3a0 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50  efine YYSTACKDEP
1b3b0 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73  TH %s\n",lemp->s
1b3c0 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65  tacksize);  line
1b3d0 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no++;.  }else{. 
1b3e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b3f0 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
1b400 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c  EPTH 100\n");  l
1b410 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
1b420 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e  printf(out, "#en
1b430 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
1b440 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  +;.  if( mhflag 
1b450 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1b460 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
1b470 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
1b480 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  .  }.  name = le
1b490 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
1b4a0 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
1b4b0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67  .  if( lemp->arg
1b4c0 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d   && lemp->arg[0]
1b4d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1b4e0 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c     i = lemonStrl
1b4f0 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a 20  en(lemp->arg);. 
1b500 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26     while( i>=1 &
1b510 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70 2d 3e  & isspace(lemp->
1b520 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b  arg[i-1]) ) i--;
1b530 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31  .    while( i>=1
1b540 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c 65 6d   && (isalnum(lem
1b550 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c 20  p->arg[i-1]) || 
1b560 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d  lemp->arg[i-1]==
1b570 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20  '_') ) i--;.    
1b580 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1b590 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c  fine %sARG_SDECL
1b5a0 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d   %s;\n",name,lem
1b5b0 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f  p->arg);  lineno
1b5c0 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1b5d0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1b5e0 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c  RG_PDECL ,%s\n",
1b5f0 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b  name,lemp->arg);
1b600 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1b610 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1b620 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48  fine %sARG_FETCH
1b630 20 25 73 20 3d 20 79 79 70 50 61 72 73 65 72 2d   %s = yypParser-
1b640 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  >%s\n",.        
1b650 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65           name,le
1b660 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61  mp->arg,&lemp->a
1b670 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  rg[i]);  lineno+
1b680 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1b690 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1b6a0 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72 73 65  G_STORE yypParse
1b6b0 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a 20  r->%s = %s\n",. 
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6d0 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  name,&lemp->arg[
1b6e0 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  i],&lemp->arg[i]
1b6f0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1b700 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
1b710 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1b720 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e  %sARG_SDECL\n",n
1b730 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ame);  lineno++;
1b740 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1b750 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1b760 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20  PDECL\n",name); 
1b770 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1b780 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1b790 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48 5c  ine %sARG_FETCH\
1b7a0 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
1b7b0 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1b7c0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1b7d0 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65  RG_STORE\n",name
1b7e0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1b7f0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1b800 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1b810 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
1b820 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70  neno++;.  }.  fp
1b830 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1b840 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64 5c 6e  ne YYNSTATE %d\n
1b850 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b  ",lemp->nstate);
1b860 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70    lineno++;.  fp
1b870 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1b880 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c 6e 22  ne YYNRULE %d\n"
1b890 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20  ,lemp->nrule);  
1b8a0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
1b8b0 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73  lemp->errsym->us
1b8c0 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69  eCnt ){.    fpri
1b8d0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b8e0 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25   YYERRORSYMBOL %
1b8f0 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  d\n",lemp->errsy
1b900 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69 6e 65  m->index);  line
1b910 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1b920 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1b930 59 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e  YERRSYMDT yy%d\n
1b940 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ",lemp->errsym->
1b950 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  dtnum);  lineno+
1b960 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d  +;.  }.  if( lem
1b970 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20  p->has_fallback 
1b980 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1b990 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46 41  ut,"#define YYFA
1b9a0 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c  LLBACK 1\n");  l
1b9b0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1b9c0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1b9d0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1b9e0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1b9f0 61 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ate the action t
1ba00 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73  able and its ass
1ba10 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20  ociates:.  **.  
1ba20 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  **  yy_action[] 
1ba30 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20         A single 
1ba40 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1ba50 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20   all actions..  
1ba60 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  **  yy_lookahead
1ba70 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20 63  []     A table c
1ba80 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
1ba90 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63 68  okahead for each
1baa0 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20   entry in.  **  
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55     yy_action.  U
1bad0 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 68 61  sed to detect ha
1bae0 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  sh collisions.. 
1baf0 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66   **  yy_shift_of
1bb00 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68  st[]    For each
1bb10 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
1bb20 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  et into yy_actio
1bb30 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20  n for.  **      
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1bb50 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c  hifting terminal
1bb60 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75  s..  **  yy_redu
1bb70 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20  ce_ofst[]   For 
1bb80 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20  each state, the 
1bb90 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61  offset into yy_a
1bba0 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20  ction for.  **  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d     shifting non-
1bbd0 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20  terminals after 
1bbe0 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20  a reduce..  **  
1bbf0 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20  yy_default[]    
1bc00 20 20 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f     Default actio
1bc10 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61 74 65  n for each state
1bc20 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  ..  */..  /* Com
1bc30 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 73  pute the actions
1bc40 20 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73 20 61   on all states a
1bc50 6e 64 20 63 6f 75 6e 74 20 74 68 65 6d 20 75 70  nd count them up
1bc60 20 2a 2f 0a 20 20 61 78 20 3d 20 28 73 74 72 75   */.  ax = (stru
1bc70 63 74 20 61 78 73 65 74 20 2a 29 20 63 61 6c 6c  ct axset *) call
1bc80 6f 63 28 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a  oc(lemp->nstate*
1bc90 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29  2, sizeof(ax[0])
1bca0 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29  );.  if( ax==0 )
1bcb0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
1bcc0 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69  derr,"malloc fai
1bcd0 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  led\n");.    exi
1bce0 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  t(1);.  }.  for(
1bcf0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1bd00 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
1bd10 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1bd20 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32  d[i];.    ax[i*2
1bd30 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ].stp = stp;.   
1bd40 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d   ax[i*2].isTkn =
1bd50 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e   1;.    ax[i*2].
1bd60 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e  nAction = stp->n
1bd70 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b 69  TknAct;.    ax[i
1bd80 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b  *2+1].stp = stp;
1bd90 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69  .    ax[i*2+1].i
1bda0 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78  sTkn = 0;.    ax
1bdb0 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20  [i*2+1].nAction 
1bdc0 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20  = stp->nNtAct;. 
1bdd0 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d   }.  mxTknOfst =
1bde0 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a   mnTknOfst = 0;.
1bdf0 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e    mxNtOfst = mnN
1be00 74 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  tOfst = 0;..  /*
1be10 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74   Compute the act
1be20 69 6f 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f  ion table.  In o
1be30 72 64 65 72 20 74 6f 20 74 72 79 20 74 6f 20 6b  rder to try to k
1be40 65 65 70 20 74 68 65 20 73 69 7a 65 20 6f 66 20  eep the size of 
1be50 74 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f 6e 20  the.  ** action 
1be60 74 61 62 6c 65 20 74 6f 20 61 20 6d 69 6e 69 6d  table to a minim
1be70 75 6d 2c 20 74 68 65 20 68 65 75 72 69 73 74 69  um, the heuristi
1be80 63 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68 65  c of placing the
1be90 20 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e 0a   largest action.
1bea0 20 20 2a 2a 20 73 65 74 73 20 66 69 72 73 74 20    ** sets first 
1beb0 69 73 20 75 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  is used..  */.  
1bec0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1bed0 3e 6e 73 74 61 74 65 2a 32 3b 20 69 2b 2b 29 20  >nstate*2; i++) 
1bee0 61 78 5b 69 5d 2e 69 4f 72 64 65 72 20 3d 20 69  ax[i].iOrder = i
1bef0 3b 0a 20 20 71 73 6f 72 74 28 61 78 2c 20 6c 65  ;.  qsort(ax, le
1bf00 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73 69  mp->nstate*2, si
1bf10 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78 73  zeof(ax[0]), axs
1bf20 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70  et_compare);.  p
1bf30 41 63 74 74 61 62 20 3d 20 61 63 74 74 61 62 5f  Acttab = acttab_
1bf40 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69  alloc();.  for(i
1bf50 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
1bf60 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41  te*2 && ax[i].nA
1bf70 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20  ction>0; i++){. 
1bf80 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73     stp = ax[i].s
1bf90 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78 5b 69  tp;.    if( ax[i
1bfa0 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20  ].isTkn ){.     
1bfb0 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1bfc0 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1bfd0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
1bfe0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
1bff0 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
1c000 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  >=lemp->ntermina
1c010 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1c020 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63        action = c
1c030 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1c040 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
1c050 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20   if( action<0 ) 
1c060 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1c070 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28    acttab_action(
1c080 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d  pActtab, ap->sp-
1c090 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b  >index, action);
1c0a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1c0b0 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61  tp->iTknOfst = a
1c0c0 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63  cttab_insert(pAc
1c0d0 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ttab);.      if(
1c0e0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d   stp->iTknOfst<m
1c0f0 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e  nTknOfst ) mnTkn
1c100 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  Ofst = stp->iTkn
1c110 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Ofst;.      if( 
1c120 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78  stp->iTknOfst>mx
1c130 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f  TknOfst ) mxTknO
1c140 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f  fst = stp->iTknO
1c150 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fst;.    }else{.
1c160 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70        for(ap=stp
1c170 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
1c180 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
1c190 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  int action;.    
1c1a0 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
1c1b0 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72  index<lemp->nter
1c1c0 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
1c1d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
1c1e0 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d  ->sp->index==lem
1c1f0 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e  p->nsymbol ) con
1c200 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1c210 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f  ction = compute_
1c220 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29  action(lemp, ap)
1c230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63  ;.        if( ac
1c240 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75  tion<0 ) continu
1c250 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61  e;.        actta
1c260 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62  b_action(pActtab
1c270 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c  , ap->sp->index,
1c280 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20   action);.      
1c290 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e 74  }.      stp->iNt
1c2a0 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e  Ofst = acttab_in
1c2b0 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20  sert(pActtab);. 
1c2c0 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e       if( stp->iN
1c2d0 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29  tOfst<mnNtOfst )
1c2e0 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d   mnNtOfst = stp-
1c2f0 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20 20  >iNtOfst;.      
1c300 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  if( stp->iNtOfst
1c310 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74  >mxNtOfst ) mxNt
1c320 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f  Ofst = stp->iNtO
1c330 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fst;.    }.  }. 
1c340 20 66 72 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a   free(ax);..  /*
1c350 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 61   Output the yy_a
1c360 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ction table */. 
1c370 20 6e 20 3d 20 61 63 74 74 61 62 5f 73 69 7a 65   n = acttab_size
1c380 28 70 41 63 74 74 61 62 29 3b 0a 20 20 66 70 72  (pActtab);.  fpr
1c390 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1c3a0 65 20 59 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e  e YY_ACTTAB_COUN
1c3b0 54 20 28 25 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c  T (%d)\n", n); l
1c3c0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1c3d0 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63  tf(out,"static c
1c3e0 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50  onst YYACTIONTYP
1c3f0 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20  E yy_action[] = 
1c400 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
1c410 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1c420 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
1c430 20 61 63 74 69 6f 6e 20 3d 20 61 63 74 74 61 62   action = acttab
1c440 5f 79 79 61 63 74 69 6f 6e 28 70 41 63 74 74 61  _yyaction(pActta
1c450 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 61  b, i);.    if( a
1c460 63 74 69 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e  ction<0 ) action
1c470 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20   = lemp->nstate 
1c480 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20  + lemp->nrule + 
1c490 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20  2;.    if( j==0 
1c4a0 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20  ) fprintf(out," 
1c4b0 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b  /* %5d */ ", i);
1c4c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1c4d0 2c 20 22 20 25 34 64 2c 22 2c 20 61 63 74 69 6f  , " %4d,", actio
1c4e0 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  n);.    if( j==9
1c4f0 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
1c500 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1c510 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
1c520 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
1c530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c540 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
1c550 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1c560 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1c570 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
1c580 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74  e yy_lookahead t
1c590 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
1c5a0 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f  f(out,"static co
1c5b0 6e 73 74 20 59 59 43 4f 44 45 54 59 50 45 20 79  nst YYCODETYPE y
1c5c0 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20  y_lookahead[] = 
1c5d0 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
1c5e0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
1c5f0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
1c600 20 6c 61 20 3d 20 61 63 74 74 61 62 5f 79 79 6c   la = acttab_yyl
1c610 6f 6f 6b 61 68 65 61 64 28 70 41 63 74 74 61 62  ookahead(pActtab
1c620 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 6c 61  , i);.    if( la
1c630 3c 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e  <0 ) la = lemp->
1c640 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28  nsymbol;.    if(
1c650 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28   j==0 ) fprintf(
1c660 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20  out," /* %5d */ 
1c670 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e  ", i);.    fprin
1c680 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c  tf(out, " %4d,",
1c690 20 6c 61 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d   la);.    if( j=
1c6a0 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1c6b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1c6c0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1c6d0 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1c6e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c6f0 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1c700 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1c710 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1c720 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1c730 74 68 65 20 79 79 5f 73 68 69 66 74 5f 6f 66 73  the yy_shift_ofs
1c740 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  t[] table */.  f
1c750 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1c760 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 55 53  fine YY_SHIFT_US
1c770 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20  E_DFLT (%d)\n", 
1c780 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c 69  mnTknOfst-1); li
1c790 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65  neno++;.  n = le
1c7a0 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68  mp->nstate;.  wh
1c7b0 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70  ile( n>0 && lemp
1c7c0 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69  ->sorted[n-1]->i
1c7d0 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  TknOfst==NO_OFFS
1c7e0 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69  ET ) n--;.  fpri
1c7f0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1c800 65 20 59 59 5f 53 48 49 46 54 5f 43 4f 55 4e 54  e YY_SHIFT_COUNT
1c810 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20   (%d)\n", n-1); 
1c820 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1c830 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1c840 65 20 59 59 5f 53 48 49 46 54 5f 4d 49 4e 20 20  e YY_SHIFT_MIN  
1c850 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f   (%d)\n", mnTknO
1c860 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
1c870 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c880 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54  #define YY_SHIFT
1c890 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c 20  _MAX   (%d)\n", 
1c8a0 6d 78 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65  mxTknOfst); line
1c8b0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1c8c0 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e  out, "static con
1c8d0 73 74 20 25 73 20 79 79 5f 73 68 69 66 74 5f 6f  st %s yy_shift_o
1c8e0 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20  fst[] = {\n", . 
1c8f0 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d           minimum
1c900 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e  _size_type(mnTkn
1c910 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73  Ofst-1, mxTknOfs
1c920 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  t)); lineno++;. 
1c930 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1c940 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
1c950 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c  fst;.    stp = l
1c960 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1c970 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e      ofst = stp->
1c980 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66  iTknOfst;.    if
1c990 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45  ( ofst==NO_OFFSE
1c9a0 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e  T ) ofst = mnTkn
1c9b0 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66  Ofst - 1;.    if
1c9c0 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
1c9d0 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
1c9e0 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
1c9f0 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
1ca00 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
1ca10 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20   j==9 || i==n-1 
1ca20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
1ca30 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e  (out, "\n"); lin
1ca40 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d  eno++;.      j =
1ca50 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1ca60 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
1ca70 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1ca80 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65  t, "};\n"); line
1ca90 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  no++;..  /* Outp
1caa0 75 74 20 74 68 65 20 79 79 5f 72 65 64 75 63 65  ut the yy_reduce
1cab0 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f  _ofst[] table */
1cac0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1cad0 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55  "#define YY_REDU
1cae0 43 45 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29  CE_USE_DFLT (%d)
1caf0 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31 29  \n", mnNtOfst-1)
1cb00 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20  ; lineno++;.  n 
1cb10 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a  = lemp->nstate;.
1cb20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
1cb30 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31  lemp->sorted[n-1
1cb40 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f  ]->iNtOfst==NO_O
1cb50 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66  FFSET ) n--;.  f
1cb60 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1cb70 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 43  fine YY_REDUCE_C
1cb80 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 2d  OUNT (%d)\n", n-
1cb90 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
1cba0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1cbb0 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
1cbc0 4d 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d  MIN   (%d)\n", m
1cbd0 6e 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f  nNtOfst); lineno
1cbe0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1cbf0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52  t, "#define YY_R
1cc00 45 44 55 43 45 5f 4d 41 58 20 20 20 28 25 64 29  EDUCE_MAX   (%d)
1cc10 5c 6e 22 2c 20 6d 78 4e 74 4f 66 73 74 29 3b 20  \n", mxNtOfst); 
1cc20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1cc30 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63  ntf(out, "static
1cc40 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 72 65 64   const %s yy_red
1cc50 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e  uce_ofst[] = {\n
1cc60 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6d 69  ", .          mi
1cc70 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
1cc80 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d 78 4e 74  mnNtOfst-1, mxNt
1cc90 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  Ofst)); lineno++
1cca0 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
1ccb0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
1ccc0 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20  t ofst;.    stp 
1ccd0 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1cce0 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74  ];.    ofst = st
1ccf0 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20  p->iNtOfst;.    
1cd00 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46  if( ofst==NO_OFF
1cd10 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e  SET ) ofst = mnN
1cd20 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20 69  tOfst - 1;.    i
1cd30 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
1cd40 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
1cd50 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
1cd60 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
1cd70 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  ", ofst);.    if
1cd80 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
1cd90 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1cda0 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
1cdb0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
1cdc0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1cdd0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
1cde0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
1cdf0 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
1ce00 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74  eno++;..  /* Out
1ce10 70 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  put the default 
1ce20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a  action table */.
1ce30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1ce40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41  static const YYA
1ce50 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 64 65 66  CTIONTYPE yy_def
1ce60 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20  ault[] = {\n"); 
1ce70 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20  lineno++;.  n = 
1ce80 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20  lemp->nstate;.  
1ce90 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1cea0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
1ceb0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
1cec0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
1ced0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1cee0 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
1cef0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1cf00 22 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44  " %4d,", stp->iD
1cf10 66 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  flt);.    if( j=
1cf20 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1cf30 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1cf40 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1cf50 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1cf60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cf70 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1cf80 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1cf90 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1cfa0 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  +;.  tplt_xfer(l
1cfb0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1cfc0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1cfd0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61   Generate the ta
1cfe0 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20  ble of fallback 
1cff0 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  tokens..  */.  i
1d000 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c  f( lemp->has_fal
1d010 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74  lback ){.    int
1d020 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72   mx = lemp->nter
1d030 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20 20 20 20 77  minal - 1;.    w
1d040 68 69 6c 65 28 20 6d 78 3e 30 20 26 26 20 6c 65  hile( mx>0 && le
1d050 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d  mp->symbols[mx]-
1d060 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 20  >fallback==0 ){ 
1d070 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20 66 6f 72 28  mx--; }.    for(
1d080 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29  i=0; i<=mx; i++)
1d090 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1d0a0 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d  ymbol *p = lemp-
1d0b0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1d0c0 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61     if( p->fallba
1d0d0 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
1d0e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1d0f0 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d     0,  /* %10s =
1d100 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c  > nothing */\n",
1d110 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20   p->name);.     
1d120 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d130 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
1d140 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e  %3d,  /* %10s =>
1d150 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61   %s */\n", p->fa
1d160 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20  llback->index,. 
1d170 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65           p->name
1d180 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e  , p->fallback->n
1d190 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1d1a0 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20      lineno++;.  
1d1b0 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78    }.  }.  tplt_x
1d1c0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20  fer(lemp->name, 
1d1d0 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f  in, out, &lineno
1d1e0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1d1f0 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
1d200 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 69  ning the symboli
1d210 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72 79 20  c name of every 
1d220 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f  symbol.  */.  fo
1d230 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1d240 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
1d250 20 20 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22    sprintf(line,"
1d260 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73  \"%s\",",lemp->s
1d270 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29  ymbols[i]->name)
1d280 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1d290 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65  t,"  %-15s",line
1d2a0 29 3b 0a 20 20 20 20 69 66 28 20 28 69 26 33 29  );.    if( (i&3)
1d2b0 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  ==3 ){ fprintf(o
1d2c0 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ut,"\n"); lineno
1d2d0 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20  ++; }.  }.  if( 
1d2e0 28 69 26 33 29 21 3d 30 20 29 7b 20 66 70 72 69  (i&3)!=0 ){ fpri
1d2f0 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c  ntf(out,"\n"); l
1d300 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c  ineno++; }.  tpl
1d310 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1d320 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1d330 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1d340 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
1d350 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74 72 69  ning a text stri
1d360 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
1d370 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c  s every.  ** rul
1d380 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73 65  e in the rule se
1d390 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  t of the grammar
1d3a0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
1d3b0 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  ion is used.  **
1d3c0 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52 45   when tracing RE
1d3d0 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20  DUCE actions..  
1d3e0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70  */.  for(i=0, rp
1d3f0 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
1d400 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b   rp=rp->next, i+
1d410 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
1d420 72 70 2d 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a  rp->index==i );.
1d430 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1d440 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c  " /* %3d */ \"",
1d450 20 69 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75   i);.    writeRu
1d460 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b  leText(out, rp);
1d470 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1d480 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ,"\",\n"); linen
1d490 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1d4a0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1d4b0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1d4c0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1d4d0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1d4e0 74 65 73 20 65 76 65 72 79 20 74 69 6d 65 20 61  tes every time a
1d4f0 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65   symbol is poppe
1d500 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
1d510 73 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f 63  stack while proc
1d520 65 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f 72  essing errors or
1d530 20 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69 6e   while destroyin
1d540 67 20 74 68 65 20 70 61 72 73 65 72 2e 20 0a 20  g the parser. . 
1d550 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f   ** (In other wo
1d560 72 64 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68  rds, generate th
1d570 65 20 25 64 65 73 74 72 75 63 74 6f 72 20 61 63  e %destructor ac
1d580 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66  tions).  */.  if
1d590 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  ( lemp->tokendes
1d5a0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63  t ){.    int onc
1d5b0 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e = 1;.    for(i
1d5c0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1d5d0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  bol; i++){.     
1d5e0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1d5f0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
1d600 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
1d610 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79   sp==0 || sp->ty
1d620 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63  pe!=TERMINAL ) c
1d630 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
1d640 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20  f( once ){.     
1d650 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1d660 22 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e  "      /* TERMIN
1d670 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f  AL Destructor */
1d680 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1d690 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30          once = 0
1d6a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d6b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1d6c0 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20   case %d: /* %s 
1d6d0 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78  */\n", sp->index
1d6e0 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e  , sp->name); lin
1d6f0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  eno++;.    }.   
1d700 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1d710 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d  ->nsymbol && lem
1d720 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74  p->symbols[i]->t
1d730 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69  ype!=TERMINAL; i
1d740 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c  ++);.    if( i<l
1d750 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a  emp->nsymbol ){.
1d760 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72        emit_destr
1d770 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c  uctor_code(out,l
1d780 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c  emp->symbols[i],
1d790 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
1d7a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1d7b0 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e  ,"      break;\n
1d7c0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1d7d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65    }.  }.  if( le
1d7e0 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20  mp->vardest ){. 
1d7f0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1d800 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20   *dflt_sp = 0;. 
1d810 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
1d820 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d830 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1d840 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
1d850 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1d860 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1d870 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30  .      if( sp==0
1d880 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45   || sp->type==TE
1d890 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20  RMINAL ||.      
1d8a0 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30      sp->index<=0
1d8b0 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74   || sp->destruct
1d8c0 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  or!=0 ) continue
1d8d0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
1d8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
1d8f0 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20  ntf(out, "      
1d900 2f 2a 20 44 65 66 61 75 6c 74 20 4e 4f 4e 2d 54  /* Default NON-T
1d910 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75 63 74  ERMINAL Destruct
1d920 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e  or */\n"); linen
1d930 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63  o++;.        onc
1d940 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
1d950 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1d960 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f  ,"    case %d: /
1d970 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e  * %s */\n", sp->
1d980 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29  index, sp->name)
1d990 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1d9a0 20 20 64 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a    dflt_sp = sp;.
1d9b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 66      }.    if( df
1d9c0 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20 20 20  lt_sp!=0 ){.    
1d9d0 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
1d9e0 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f  r_code(out,dflt_
1d9f0 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  sp,lemp,&lineno)
1da00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
1da10 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
1da20 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
1da30 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  o++;.  }.  for(i
1da40 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1da50 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
1da60 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1da70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
1da80 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 3d  [i];.    if( sp=
1da90 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d  =0 || sp->type==
1daa0 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e  TERMINAL || sp->
1dab0 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20 29 20  destructor==0 ) 
1dac0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70  continue;.    fp
1dad0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
1dae0 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
1daf0 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20  \n", sp->index, 
1db00 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  sp->name); linen
1db10 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  o++;..    /* Com
1db20 62 69 6e 65 20 64 75 70 6c 69 63 61 74 65 20 64  bine duplicate d
1db30 65 73 74 72 75 63 74 6f 72 73 20 69 6e 74 6f 20  estructors into 
1db40 61 20 73 69 6e 67 6c 65 20 63 61 73 65 20 2a 2f  a single case */
1db50 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
1db60 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  j<lemp->nsymbol;
1db70 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   j++){.      str
1db80 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 32 20  uct symbol *sp2 
1db90 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1dba0 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  j];.      if( sp
1dbb0 32 20 26 26 20 73 70 32 2d 3e 74 79 70 65 21 3d  2 && sp2->type!=
1dbc0 54 45 52 4d 49 4e 41 4c 20 26 26 20 73 70 32 2d  TERMINAL && sp2-
1dbd0 3e 64 65 73 74 72 75 63 74 6f 72 0a 20 20 20 20  >destructor.    
1dbe0 20 20 20 20 20 20 26 26 20 73 70 32 2d 3e 64 74        && sp2->dt
1dbf0 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20  num==sp->dtnum. 
1dc00 20 20 20 20 20 20 20 20 20 26 26 20 73 74 72 63           && strc
1dc10 6d 70 28 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  mp(sp->destructo
1dc20 72 2c 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f  r,sp2->destructo
1dc30 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  r)==0 ){.       
1dc40 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1dc50 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
1dc60 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s */\n",.       
1dc70 20 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 69            sp2->i
1dc80 6e 64 65 78 2c 20 73 70 32 2d 3e 6e 61 6d 65 29  ndex, sp2->name)
1dc90 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1dca0 20 20 20 20 20 73 70 32 2d 3e 64 65 73 74 72 75       sp2->destru
1dcb0 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ctor = 0;.      
1dcc0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69  }.    }..    emi
1dcd0 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
1dce0 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62  e(out,lemp->symb
1dcf0 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e  ols[i],lemp,&lin
1dd00 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  eno);.    fprint
1dd10 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65  f(out,"      bre
1dd20 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
1dd30 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
1dd40 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1dd50 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1dd60 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1dd70 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1dd80 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 70  s whenever the p
1dd90 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72  arser stack over
1dda0 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  flows */.  tplt_
1ddb0 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
1ddc0 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c  emp->overflow,&l
1ddd0 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
1dde0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1ddf0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1de00 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
1de10 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c 65  he table of rule
1de20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20   information .  
1de30 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  **.  ** Note: Th
1de40 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
1de50 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
1de60 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62 65   rules are numbe
1de70 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75 61  r.  ** sequentua
1de80 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  lly beginning wi
1de90 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  th 0..  */.  for
1dea0 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
1deb0 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
1dec0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1ded0 74 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c  t,"  { %d, %d },
1dee0 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64  \n",rp->lhs->ind
1def0 65 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69  ex,rp->nrhs); li
1df00 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
1df10 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1df20 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1df30 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1df40 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
1df50 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20 65  ecution during e
1df60 61 63 68 20 52 45 44 55 43 45 20 61 63 74 69 6f  ach REDUCE actio
1df70 6e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  n */.  for(rp=le
1df80 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1df90 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
1dfa0 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c  translate_code(l
1dfb0 65 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20  emp, rp);.  }.  
1dfc0 2f 2a 20 46 69 72 73 74 20 6f 75 74 70 75 74 20  /* First output 
1dfd0 72 75 6c 65 73 20 6f 74 68 65 72 20 74 68 61 6e  rules other than
1dfe0 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75   the default: ru
1dff0 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  le */.  for(rp=l
1e000 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
1e010 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
1e020 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
1e030 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
1e040 20 2f 2a 20 4f 74 68 65 72 20 72 75 6c 65 73 20   /* Other rules 
1e050 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 61 63  with the same ac
1e060 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tion */.    if( 
1e070 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f  rp->code==0 ) co
1e080 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1e090 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e  rp->code[0]=='\n
1e0a0 27 20 26 26 20 72 70 2d 3e 63 6f 64 65 5b 31 5d  ' && rp->code[1]
1e0b0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==0 ) continue; 
1e0c0 2f 2a 20 57 69 6c 6c 20 62 65 20 64 65 66 61 75  /* Will be defau
1e0d0 6c 74 3a 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e  lt: */.    fprin
1e0e0 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61  tf(out,"      ca
1e0f0 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 2d  se %d: /* ", rp-
1e100 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72 69  >index);.    wri
1e110 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
1e120 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  rp);.    fprintf
1e130 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20  (out, " */\n"); 
1e140 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f  lineno++;.    fo
1e150 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74 3b 20  r(rp2=rp->next; 
1e160 72 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e 6e 65  rp2; rp2=rp2->ne
1e170 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  xt){.      if( r
1e180 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f  p2->code==rp->co
1e190 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  de ){.        fp
1e1a0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1e1b0 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20   case %d: /* ", 
1e1c0 72 70 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  rp2->index);.   
1e1d0 20 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65       writeRuleTe
1e1e0 78 74 28 6f 75 74 2c 20 72 70 32 29 3b 0a 20 20  xt(out, rp2);.  
1e1f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1e200 74 2c 22 20 2a 2f 20 79 79 74 65 73 74 63 61 73  t," */ yytestcas
1e210 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b  e(yyruleno==%d);
1e220 5c 6e 22 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29  \n", rp2->index)
1e230 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1e240 20 20 20 20 72 70 32 2d 3e 63 6f 64 65 20 3d 20      rp2->code = 
1e250 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1e260 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f  .    emit_code(o
1e270 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65  ut,rp,lemp,&line
1e280 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  no);.    fprintf
1e290 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62 72  (out,"        br
1e2a0 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
1e2b0 2b 2b 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65  ++;.    rp->code
1e2c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46   = 0;.  }.  /* F
1e2d0 69 6e 61 6c 6c 79 2c 20 6f 75 74 70 75 74 20 74  inally, output t
1e2e0 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65  he default: rule
1e2f0 2e 20 20 57 65 20 63 68 6f 6f 73 65 20 61 73 20  .  We choose as 
1e300 74 68 65 20 64 65 66 61 75 6c 74 3a 20 61 6c 6c  the default: all
1e310 0a 20 20 2a 2a 20 65 6d 70 74 79 20 61 63 74 69  .  ** empty acti
1e320 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70 72 69 6e 74  ons. */.  fprint
1e330 66 28 6f 75 74 2c 22 20 20 20 20 20 20 64 65 66  f(out,"      def
1e340 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ault:\n"); linen
1e350 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72 70 3d 6c 65  o++;.  for(rp=le
1e360 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1e370 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
1e380 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
1e390 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e3a0 61 73 73 65 72 74 28 20 72 70 2d 3e 63 6f 64 65  assert( rp->code
1e3b0 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26 20 72 70 2d  [0]=='\n' && rp-
1e3c0 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20 29 3b 0a 20  >code[1]==0 );. 
1e3d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1e3e0 20 20 20 20 20 20 2f 2a 20 28 25 64 29 20 22 2c        /* (%d) ",
1e3f0 20 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20   rp->index);.   
1e400 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
1e410 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72  ut, rp);.    fpr
1e420 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 20 79  intf(out, " */ y
1e430 79 74 65 73 74 63 61 73 65 28 79 79 72 75 6c 65  ytestcase(yyrule
1e440 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 2d  no==%d);\n", rp-
1e450 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
1e460 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
1e470 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62 72  (out,"        br
1e480 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
1e490 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  ++;.  tplt_xfer(
1e4a0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1e4b0 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1e4c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1e4d0 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 69  which executes i
1e4e0 66 20 61 20 70 61 72 73 65 20 66 61 69 6c 73 20  f a parse fails 
1e4f0 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1e500 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66  out,lemp,lemp->f
1e510 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b  ailure,&lineno);
1e520 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1e530 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1e540 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1e550 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1e560 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
1e570 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20   a syntax error 
1e580 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74  occurs */.  tplt
1e590 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1e5a0 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e  lemp->error,&lin
1e5b0 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
1e5c0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1e5d0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1e5e0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1e5f0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1e600 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
1e610 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e 70   accepts its inp
1e620 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ut */.  tplt_pri
1e630 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1e640 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65 6e 6f  ->accept,&lineno
1e650 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
1e660 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1e670 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1e680 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69   Append any addi
1e690 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73  tion code the us
1e6a0 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20  er desires */.  
1e6b0 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1e6c0 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63  emp,lemp->extrac
1e6d0 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  ode,&lineno);.. 
1e6e0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66   fclose(in);.  f
1e6f0 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72 65  close(out);.  re
1e700 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  turn;.}../* Gene
1e710 72 61 74 65 20 61 20 68 65 61 64 65 72 20 66 69  rate a header fi
1e720 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  le for the parse
1e730 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74  r */.void Report
1e740 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c 65  Header(struct le
1e750 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 46  mon *lemp).{.  F
1e760 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20  ILE *out, *in;. 
1e770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 65   const char *pre
1e780 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65  fix;.  char line
1e790 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68  [LINESIZE];.  ch
1e7a0 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53  ar pattern[LINES
1e7b0 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  IZE];.  int i;..
1e7c0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
1e7d0 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69 78  nprefix ) prefix
1e7e0 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72   = lemp->tokenpr
1e7f0 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20 20 20  efix;.  else    
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e810 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 69  prefix = "";.  i
1e820 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  n = file_open(le
1e830 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29 3b 0a 20  mp,".h","rb");. 
1e840 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 66   if( in ){.    f
1e850 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=1; i<lemp->
1e860 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66 67 65  nterminal && fge
1e870 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45  ts(line,LINESIZE
1e880 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ,in); i++){.    
1e890 20 20 73 70 72 69 6e 74 66 28 70 61 74 74 65 72    sprintf(patter
1e8a0 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  n,"#define %s%-3
1e8b0 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78  0s %2d\n",prefix
1e8c0 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1e8d0 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
1e8e0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6c 69 6e    if( strcmp(lin
1e8f0 65 2c 70 61 74 74 65 72 6e 29 20 29 20 62 72 65  e,pattern) ) bre
1e900 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63  ak;.    }.    fc
1e910 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69 66  lose(in);.    if
1e920 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d  ( i==lemp->nterm
1e930 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  inal ){.      /*
1e940 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68   No change in th
1e950 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72  e file.  Don't r
1e960 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20  ewrite it. */.  
1e970 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1e980 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69  }.  }.  out = fi
1e990 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
1e9a0 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f  ","wb");.  if( o
1e9b0 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ut ){.    for(i=
1e9c0 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
1e9d0 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
1e9e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1e9f0 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
1ea00 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  2d\n",prefix,lem
1ea10 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
1ea20 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ame,i);.    }.  
1ea30 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20    fclose(out);  
1ea40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
1ea50 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20  ../* Reduce the 
1ea60 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69  size of the acti
1ea70 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f  on tables, if po
1ea80 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e  ssible, by makin
1ea90 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61  g use.** of defa
1eaa0 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ults..**.** In t
1eab0 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20  his version, we 
1eac0 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72  take the most fr
1ead0 65 71 75 65 6e 74 20 52 45 44 55 43 45 20 61 63  equent REDUCE ac
1eae0 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a  tion and make.**
1eaf0 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e   it the default.
1eb00 20 20 45 78 63 65 70 74 2c 20 74 68 65 72 65 20    Except, there 
1eb10 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 69 66  is no default if
1eb20 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f   the wildcard to
1eb30 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73  ken.** is a poss
1eb40 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e  ible look-ahead.
1eb50 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73  .*/.void Compres
1eb60 73 54 61 62 6c 65 73 28 73 74 72 75 63 74 20 6c  sTables(struct l
1eb70 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
1eb80 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
1eb90 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
1eba0 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 3b 0a 20 20  on *ap, *ap2;.  
1ebb0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
1ebc0 20 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20   *rp2, *rbest;. 
1ebd0 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20   int nbest, n;. 
1ebe0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 75 73   int i;.  int us
1ebf0 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20 20 66  esWildcard;..  f
1ec00 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1ec10 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
1ec20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
1ec30 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65  rted[i];.    nbe
1ec40 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 65 73  st = 0;.    rbes
1ec50 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65 73 57  t = 0;.    usesW
1ec60 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a 20 20  ildcard = 0;..  
1ec70 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1ec80 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1ec90 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
1eca0 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26  ->type==SHIFT &&
1ecb0 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77   ap->sp==lemp->w
1ecc0 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 20  ildcard ){.     
1ecd0 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20     usesWildcard 
1ece0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1ecf0 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21     if( ap->type!
1ed00 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e  =REDUCE ) contin
1ed10 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d 20 61  ue;.      rp = a
1ed20 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 69  p->x.rp;.      i
1ed30 66 28 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20  f( rp->lhsStart 
1ed40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ed50 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73 74 20    if( rp==rbest 
1ed60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ed70 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66    n = 1;.      f
1ed80 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b  or(ap2=ap->next;
1ed90 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e   ap2; ap2=ap2->n
1eda0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
1edb0 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52 45 44  ( ap2->type!=RED
1edc0 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UCE ) continue;.
1edd0 20 20 20 20 20 20 20 20 72 70 32 20 3d 20 61 70          rp2 = ap
1ede0 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 20  2->x.rp;.       
1edf0 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73 74 20   if( rp2==rbest 
1ee00 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1ee10 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 70 20      if( rp2==rp 
1ee20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ) n++;.      }. 
1ee30 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65 73 74       if( n>nbest
1ee40 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62 65 73   ){.        nbes
1ee50 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 72  t = n;.        r
1ee60 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20 20 20  best = rp;.     
1ee70 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f   }.    }. .    /
1ee80 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20  * Do not make a 
1ee90 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 6e  default if the n
1eea0 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20 74  umber of rules t
1eeb0 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  o default.    **
1eec0 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73 74   is not at least
1eed0 20 31 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c   1 or if the wil
1eee0 64 63 61 72 64 20 74 6f 6b 65 6e 20 69 73 20 61  dcard token is a
1eef0 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a   possible.    **
1ef00 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20   lookahead..    
1ef10 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62 65 73 74  */.    if( nbest
1ef20 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c 64 63 61  <1 || usesWildca
1ef30 72 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  rd ) continue;..
1ef40 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20  .    /* Combine 
1ef50 6d 61 74 63 68 69 6e 67 20 52 45 44 55 43 45 20  matching REDUCE 
1ef60 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73  actions into a s
1ef70 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f  ingle default */
1ef80 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
1ef90 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1efa0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1efb0 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
1efc0 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72  E && ap->x.rp==r
1efd0 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  best ) break;.  
1efe0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1eff0 61 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70  ap );.    ap->sp
1f000 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b   = Symbol_new("{
1f010 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20  default}");.    
1f020 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  for(ap=ap->next;
1f030 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1f040 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
1f050 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
1f060 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74   ap->x.rp==rbest
1f070 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f   ) ap->type = NO
1f080 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  T_USED;.    }.  
1f090 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69    stp->ap = Acti
1f0a0 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29  on_sort(stp->ap)
1f0b0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
1f0c0 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74  Compare two stat
1f0d0 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70  es for sorting p
1f0e0 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 73 6d  urposes.  The sm
1f0f0 61 6c 6c 65 72 20 73 74 61 74 65 20 69 73 20 74  aller state is t
1f100 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74  he.** one with t
1f110 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d  he most non-term
1f120 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49  inal actions.  I
1f130 66 20 74 68 65 79 20 68 61 76 65 20 74 68 65 20  f they have the 
1f140 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  same number.** o
1f150 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61  f non-terminal a
1f160 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65  ctions, then the
1f170 20 73 6d 61 6c 6c 65 72 20 69 73 20 74 68 65 20   smaller is the 
1f180 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73  one with the mos
1f190 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f  t.** token actio
1f1a0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
1f1b0 74 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d  t stateResortCom
1f1c0 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  pare(const void 
1f1d0 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *a, const void *
1f1e0 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  b){.  const stru
1f1f0 63 74 20 73 74 61 74 65 20 2a 70 41 20 3d 20 2a  ct state *pA = *
1f200 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74  (const struct st
1f210 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74  ate**)a;.  const
1f220 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70   struct state *p
1f230 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75  B = *(const stru
1f240 63 74 20 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20  ct state**)b;.  
1f250 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42  int n;..  n = pB
1f260 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e  ->nNtAct - pA->n
1f270 4e 74 41 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d  NtAct;.  if( n==
1f280 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d  0 ){.    n = pB-
1f290 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e  >nTknAct - pA->n
1f2a0 54 6b 6e 41 63 74 3b 0a 20 20 20 20 69 66 28 20  TknAct;.    if( 
1f2b0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 20  n==0 ){.      n 
1f2c0 3d 20 70 42 2d 3e 73 74 61 74 65 6e 75 6d 20 2d  = pB->statenum -
1f2d0 20 70 41 2d 3e 73 74 61 74 65 6e 75 6d 3b 0a 20   pA->statenum;. 
1f2e0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
1f2f0 74 28 20 6e 21 3d 30 20 29 3b 0a 20 20 72 65 74  t( n!=0 );.  ret
1f300 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
1f310 20 52 65 6e 75 6d 62 65 72 20 61 6e 64 20 72 65   Renumber and re
1f320 73 6f 72 74 20 73 74 61 74 65 73 20 73 6f 20 74  sort states so t
1f330 68 61 74 20 73 74 61 74 65 73 20 77 69 74 68 20  hat states with 
1f340 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a  fewer choices.**
1f350 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e   occur at the en
1f360 64 2e 20 20 45 78 63 65 70 74 2c 20 6b 65 65 70  d.  Except, keep
1f370 20 73 74 61 74 65 20 30 20 61 73 20 74 68 65 20   state 0 as the 
1f380 66 69 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a  first state..*/.
1f390 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74 65  void ResortState
1f3a0 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
1f3b0 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp).{.  int i;
1f3c0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
1f3d0 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *stp;.  struct a
1f3e0 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f  ction *ap;..  fo
1f3f0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1f400 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
1f410 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
1f420 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d  ted[i];.    stp-
1f430 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e  >nTknAct = stp->
1f440 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20 20 20  nNtAct = 0;.    
1f450 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 6c 65 6d  stp->iDflt = lem
1f460 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
1f470 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 73 74 70  ->nrule;.    stp
1f480 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f  ->iTknOfst = NO_
1f490 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d  OFFSET;.    stp-
1f4a0 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46  >iNtOfst = NO_OF
1f4b0 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70  FSET;.    for(ap
1f4c0 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
1f4d0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1f4e0 20 20 69 66 28 20 63 6f 6d 70 75 74 65 5f 61 63    if( compute_ac
1f4f0 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d 30  tion(lemp,ap)>=0
1f500 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1f510 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65  ap->sp->index<le
1f520 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b  mp->nterminal ){
1f530 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e  .          stp->
1f540 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20  nTknAct++;.     
1f550 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 2d     }else if( ap-
1f560 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
1f570 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20  >nsymbol ){.    
1f580 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63        stp->nNtAc
1f590 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
1f5a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
1f5b0 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f 6d 70 75  p->iDflt = compu
1f5c0 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20  te_action(lemp, 
1f5d0 61 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ap);.        }. 
1f5e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1f5f0 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70 2d 3e  .  qsort(&lemp->
1f600 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d 70 2d  sorted[1], lemp-
1f610 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a 65 6f  >nstate-1, sizeo
1f620 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30  f(lemp->sorted[0
1f630 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74 61 74  ]),.        stat
1f640 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 29 3b  eResortCompare);
1f650 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1f660 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
1f670 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f 72 74  {.    lemp->sort
1f680 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75 6d 20  ed[i]->statenum 
1f690 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a  = i;.  }.}.../**
1f6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1f6b0 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
1f6c0 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  et.c" **********
1f6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
1f6f0 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61 74 69  * Set manipulati
1f700 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  on routines for 
1f710 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
1f720 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
1f730 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a 65 20  static int size 
1f740 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65  = 0;../* Set the
1f750 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76 6f 69   set size */.voi
1f760 64 20 53 65 74 53 69 7a 65 28 69 6e 74 20 6e 29  d SetSize(int n)
1f770 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b 31 3b  .{.  size = n+1;
1f780 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  .}../* Allocate 
1f790 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63 68 61  a new set */.cha
1f7a0 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20 20 63  r *SetNew(){.  c
1f7b0 68 61 72 20 2a 73 3b 0a 20 20 73 20 3d 20 28 63  har *s;.  s = (c
1f7c0 68 61 72 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a  har*)calloc( siz
1f7d0 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 3d 3d  e, 1);.  if( s==
1f7e0 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  0 ){.    extern 
1f7f0 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
1f800 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f  r();.    memory_
1f810 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72  error();.  }.  r
1f820 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44  eturn s;.}../* D
1f830 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20  eallocate a set 
1f840 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65 65 28  */.void SetFree(
1f850 63 68 61 72 20 2a 73 29 0a 7b 0a 20 20 66 72 65  char *s).{.  fre
1f860 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  e(s);.}../* Add 
1f870 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1f880 20 74 68 65 20 73 65 74 2e 20 20 52 65 74 75 72   the set.  Retur
1f890 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 65 6c  n TRUE if the el
1f8a0 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64 0a  ement was added.
1f8b0 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  ** and FALSE if 
1f8c0 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20 74  it was already t
1f8d0 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74  here. */.int Set
1f8e0 41 64 64 28 63 68 61 72 20 2a 73 2c 20 69 6e 74  Add(char *s, int
1f8f0 20 65 29 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a   e).{.  int rv;.
1f900 20 20 61 73 73 65 72 74 28 20 65 3e 3d 30 20 26    assert( e>=0 &
1f910 26 20 65 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76  & e<size );.  rv
1f920 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20   = s[e];.  s[e] 
1f930 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 21 72  = 1;.  return !r
1f940 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65  v;.}../* Add eve
1f950 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32  ry element of s2
1f960 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72 6e 20   to s1.  Return 
1f970 54 52 55 45 20 69 66 20 73 31 20 63 68 61 6e 67  TRUE if s1 chang
1f980 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e  es. */.int SetUn
1f990 69 6f 6e 28 63 68 61 72 20 2a 73 31 2c 20 63 68  ion(char *s1, ch
1f9a0 61 72 20 2a 73 32 29 0a 7b 0a 20 20 69 6e 74 20  ar *s2).{.  int 
1f9b0 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 70  i, progress;.  p
1f9c0 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 66  rogress = 0;.  f
1f9d0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
1f9e0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 32  i++){.    if( s2
1f9f0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
1fa00 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69 5d  e;.    if( s1[i]
1fa10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ==0 ){.      pro
1fa20 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20  gress = 1;.     
1fa30 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20   s1[i] = 1;.    
1fa40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1fa50 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a  rogress;.}./****
1fa60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fa70 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
1fa80 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a   "table.c" *****
1fa90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1faa0 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
1fab0 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  ll code in this 
1fac0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75  file has been au
1fad0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
1fae0 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20  rated.** from a 
1faf0 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e  specification in
1fb00 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20   the file.**    
1fb10 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
1fb20 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73  .q".** by the as
1fb30 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1fb40 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72  code building pr
1fb50 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a  ogram "aagen"..*
1fb60 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68  * Do not edit th
1fb70 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61  is file!  Instea
1fb80 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63  d, edit the spec
1fb90 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  ification.** fil
1fba0 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61  e, then rerun aa
1fbb0 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  gen..*/./*.** Co
1fbc0 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  de for processin
1fbd0 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  g tables in the 
1fbe0 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
1fbf0 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56  erator..*/..PRIV
1fc00 41 54 45 20 69 6e 74 20 73 74 72 68 61 73 68 28  ATE int strhash(
1fc10 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 29 0a 7b  const char *x).{
1fc20 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20  .  int h = 0;.  
1fc30 77 68 69 6c 65 28 20 2a 78 29 20 68 20 3d 20 68  while( *x) h = h
1fc40 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20  *13 + *(x++);.  
1fc50 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
1fc60 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64 75  Works like strdu
1fc70 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61 76  p, sort of.  Sav
1fc80 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d 61  e a string in ma
1fc90 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62  lloced memory, b
1fca0 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e  ut.** keep strin
1fcb0 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73 6f  gs in a table so
1fcc0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73   that the same s
1fcd0 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20  tring is not in 
1fce0 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65  more.** than one
1fcf0 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73 74   place..*/.const
1fd00 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 28 63   char *Strsafe(c
1fd10 6f 6e 73 74 20 63 68 61 72 20 2a 79 29 0a 7b 0a  onst char *y).{.
1fd20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
1fd30 0a 20 20 63 68 61 72 20 2a 63 70 79 3b 0a 0a 20  .  char *cpy;.. 
1fd40 20 69 66 28 20 79 3d 3d 30 20 29 20 72 65 74 75   if( y==0 ) retu
1fd50 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53 74 72 73  rn 0;.  z = Strs
1fd60 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69  afe_find(y);.  i
1fd70 66 28 20 7a 3d 3d 30 20 26 26 20 28 63 70 79 3d  f( z==0 && (cpy=
1fd80 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20  (char *)malloc( 
1fd90 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79 29 2b 31  lemonStrlen(y)+1
1fda0 20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   ))!=0 ){.    st
1fdb0 72 63 70 79 28 63 70 79 2c 79 29 3b 0a 20 20 20  rcpy(cpy,y);.   
1fdc0 20 7a 20 3d 20 63 70 79 3b 0a 20 20 20 20 53 74   z = cpy;.    St
1fdd0 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b  rsafe_insert(z);
1fde0 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65  .  }.  MemoryChe
1fdf0 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ck(z);.  return 
1fe00 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  z;.}../* There i
1fe10 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1fe20 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1fe30 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
1fe40 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
1fe50 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
1fe60 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x1"..*/.struct 
1fe70 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x1 {.  int siz
1fe80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1fe90 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1fea0 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
1feb0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fed0 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
1fee0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
1fef0 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff10 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
1ff20 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
1ff30 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
1ff40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ff50 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
1ff60 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
1ff70 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62  uct s_x1node *tb
1ff80 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
1ff90 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
1ffa0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1ffb0 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
1ffc0 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
1ffd0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
1ffe0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1fff0 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
20000 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
20010 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
20020 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
20030 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
20040 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  1"..*/.typedef s
20050 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b  truct s_x1node {
20060 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
20070 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ata;        /* T
20080 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72  he data */.  str
20090 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65  uct s_x1node *ne
200a0 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
200b0 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
200c0 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
200d0 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72  ct s_x1node **fr
200e0 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
200f0 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64   link */.} x1nod
20100 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
20110 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
20120 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
20130 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
20140 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
20150 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78 31   struct s_x1 *x1
20160 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
20170 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
20180 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
20190 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 7b 0a  Strsafe_init(){.
201a0 20 20 69 66 28 20 78 31 61 20 29 20 72 65 74 75    if( x1a ) retu
201b0 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73 74 72  rn;.  x1a = (str
201c0 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63  uct s_x1*)malloc
201d0 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
201e0 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x1) );.  if( x
201f0 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73  1a ){.    x1a->s
20200 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
20210 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x1a->count = 0;.
20220 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28      x1a->tbl = (
20230 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20  x1node*)malloc( 
20240 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
20250 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
20260 78 31 6e 6f 64 65 2a 29 29 2a 31 30 32 34 20 29  x1node*))*1024 )
20270 3b 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e 74  ;.    if( x1a->t
20280 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
20290 72 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20 20  ree(x1a);.      
202a0 78 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x1a = 0;.    }el
202b0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
202c0 0a 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20 3d  .      x1a->ht =
202d0 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61   (x1node**)&(x1a
202e0 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20  ->tbl[1024]);.  
202f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
20300 30 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68  024; i++) x1a->h
20310 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
20320 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
20330 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
20340 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
20350 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
20360 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
20370 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
20380 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
20390 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
203a0 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72  nt Strsafe_inser
203b0 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 61  t(const char *da
203c0 74 61 29 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a  ta).{.  x1node *
203d0 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69  np;.  int h;.  i
203e0 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31  nt ph;..  if( x1
203f0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
20400 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28  .  ph = strhash(
20410 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20  data);.  h = ph 
20420 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x1a->size-1);
20430 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b  .  np = x1a->ht[
20440 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
20450 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
20460 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29  p(np->data,data)
20470 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
20480 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
20490 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
204a0 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
204b0 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
204c0 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
204d0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
204e0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
204f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
20500 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
20510 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74    if( x1a->count
20520 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x1a->size ){. 
20530 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
20540 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
20550 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
20560 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20  int i,size;.    
20570 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72 61  struct s_x1 arra
20580 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
20590 65 20 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d 3e  e = size = x1a->
205a0 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
205b0 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63  y.count = x1a->c
205c0 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
205d0 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d  tbl = (x1node*)m
205e0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69  alloc(.      (si
205f0 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73  zeof(x1node) + s
20600 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a  izeof(x1node*))*
20610 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  size );.    if( 
20620 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
20630 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
20640 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
20650 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
20660 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64  rray.ht = (x1nod
20670 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
20680 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  size]);.    for(
20690 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
206a0 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
206b0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
206c0 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x1a->count; i+
206d0 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64 65  +){.      x1node
206e0 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
206f0 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
20700 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x1a->tbl[i]);. 
20710 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68       h = strhash
20720 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20  (oldnp->data) & 
20730 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  (size-1);.      
20740 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
20750 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
20760 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
20770 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
20780 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
20790 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
207a0 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
207b0 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
207c0 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
207d0 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
207e0 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
207f0 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
20800 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
20810 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
20820 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a  free(x1a->tbl);.
20830 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79      *x1a = array
20840 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
20850 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
20860 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31  /.  h = ph & (x1
20870 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
20880 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31   = &(x1a->tbl[x1
20890 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
208a0 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
208b0 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68  .  if( x1a->ht[h
208c0 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x1a->ht[h]->
208d0 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
208e0 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
208f0 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x1a->ht[h];.  x
20900 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  1a->ht[h] = np;.
20910 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
20920 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  1a->ht[h]);.  re
20930 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
20940 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
20950 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
20960 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
20970 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
20980 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
20990 2e 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  . */.const char 
209a0 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28 63 6f  *Strsafe_find(co
209b0 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b  nst char *key).{
209c0 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 31 6e 6f  .  int h;.  x1no
209d0 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
209e0 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  1a==0 ) return 0
209f0 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28  ;.  h = strhash(
20a00 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69 7a  key) & (x1a->siz
20a10 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61  e-1);.  np = x1a
20a20 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
20a30 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
20a40 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  strcmp(np->data,
20a50 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
20a60 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
20a70 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
20a80 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
20a90 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
20aa0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
20ab0 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e  e (terminal or n
20ac0 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62  onterminal) symb
20ad0 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74  ol "x"..** Creat
20ae0 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69  e a new symbol i
20af0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
20b00 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61 73  rst time "x" has
20b10 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73   been seen..*/.s
20b20 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
20b30 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20 63  mbol_new(const c
20b40 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73 74 72 75  har *x).{.  stru
20b50 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a  ct symbol *sp;..
20b60 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69    sp = Symbol_fi
20b70 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70 3d  nd(x);.  if( sp=
20b80 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28  =0 ){.    sp = (
20b90 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
20ba0 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66  calloc(1, sizeof
20bb0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 29 20  (struct symbol) 
20bc0 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65  );.    MemoryChe
20bd0 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e  ck(sp);.    sp->
20be0 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65 28 78  name = Strsafe(x
20bf0 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70 65 20  );.    sp->type 
20c00 3d 20 69 73 75 70 70 65 72 28 2a 78 29 20 3f 20  = isupper(*x) ? 
20c10 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45  TERMINAL : NONTE
20c20 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e  RMINAL;.    sp->
20c30 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 70  rule = 0;.    sp
20c40 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ->fallback = 0;.
20c50 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d      sp->prec = -
20c60 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f 63  1;.    sp->assoc
20c70 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e   = UNK;.    sp->
20c80 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a 20 20  firstset = 0;.  
20c90 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c    sp->lambda = L
20ca0 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 20 20  EMON_FALSE;.    
20cb0 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d  sp->destructor =
20cc0 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74   0;.    sp->dest
20cd0 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  Lineno = 0;.    
20ce0 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d 20 30  sp->datatype = 0
20cf0 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65 43 6e 74  ;.    sp->useCnt
20d00 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c   = 0;.    Symbol
20d10 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e  _insert(sp,sp->n
20d20 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e  ame);.  }.  sp->
20d30 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72 65 74 75  useCnt++;.  retu
20d40 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  rn sp;.}../* Com
20d50 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73  pare two symbols
20d60 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 70 75 72   for working pur
20d70 70 6f 73 65 73 0a 2a 2a 0a 2a 2a 20 53 79 6d 62  poses.**.** Symb
20d80 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20 77  ols that begin w
20d90 69 74 68 20 75 70 70 65 72 20 63 61 73 65 20 6c  ith upper case l
20da0 65 74 74 65 72 73 20 28 74 65 72 6d 69 6e 61 6c  etters (terminal
20db0 73 20 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20  s or tokens).** 
20dc0 6d 75 73 74 20 73 6f 72 74 20 62 65 66 6f 72 65  must sort before
20dd0 20 73 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65   symbols that be
20de0 67 69 6e 20 77 69 74 68 20 6c 6f 77 65 72 20 63  gin with lower c
20df0 61 73 65 20 6c 65 74 74 65 72 73 0a 2a 2a 20 28  ase letters.** (
20e00 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 29 2e 20  non-terminals). 
20e10 20 4f 74 68 65 72 20 74 68 61 6e 20 74 68 61 74   Other than that
20e20 2c 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  , the order does
20e30 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a   not matter..**.
20e40 2a 2a 20 57 65 20 66 69 6e 64 20 65 78 70 65 72  ** We find exper
20e50 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c  imentally that l
20e60 65 61 76 69 6e 67 20 74 68 65 20 73 79 6d 62 6f  eaving the symbo
20e70 6c 73 20 69 6e 20 74 68 65 69 72 20 6f 72 69 67  ls in their orig
20e80 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74  inal.** order (t
20e90 68 65 20 6f 72 64 65 72 20 74 68 65 79 20 61 70  he order they ap
20ea0 70 65 61 72 65 64 20 69 6e 20 74 68 65 20 67 72  peared in the gr
20eb0 61 6d 6d 61 72 20 66 69 6c 65 29 20 67 69 76 65  ammar file) give
20ec0 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73  s the.** smalles
20ed0 74 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20  t parser tables 
20ee0 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e  in SQLite..*/.in
20ef0 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e  t Symbolcmpp(con
20f00 73 74 20 76 6f 69 64 20 2a 5f 61 2c 20 63 6f 6e  st void *_a, con
20f10 73 74 20 76 6f 69 64 20 2a 5f 62 29 0a 7b 0a 20  st void *_b).{. 
20f20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79   const struct sy
20f30 6d 62 6f 6c 20 2a 2a 61 20 3d 20 28 63 6f 6e 73  mbol **a = (cons
20f40 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  t struct symbol 
20f50 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20  **) _a;.  const 
20f60 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
20f70 62 20 3d 20 28 63 6f 6e 73 74 20 73 74 72 75 63  b = (const struc
20f80 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 62 3b  t symbol **) _b;
20f90 0a 20 20 69 6e 74 20 69 31 20 3d 20 28 2a 2a 61  .  int i1 = (**a
20fa0 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30 30  ).index + 100000
20fb0 30 30 2a 28 28 2a 2a 61 29 2e 6e 61 6d 65 5b 30  00*((**a).name[0
20fc0 5d 3e 27 5a 27 29 3b 0a 20 20 69 6e 74 20 69 32  ]>'Z');.  int i2
20fd0 20 3d 20 28 2a 2a 62 29 2e 69 6e 64 65 78 20 2b   = (**b).index +
20fe0 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a 62 29   10000000*((**b)
20ff0 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20  .name[0]>'Z');. 
21000 20 61 73 73 65 72 74 28 20 69 31 21 3d 69 32 20   assert( i1!=i2 
21010 7c 7c 20 73 74 72 63 6d 70 28 28 2a 2a 61 29 2e  || strcmp((**a).
21020 6e 61 6d 65 2c 28 2a 2a 62 29 2e 6e 61 6d 65 29  name,(**b).name)
21030 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
21040 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  i1-i2;.}../* The
21050 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
21060 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
21070 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
21080 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
21090 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
210a0 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72  ype "x2"..*/.str
210b0 75 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74  uct s_x2 {.  int
210c0 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
210d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
210e0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
210f0 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
21120 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
21130 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
21140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
21160 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
21170 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
21180 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21190 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
211a0 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
211b0 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
211c0 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
211d0 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
211e0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32  */.  struct s_x2
211f0 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
21200 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
21210 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
21220 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
21230 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
21240 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
21250 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
21260 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
21270 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
21280 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x2"..*/.typed
21290 65 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  ef struct s_x2no
212a0 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79  de {.  struct sy
212b0 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20 20  mbol *data;     
212c0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
212d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79   const char *key
212e0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
212f0 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74   key */.  struct
21300 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b   s_x2node *next;
21310 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
21320 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68   with the same h
21330 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ash */.  struct 
21340 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b  s_x2node **from;
21350 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69    /* Previous li
21360 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a  nk */.} x2node;.
21370 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c  ./* There is onl
21380 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  y one instance o
21390 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69  f the array, whi
213a0 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch is the follow
213b0 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ing */.static st
213c0 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a  ruct s_x2 *x2a;.
213d0 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
213e0 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ew associative a
213f0 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d  rray */.void Sym
21400 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  bol_init(){.  if
21410 28 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x2a ) return;.
21420 20 20 78 32 61 20 3d 20 28 73 74 72 75 63 74 20    x2a = (struct 
21430 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x2*)malloc( si
21440 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 32  zeof(struct s_x2
21450 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20 29  ) );.  if( x2a )
21460 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65 20  {.    x2a->size 
21470 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e  = 128;.    x2a->
21480 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  count = 0;.    x
21490 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64  2a->tbl = (x2nod
214a0 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20  e*)malloc( .    
214b0 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65    (sizeof(x2node
214c0 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64  ) + sizeof(x2nod
214d0 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20 20 20  e*))*128 );.    
214e0 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20  if( x2a->tbl==0 
214f0 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 32  ){.      free(x2
21500 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d 20  a);.      x2a = 
21510 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
21520 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
21530 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f   x2a->ht = (x2no
21540 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b  de**)&(x2a->tbl[
21550 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  128]);.      for
21560 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b  (i=0; i<128; i++
21570 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x2a->ht[i] = 0
21580 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
21590 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
215a0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
215b0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
215c0 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
215d0 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
215e0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
215f0 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
21600 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f  ten */.int Symbo
21610 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  l_insert(struct 
21620 73 79 6d 62 6f 6c 20 2a 64 61 74 61 2c 20 63 6f  symbol *data, co
21630 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b  nst char *key).{
21640 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x2node *np;. 
21650 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68   int h;.  int ph
21660 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20  ;..  if( x2a==0 
21670 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
21680 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 3b   = strhash(key);
21690 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32 61  .  h = ph & (x2a
216a0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
216b0 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
216c0 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
216d0 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
216e0 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20  key,key)==0 ){. 
216f0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
21700 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
21710 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
21720 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
21730 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
21740 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
21750 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
21760 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
21770 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
21780 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 32  xt;.  }.  if( x2
21790 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73  a->count>=x2a->s
217a0 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
217b0 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
217c0 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
217d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69   */.    int i,si
217e0 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
217f0 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x2 array;.    a
21800 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65  rray.size = size
21810 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x2a->size*2;.
21820 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
21830 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x2a->count;.  
21840 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
21850 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20  2node*)malloc(. 
21860 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e       (sizeof(x2n
21870 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32  ode) + sizeof(x2
21880 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a  node*))*size );.
21890 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
218a0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
218b0 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
218c0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
218d0 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
218e0 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x2node**)&(ar
218f0 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
21900 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
21910 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
21920 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
21930 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63  or(i=0; i<x2a->c
21940 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
21950 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x2node *oldnp,
21960 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
21970 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62  ldnp = &(x2a->tb
21980 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
21990 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e   strhash(oldnp->
219a0 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b  key) & (size-1);
219b0 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
219c0 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
219d0 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
219e0 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
219f0 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
21a00 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
21a10 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
21a20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
21a30 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20     newnp->key = 
21a40 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20  oldnp->key;.    
21a50 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
21a60 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
21a70 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
21a80 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
21a90 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
21aa0 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
21ab0 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61 2d 3e  }.    free(x2a->
21ac0 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d  tbl);.    *x2a =
21ad0 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
21ae0 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
21af0 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
21b00 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29   & (x2a->size-1)
21b10 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e  ;.  np = &(x2a->
21b20 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x2a->count++
21b30 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20  ]);.  np->key = 
21b40 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  key;.  np->data 
21b50 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32  = data;.  if( x2
21b60 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e  a->ht[h] ) x2a->
21b70 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
21b80 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
21b90 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b  >next = x2a->ht[
21ba0 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d  h];.  x2a->ht[h]
21bb0 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
21bc0 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d  m = &(x2a->ht[h]
21bd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
21be0 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
21bf0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
21c00 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
21c10 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
21c20 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
21c30 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75  uch key. */.stru
21c40 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
21c50 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68 61  l_find(const cha
21c60 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20  r *key).{.  int 
21c70 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b  h;.  x2node *np;
21c80 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ..  if( x2a==0 )
21c90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
21ca0 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20   strhash(key) & 
21cb0 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x2a->size-1);. 
21cc0 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d   np = x2a->ht[h]
21cd0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
21ce0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
21cf0 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
21d00 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20  ) break;.    np 
21d10 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
21d20 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70    return np ? np
21d30 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->data : 0;.}../
21d40 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d 74  * Return the n-t
21d50 68 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20  h data.  Return 
21d60 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75 74  NULL if n is out
21d70 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74   of range. */.st
21d80 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
21d90 62 6f 6c 5f 4e 74 68 28 69 6e 74 20 6e 29 0a 7b  bol_Nth(int n).{
21da0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
21db0 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32   *data;.  if( x2
21dc0 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78  a && n>0 && n<=x
21dd0 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20  2a->count ){.   
21de0 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c   data = x2a->tbl
21df0 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65  [n-1].data;.  }e
21e00 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20  lse{.    data = 
21e10 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
21e20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  data;.}../* Retu
21e30 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
21e40 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20  he array */.int 
21e50 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b  Symbol_count().{
21e60 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f 20  .  return x2a ? 
21e70 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a  x2a->count : 0;.
21e80 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
21e90 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
21ea0 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e  s to all data in
21eb0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54   the table..** T
21ec0 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
21ed0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
21ee0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
21ef0 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
21f00 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c  ion.** problems,
21f10 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79   or if the array
21f20 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74   is empty. */.st
21f30 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79  ruct symbol **Sy
21f40 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b  mbol_arrayof().{
21f50 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
21f60 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20   **array;.  int 
21f70 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 32  i,size;.  if( x2
21f80 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
21f90 0a 20 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 63  .  size = x2a->c
21fa0 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
21fb0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
21fc0 2a 29 63 61 6c 6c 6f 63 28 73 69 7a 65 2c 20 73  *)calloc(size, s
21fd0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
21fe0 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66 28 20 61  bol *));.  if( a
21ff0 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  rray ){.    for(
22000 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
22010 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 32 61  ) array[i] = x2a
22020 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20  ->tbl[i].data;. 
22030 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61   }.  return arra
22040 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  y;.}../* Compare
22050 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61 74 69   two configurati
22060 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69  ons */.int Confi
22070 67 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20  gcmp(const char 
22080 2a 5f 61 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a  *_a,const char *
22090 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 73 74  _b).{.  const st
220a0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 20 3d  ruct config *a =
220b0 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20   (struct config 
220c0 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20 73  *) _a;.  const s
220d0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 20  truct config *b 
220e0 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
220f0 20 2a 29 20 5f 62 3b 0a 20 20 69 6e 74 20 78 3b   *) _b;.  int x;
22100 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e  .  x = a->rp->in
22110 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64  dex - b->rp->ind
22120 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20 29  ex;.  if( x==0 )
22130 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d   x = a->dot - b-
22140 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 78  >dot;.  return x
22150 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
22160 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50 52  two states */.PR
22170 49 56 41 54 45 20 69 6e 74 20 73 74 61 74 65 63  IVATE int statec
22180 6d 70 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  mp(struct config
22190 20 2a 61 2c 20 73 74 72 75 63 74 20 63 6f 6e 66   *a, struct conf
221a0 69 67 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20 72  ig *b).{.  int r
221b0 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20 72  c;.  for(rc=0; r
221c0 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62 3b 20  c==0 && a && b; 
221d0 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62   a=a->bp, b=b->b
221e0 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e  p){.    rc = a->
221f0 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72  rp->index - b->r
22200 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  p->index;.    if
22210 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 61  ( rc==0 ) rc = a
22220 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a  ->dot - b->dot;.
22230 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20    }.  if( rc==0 
22240 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29 20 72  ){.    if( a ) r
22250 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 62  c = 1;.    if( b
22260 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a   ) rc = -1;.  }.
22270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22280 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74 65 20  /* Hash a state 
22290 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73  */.PRIVATE int s
222a0 74 61 74 65 68 61 73 68 28 73 74 72 75 63 74 20  tatehash(struct 
222b0 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20 69  config *a).{.  i
222c0 6e 74 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28  nt h=0;.  while(
222d0 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a   a ){.    h = h*
222e0 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
222f0 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
22300 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20      a = a->bp;. 
22310 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d   }.  return h;.}
22320 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
22330 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74  new state struct
22340 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73 74  ure */.struct st
22350 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29  ate *State_new()
22360 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
22370 65 20 2a 6e 65 77 73 74 61 74 65 3b 0a 20 20 6e  e *newstate;.  n
22380 65 77 73 74 61 74 65 20 3d 20 28 73 74 72 75 63  ewstate = (struc
22390 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63  t state *)calloc
223a0 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  (1, sizeof(struc
223b0 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65  t state) );.  Me
223c0 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 73 74 61  moryCheck(newsta
223d0 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  te);.  return ne
223e0 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68  wstate;.}../* Th
223f0 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
22400 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
22410 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
22420 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
22430 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
22440 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74  type "x3"..*/.st
22450 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e  ruct s_x3 {.  in
22460 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
22470 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
22480 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
22490 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
224c0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
224d0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
224e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
224f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
22500 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
22510 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
22520 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22530 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
22540 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
22550 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
22560 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
22570 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
22580 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
22590 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  3node **ht;  /* 
225a0 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
225b0 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
225c0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
225d0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
225e0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
225f0 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
22600 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
22610 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
22620 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x3"..*/.type
22630 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e  def struct s_x3n
22640 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
22650 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20  tate *data;     
22660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22670 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
22680 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
22690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
226a0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
226b0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
226c0 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
226d0 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
226e0 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
226f0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
22700 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
22710 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
22720 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x3node;../* Th
22730 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
22740 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
22750 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
22760 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
22770 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
22780 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c  _x3 *x3a;../* Al
22790 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
227a0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
227b0 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  /.void State_ini
227c0 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61 20 29  t(){.  if( x3a )
227d0 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20 3d   return;.  x3a =
227e0 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29 6d   (struct s_x3*)m
227f0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
22800 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20 20  ruct s_x3) );.  
22810 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20 78  if( x3a ){.    x
22820 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a  3a->size = 128;.
22830 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d      x3a->count =
22840 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62 6c   0;.    x3a->tbl
22850 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x3node*)mall
22860 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
22870 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
22880 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 31 32  eof(x3node*))*12
22890 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 33 61  8 );.    if( x3a
228a0 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
228b0 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20 20 20    free(x3a);.   
228c0 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20 20 20     x3a = 0;.    
228d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
228e0 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e 68   i;.      x3a->h
228f0 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28  t = (x3node**)&(
22900 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a  x3a->tbl[128]);.
22910 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
22920 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e  <128; i++) x3a->
22930 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
22940 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
22950 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
22960 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
22970 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
22980 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
22990 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
229a0 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
229b0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
229c0 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74  int State_insert
229d0 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 64  (struct state *d
229e0 61 74 61 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  ata, struct conf
229f0 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 33 6e  ig *key).{.  x3n
22a00 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68  ode *np;.  int h
22a10 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69  ;.  int ph;..  i
22a20 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
22a30 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 61  rn 0;.  ph = sta
22a40 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68  tehash(key);.  h
22a50 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69   = ph & (x3a->si
22a60 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33  ze-1);.  np = x3
22a70 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
22a80 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
22a90 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65   statecmp(np->ke
22aa0 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  y,key)==0 ){.   
22ab0 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
22ac0 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
22ad0 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
22ae0 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
22af0 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
22b00 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
22b10 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
22b20 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
22b30 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
22b40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33 61 2d  ;.  }.  if( x3a-
22b50 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a  >count>=x3a->siz
22b60 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
22b70 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
22b80 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
22b90 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
22ba0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
22bb0 33 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  3 array;.    arr
22bc0 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
22bd0 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x3a->size*2;.  
22be0 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
22bf0 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x3a->count;.    
22c00 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e  array.tbl = (x3n
22c10 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20  ode*)malloc(.   
22c20 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64     (sizeof(x3nod
22c30 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f  e) + sizeof(x3no
22c40 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20  de*))*size );.  
22c50 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
22c60 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
22c70 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
22c80 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
22c90 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
22ca0 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x3node**)&(arra
22cb0 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20  y.tbl[size]);.  
22cc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
22cd0 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
22ce0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
22cf0 28 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75  (i=0; i<x3a->cou
22d00 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
22d10 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x3node *oldnp, *
22d20 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
22d30 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b  np = &(x3a->tbl[
22d40 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73  i]);.      h = s
22d50 74 61 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e  tatehash(oldnp->
22d60 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b  key) & (size-1);
22d70 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
22d80 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
22d90 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
22da0 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
22db0 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
22dc0 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
22dd0 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
22de0 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
22df0 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20     newnp->key = 
22e00 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20  oldnp->key;.    
22e10 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
22e20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
22e30 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
22e40 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
22e50 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
22e60 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
22e70 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61 2d 3e  }.    free(x3a->
22e80 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d  tbl);.    *x3a =
22e90 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
22ea0 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
22eb0 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
22ec0 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29   & (x3a->size-1)
22ed0 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e  ;.  np = &(x3a->
22ee0 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x3a->count++
22ef0 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20  ]);.  np->key = 
22f00 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  key;.  np->data 
22f10 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 33  = data;.  if( x3
22f20 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e  a->ht[h] ) x3a->
22f30 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
22f40 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
22f50 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b  >next = x3a->ht[
22f60 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d  h];.  x3a->ht[h]
22f70 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
22f80 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d  m = &(x3a->ht[h]
22f90 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
22fa0 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
22fb0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
22fc0 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
22fd0 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
22fe0 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
22ff0 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75  uch key. */.stru
23000 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
23010 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66  find(struct conf
23020 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74  ig *key).{.  int
23030 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70   h;.  x3node *np
23040 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  ;..  if( x3a==0 
23050 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
23060 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29  = statehash(key)
23070 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29   & (x3a->size-1)
23080 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74  ;.  np = x3a->ht
23090 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
230a0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74   ){.    if( stat
230b0 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  ecmp(np->key,key
230c0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
230d0 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
230e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
230f0 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
23100 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e  .}../* Return an
23110 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
23120 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69  rs to all data i
23130 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
23140 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  The array is obt
23150 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
23160 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  c.  Return NULL 
23170 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  if memory alloca
23180 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73  tion.** problems
23190 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61  , or if the arra
231a0 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73  y is empty. */.s
231b0 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74  truct state **St
231c0 61 74 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a  ate_arrayof().{.
231d0 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
231e0 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c  *array;.  int i,
231f0 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61 3d  size;.  if( x3a=
23200 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
23210 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75   size = x3a->cou
23220 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73  nt;.  array = (s
23230 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29 6d  truct state **)m
23240 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
23250 72 75 63 74 20 73 74 61 74 65 20 2a 29 2a 73 69  ruct state *)*si
23260 7a 65 20 29 3b 0a 20 20 69 66 28 20 61 72 72 61  ze );.  if( arra
23270 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
23280 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
23290 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74  rray[i] = x3a->t
232a0 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a  bl[i].data;.  }.
232b0 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a    return array;.
232c0 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e  }../* Hash a con
232d0 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52  figuration */.PR
232e0 49 56 41 54 45 20 69 6e 74 20 63 6f 6e 66 69 67  IVATE int config
232f0 68 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66  hash(struct conf
23300 69 67 20 2a 61 29 0a 7b 0a 20 20 69 6e 74 20 68  ig *a).{.  int h
23310 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20  =0;.  h = h*571 
23320 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33  + a->rp->index*3
23330 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65  7 + a->dot;.  re
23340 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn h;.}../* Th
23350 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
23360 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
23370 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
23380 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
23390 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
233a0 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74  type "x4"..*/.st
233b0 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e  ruct s_x4 {.  in
233c0 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
233d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
233e0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
233f0 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
23400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23410 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
23420 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
23430 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
23440 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
23450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
23460 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
23470 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
23480 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23490 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
234a0 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
234b0 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
234c0 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
234d0 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
234e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
234f0 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  4node **ht;  /* 
23500 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
23510 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
23520 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
23530 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
23540 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
23550 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
23560 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
23570 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
23580 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x4"..*/.type
23590 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e  def struct s_x4n
235a0 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63  ode {.  struct c
235b0 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20  onfig *data;    
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
235d0 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
235e0 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
235f0 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
23600 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
23610 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
23620 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a  ruct s_x4node **
23630 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
23640 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e  us link */.} x4n
23650 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
23660 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
23670 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
23680 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
23690 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
236a0 69 63 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a  ic struct s_x4 *
236b0 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x4a;../* Allocat
236c0 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
236d0 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
236e0 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  d Configtable_in
236f0 69 74 28 29 7b 0a 20 20 69 66 28 20 78 34 61 20  it(){.  if( x4a 
23700 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20  ) return;.  x4a 
23710 3d 20 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29  = (struct s_x4*)
23720 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
23730 74 72 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20  truct s_x4) );. 
23740 20 69 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20   if( x4a ){.    
23750 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a  x4a->size = 64;.
23760 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d      x4a->count =
23770 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c   0;.    x4a->tbl
23780 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x4node*)mall
23790 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
237a0 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x4node) + siz
237b0 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 36 34  eof(x4node*))*64
237c0 20 29 3b 0a 20 20 20 20 69 66 28 20 78 34 61 2d   );.    if( x4a-
237d0 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
237e0 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20 20 20   free(x4a);.    
237f0 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x4a = 0;.    }
23800 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
23810 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e 68 74  i;.      x4a->ht
23820 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78   = (x4node**)&(x
23830 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20  4a->tbl[64]);.  
23840 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36      for(i=0; i<6
23850 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b  4; i++) x4a->ht[
23860 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
23870 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
23880 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
23890 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
238a0 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
238b0 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
238c0 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
238d0 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
238e0 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
238f0 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
23900 65 72 74 28 73 74 72 75 63 74 20 63 6f 6e 66 69  ert(struct confi
23910 67 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78 34 6e  g *data).{.  x4n
23920 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68  ode *np;.  int h
23930 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69  ;.  int ph;..  i
23940 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75  f( x4a==0 ) retu
23950 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e  rn 0;.  ph = con
23960 66 69 67 68 61 73 68 28 64 61 74 61 29 3b 0a 20  fighash(data);. 
23970 20 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e   h = ph & (x4a->
23980 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
23990 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x4a->ht[h];.  wh
239a0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
239b0 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f  f( Configcmp((co
239c0 6e 73 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e  nst char *) np->
239d0 64 61 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72  data,(const char
239e0 20 2a 29 20 64 61 74 61 29 3d 3d 30 20 29 7b 0a   *) data)==0 ){.
239f0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
23a00 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
23a10 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
23a20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
23a30 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
23a40 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
23a50 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
23a60 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
23a70 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
23a80 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
23a90 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e  4a->count>=x4a->
23aa0 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
23ab0 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
23ac0 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
23ad0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73  r */.    int i,s
23ae0 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ize;.    struct 
23af0 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20 20 20  s_x4 array;.    
23b00 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a  array.size = siz
23b10 65 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b  e = x4a->size*2;
23b20 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
23b30 20 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x4a->count;. 
23b40 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
23b50 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a  x4node*)malloc(.
23b60 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34        (sizeof(x4
23b70 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
23b80 34 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b  4node*))*size );
23b90 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
23ba0 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
23bb0 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
23bc0 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
23bd0 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
23be0 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61   = (x4node**)&(a
23bf0 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b  rray.tbl[size]);
23c00 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23c10 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
23c20 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
23c30 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e  for(i=0; i<x4a->
23c40 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
23c50 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x4node *oldnp
23c60 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
23c70 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74  oldnp = &(x4a->t
23c80 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
23c90 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64  = confighash(old
23ca0 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a  np->data) & (siz
23cb0 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
23cc0 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
23cd0 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
23ce0 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
23cf0 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
23d00 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
23d10 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
23d20 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
23d30 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
23d40 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
23d50 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
23d60 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
23d70 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
23d80 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
23d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
23da0 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x4a->tbl);.    
23db0 2a 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x4a = array;.  
23dc0 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
23dd0 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
23de0 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73  h = ph & (x4a->s
23df0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
23e00 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63  (x4a->tbl[x4a->c
23e10 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
23e20 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
23e30 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x4a->ht[h] ) 
23e40 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x4a->ht[h]->from
23e50 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
23e60 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61    np->next = x4a
23e70 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e  ->ht[h];.  x4a->
23e80 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
23e90 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e  ->from = &(x4a->
23ea0 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
23eb0 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
23ec0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
23ed0 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
23ee0 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
23ef0 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
23f00 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
23f10 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
23f20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64  Configtable_find
23f30 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
23f40 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key).{.  int h;.
23f50 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x4node *np;.. 
23f60 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65   if( x4a==0 ) re
23f70 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f  turn 0;.  h = co
23f80 6e 66 69 67 68 61 73 68 28 6b 65 79 29 20 26 20  nfighash(key) & 
23f90 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
23fa0 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d   np = x4a->ht[h]
23fb0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
23fc0 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63  .    if( Configc
23fd0 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  mp((const char *
23fe0 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73  ) np->data,(cons
23ff0 74 20 63 68 61 72 20 2a 29 20 6b 65 79 29 3d 3d  t char *) key)==
24000 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
24010 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
24020 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
24030 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
24040 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64  ./* Remove all d
24050 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62  ata from the tab
24060 6c 65 2e 20 20 50 61 73 73 20 65 61 63 68 20 64  le.  Pass each d
24070 61 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ata to the funct
24080 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69 74  ion "f".** as it
24090 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28 22   is removed.  ("
240a0 66 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74  f" may be null t
240b0 6f 20 61 76 6f 69 64 20 74 68 69 73 20 73 74 65  o avoid this ste
240c0 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  p.) */.void Conf
240d0 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e  igtable_clear(in
240e0 74 28 2a 66 29 28 73 74 72 75 63 74 20 63 6f 6e  t(*f)(struct con
240f0 66 69 67 20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20  fig *)).{.  int 
24100 69 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  i;.  if( x4a==0 
24110 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30  || x4a->count==0
24120 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
24130 20 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c   f ) for(i=0; i<
24140 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x4a->count; i++)
24150 20 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69   (*f)(x4a->tbl[i
24160 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28 69  ].data);.  for(i
24170 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b  =0; i<x4a->size;
24180 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d   i++) x4a->ht[i]
24190 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75   = 0;.  x4a->cou
241a0 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nt = 0;.  return
241b0 3b 0a 7d 0a                                      ;.}.