/ Hex Artifact Content
Login

Artifact 0fd01011bf19113ee50347cd510659b9c28051a5:


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 63 6f 6e 73 74 20 63 68 61 72 20 2a  ess(const char *
0230: 70 61 74 68 2c 20 69 6e 74 20 6d 6f 64 65 29 3b  path, int mode);
0240: 0a 23 65 6c 73 65 0a 23 69 6e 63 6c 75 64 65 20  .#else.#include 
0250: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69  <unistd.h>.#endi
0260: 66 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 52  f../* #define PR
0270: 49 56 41 54 45 20 73 74 61 74 69 63 20 2a 2f 0a  IVATE static */.
0280: 23 64 65 66 69 6e 65 20 50 52 49 56 41 54 45 0a  #define PRIVATE.
0290: 0a 23 69 66 64 65 66 20 54 45 53 54 0a 23 64 65  .#ifdef TEST.#de
02a0: 66 69 6e 65 20 4d 41 58 52 48 53 20 35 20 20 20  fine MAXRHS 5   
02b0: 20 20 20 20 2f 2a 20 53 65 74 20 6c 6f 77 20 74      /* Set low t
02c0: 6f 20 65 78 65 72 63 69 73 65 20 65 78 63 65 70  o exercise excep
02d0: 74 69 6f 6e 20 63 6f 64 65 20 2a 2f 0a 23 65 6c  tion code */.#el
02e0: 73 65 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48  se.#define MAXRH
02f0: 53 20 31 30 30 30 0a 23 65 6e 64 69 66 0a 0a 73  S 1000.#endif..s
0300: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
0310: 20 2a 2a 6d 61 64 65 5f 66 69 6c 65 73 20 3d 20   **made_files = 
0320: 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74  NULL;.static int
0330: 20 6d 61 64 65 5f 66 69 6c 65 73 5f 63 6f 75 6e   made_files_coun
0340: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  t = 0;.static in
0350: 74 20 73 75 63 63 65 73 73 66 75 6c 5f 65 78 69  t successful_exi
0360: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f  t = 0;.static vo
0370: 69 64 20 4c 65 6d 6f 6e 41 74 45 78 69 74 28 76  id LemonAtExit(v
0380: 6f 69 64 29 0a 7b 0a 20 20 20 20 2f 2a 20 69 66  oid).{.    /* if
0390: 20 77 65 20 66 61 69 6c 65 64 2c 20 64 65 6c 65   we failed, dele
03a0: 74 65 20 28 6d 6f 73 74 29 20 66 69 6c 65 73 20  te (most) files 
03b0: 77 65 20 6d 61 64 65 2c 20 74 6f 20 75 6e 63 6f  we made, to unco
03c0: 6e 66 75 73 65 20 62 75 69 6c 64 20 74 6f 6f 6c  nfuse build tool
03d0: 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  s. */.    int i;
03e0: 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b  .    for (i = 0;
03f0: 20 69 20 3c 20 6d 61 64 65 5f 66 69 6c 65 73 5f   i < made_files_
0400: 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 20 20  count; i++) {.  
0410: 20 20 20 20 20 20 69 66 20 28 21 73 75 63 63 65        if (!succe
0420: 73 73 66 75 6c 5f 65 78 69 74 29 20 7b 0a 20 20  ssful_exit) {.  
0430: 20 20 20 20 20 20 20 20 20 20 72 65 6d 6f 76 65            remove
0440: 28 6d 61 64 65 5f 66 69 6c 65 73 5b 69 5d 29 3b  (made_files[i]);
0450: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
0460: 0a 20 20 20 20 66 72 65 65 28 6d 61 64 65 5f 66  .    free(made_f
0470: 69 6c 65 73 29 3b 0a 20 20 20 20 6d 61 64 65 5f  iles);.    made_
0480: 66 69 6c 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  files_count = 0;
0490: 0a 20 20 20 20 6d 61 64 65 5f 66 69 6c 65 73 20  .    made_files 
04a0: 3d 20 4e 55 4c 4c 3b 0a 7d 0a 0a 73 74 61 74 69  = NULL;.}..stati
04b0: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 63 68  c char *msort(ch
04c0: 61 72 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 28 2a  ar*,char**,int(*
04d0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
04e0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 0a 2f 2a  nst char*));../*
04f0: 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72 73 20 61 72  .** Compilers ar
0500: 65 20 67 65 74 74 69 6e 67 20 69 6e 63 72 65 61  e getting increa
0510: 73 69 6e 67 6c 79 20 70 65 64 61 6e 74 69 63 20  singly pedantic 
0520: 61 62 6f 75 74 20 74 79 70 65 20 63 6f 6e 76 65  about type conve
0530: 72 73 69 6f 6e 73 0a 2a 2a 20 61 73 20 43 20 65  rsions.** as C e
0540: 76 6f 6c 76 65 73 20 65 76 65 72 20 63 6c 6f 73  volves ever clos
0550: 65 72 20 74 6f 20 41 64 61 2e 2e 2e 2e 20 20 54  er to Ada....  T
0560: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0570: 65 20 6c 61 74 65 73 74 20 70 72 6f 62 6c 65 6d  e latest problem
0580: 73 0a 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20  s.** we have to 
0590: 64 65 66 69 6e 65 20 74 68 65 20 66 6f 6c 6c 6f  define the follo
05a0: 77 69 6e 67 20 76 61 72 69 61 6e 74 20 6f 66 20  wing variant of 
05b0: 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 23 64 65  strlen()..*/.#de
05c0: 66 69 6e 65 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  fine lemonStrlen
05d0: 28 58 29 20 20 20 28 28 69 6e 74 29 73 74 72 6c  (X)   ((int)strl
05e0: 65 6e 28 58 29 29 0a 0a 2f 2a 20 61 20 66 65 77  en(X))../* a few
05f0: 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   forward declara
0600: 74 69 6f 6e 73 2e 2e 2e 20 2a 2f 0a 73 74 72 75  tions... */.stru
0610: 63 74 20 72 75 6c 65 3b 0a 73 74 72 75 63 74 20  ct rule;.struct 
0620: 6c 65 6d 6f 6e 3b 0a 73 74 72 75 63 74 20 61 63  lemon;.struct ac
0630: 74 69 6f 6e 3b 0a 0a 73 74 61 74 69 63 20 73 74  tion;..static st
0640: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74  ruct action *Act
0650: 69 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 3b 0a 73  ion_new(void);.s
0660: 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74  tatic struct act
0670: 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74  ion *Action_sort
0680: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
0690: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  );../********** 
06a0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62  From the file "b
06b0: 75 69 6c 64 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  uild.h" ********
06c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
06d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
06e0: 69 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65  id FindRulePrece
06f0: 64 65 6e 63 65 73 28 29 3b 0a 76 6f 69 64 20 46  dences();.void F
0700: 69 6e 64 46 69 72 73 74 53 65 74 73 28 29 3b 0a  indFirstSets();.
0710: 76 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73 28  void FindStates(
0720: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b  );.void FindLink
0730: 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f  s();.void FindFo
0740: 6c 6c 6f 77 53 65 74 73 28 29 3b 0a 76 6f 69 64  llowSets();.void
0750: 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 29 3b 0a   FindActions();.
0760: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  ./********* From
0770: 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69   the file "confi
0780: 67 6c 69 73 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  glist.h" *******
0790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64  **********/.void
07b0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74   Configlist_init
07c0: 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20 63  (void);.struct c
07d0: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
07e0: 74 5f 61 64 64 28 73 74 72 75 63 74 20 72 75 6c  t_add(struct rul
07f0: 65 20 2a 2c 20 69 6e 74 29 3b 0a 73 74 72 75 63  e *, int);.struc
0800: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
0810: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 73 74  list_addbasis(st
0820: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
0830: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  );.void Configli
0840: 73 74 5f 63 6c 6f 73 75 72 65 28 73 74 72 75 63  st_closure(struc
0850: 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64  t lemon *);.void
0860: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
0870: 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e  (void);.void Con
0880: 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69  figlist_sortbasi
0890: 73 28 76 6f 69 64 29 3b 0a 73 74 72 75 63 74 20  s(void);.struct 
08a0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
08b0: 73 74 5f 72 65 74 75 72 6e 28 76 6f 69 64 29 3b  st_return(void);
08c0: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
08d0: 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73  Configlist_basis
08e0: 28 76 6f 69 64 29 3b 0a 76 6f 69 64 20 43 6f 6e  (void);.void Con
08f0: 66 69 67 6c 69 73 74 5f 65 61 74 28 73 74 72 75  figlist_eat(stru
0900: 63 74 20 63 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f  ct config *);.vo
0910: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65  id Configlist_re
0920: 73 65 74 28 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a  set(void);../***
0930: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
0940: 66 69 6c 65 20 22 65 72 72 6f 72 2e 68 22 20 2a  file "error.h" *
0950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0970: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 45 72 72  ******/.void Err
0980: 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68 61 72  orMsg(const char
0990: 20 2a 2c 20 69 6e 74 2c 63 6f 6e 73 74 20 63 68   *, int,const ch
09a0: 61 72 20 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a  ar *, ...);../**
09b0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
09c0: 6c 65 20 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a  le "option.h" **
09d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 65 6e 75 6d 20 6f  ********/.enum o
0a00: 70 74 69 6f 6e 5f 74 79 70 65 20 7b 20 4f 50 54  ption_type { OPT
0a10: 5f 46 4c 41 47 3d 31 2c 20 20 4f 50 54 5f 49 4e  _FLAG=1,  OPT_IN
0a20: 54 2c 20 20 4f 50 54 5f 44 42 4c 2c 20 20 4f 50  T,  OPT_DBL,  OP
0a30: 54 5f 53 54 52 2c 0a 20 20 20 20 20 20 20 20 20  T_STR,.         
0a40: 4f 50 54 5f 46 46 4c 41 47 2c 20 4f 50 54 5f 46  OPT_FFLAG, OPT_F
0a50: 49 4e 54 2c 20 4f 50 54 5f 46 44 42 4c 2c 20 4f  INT, OPT_FDBL, O
0a60: 50 54 5f 46 53 54 52 7d 3b 0a 73 74 72 75 63 74  PT_FSTR};.struct
0a70: 20 73 5f 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65   s_options {.  e
0a80: 6e 75 6d 20 6f 70 74 69 6f 6e 5f 74 79 70 65 20  num option_type 
0a90: 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  type;.  const ch
0aa0: 61 72 20 2a 6c 61 62 65 6c 3b 0a 20 20 63 68 61  ar *label;.  cha
0ab0: 72 20 2a 61 72 67 3b 0a 20 20 63 6f 6e 73 74 20  r *arg;.  const 
0ac0: 63 68 61 72 20 2a 6d 65 73 73 61 67 65 3b 0a 7d  char *message;.}
0ad0: 3b 0a 69 6e 74 20 20 20 20 4f 70 74 49 6e 69 74  ;.int    OptInit
0ae0: 28 63 68 61 72 2a 2a 2c 73 74 72 75 63 74 20 73  (char**,struct s
0af0: 5f 6f 70 74 69 6f 6e 73 2a 2c 46 49 4c 45 2a 29  _options*,FILE*)
0b00: 3b 0a 69 6e 74 20 20 20 20 4f 70 74 4e 41 72 67  ;.int    OptNArg
0b10: 73 28 76 6f 69 64 29 3b 0a 63 68 61 72 20 20 2a  s(void);.char  *
0b20: 4f 70 74 41 72 67 28 69 6e 74 29 3b 0a 76 6f 69  OptArg(int);.voi
0b30: 64 20 20 20 4f 70 74 45 72 72 28 69 6e 74 29 3b  d   OptErr(int);
0b40: 0a 76 6f 69 64 20 20 20 4f 70 74 50 72 69 6e 74  .void   OptPrint
0b50: 28 76 6f 69 64 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  (void);../******
0b60: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0b70: 20 22 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a   "parse.h" *****
0b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ba0: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65  ****/.void Parse
0bb0: 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
0bc0: 65 6d 70 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  emp);../********
0bd0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0be0: 22 70 6c 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a  "plink.h" ******
0bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c10: 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  */.struct plink 
0c20: 2a 50 6c 69 6e 6b 5f 6e 65 77 28 76 6f 69 64 29  *Plink_new(void)
0c30: 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64  ;.void Plink_add
0c40: 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a  (struct plink **
0c50: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
0c60: 2a 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63  *);.void Plink_c
0c70: 6f 70 79 28 73 74 72 75 63 74 20 70 6c 69 6e 6b  opy(struct plink
0c80: 20 2a 2a 2c 20 73 74 72 75 63 74 20 70 6c 69 6e   **, struct plin
0c90: 6b 20 2a 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b  k *);.void Plink
0ca0: 5f 64 65 6c 65 74 65 28 73 74 72 75 63 74 20 70  _delete(struct p
0cb0: 6c 69 6e 6b 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  link *);../*****
0cc0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
0cd0: 69 6c 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a  ile "report.h" *
0ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d00: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69  ****/.void Repri
0d10: 6e 74 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  nt(struct lemon 
0d20: 2a 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f  *);.void ReportO
0d30: 75 74 70 75 74 28 73 74 72 75 63 74 20 6c 65 6d  utput(struct lem
0d40: 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 52 65 70 6f  on *);.void Repo
0d50: 72 74 54 61 62 6c 65 28 73 74 72 75 63 74 20 6c  rtTable(struct l
0d60: 65 6d 6f 6e 20 2a 2c 20 69 6e 74 29 3b 0a 76 6f  emon *, int);.vo
0d70: 69 64 20 52 65 70 6f 72 74 48 65 61 64 65 72 28  id ReportHeader(
0d80: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b  struct lemon *);
0d90: 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61  .void CompressTa
0da0: 62 6c 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  bles(struct lemo
0db0: 6e 20 2a 29 3b 0a 76 6f 69 64 20 52 65 73 6f 72  n *);.void Resor
0dc0: 74 53 74 61 74 65 73 28 73 74 72 75 63 74 20 6c  tStates(struct l
0dd0: 65 6d 6f 6e 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  emon *);../*****
0de0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
0df0: 69 6c 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a  ile "set.h" ****
0e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e20: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53  ****/.void  SetS
0e30: 69 7a 65 28 69 6e 74 29 3b 20 20 20 20 20 20 20  ize(int);       
0e40: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 73 65 74        /* All set
0e50: 73 20 77 69 6c 6c 20 62 65 20 6f 66 20 73 69 7a  s will be of siz
0e60: 65 20 4e 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74  e N */.char *Set
0e70: 4e 65 77 28 76 6f 69 64 29 3b 20 20 20 20 20 20  New(void);      
0e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65           /* A ne
0e90: 77 20 73 65 74 20 66 6f 72 20 65 6c 65 6d 65 6e  w set for elemen
0ea0: 74 20 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20  t 0..N */.void  
0eb0: 53 65 74 46 72 65 65 28 63 68 61 72 2a 29 3b 20  SetFree(char*); 
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
0ed0: 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20  eallocate a set 
0ee0: 2a 2f 0a 0a 63 68 61 72 20 2a 53 65 74 4e 65 77  */..char *SetNew
0ef0: 28 76 6f 69 64 29 3b 20 20 20 20 20 20 20 20 20  (void);         
0f00: 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73        /* A new s
0f10: 65 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30  et for element 0
0f20: 2e 2e 4e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64  ..N */.int SetAd
0f30: 64 28 63 68 61 72 2a 2c 69 6e 74 29 3b 20 20 20  d(char*,int);   
0f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
0f50: 65 6c 65 6d 65 6e 74 20 74 6f 20 61 20 73 65 74  element to a set
0f60: 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e   */.int SetUnion
0f70: 28 63 68 61 72 20 2a 2c 63 68 61 72 20 2a 29 3b  (char *,char *);
0f80: 20 20 20 20 2f 2a 20 41 20 3c 2d 20 41 20 55 20      /* A <- A U 
0f90: 42 2c 20 74 68 72 75 20 65 6c 65 6d 65 6e 74 20  B, thru element 
0fa0: 4e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 65 74  N */.#define Set
0fb0: 46 69 6e 64 28 58 2c 59 29 20 28 58 5b 59 5d 29  Find(X,Y) (X[Y])
0fc0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
0fd0: 66 20 59 20 69 73 20 69 6e 20 73 65 74 20 58 20  f Y is in set X 
0fe0: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  */../********** 
0ff0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
1000: 74 72 75 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  truct.h" *******
1010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1030: 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20  /*.** Principal 
1040: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
1050: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
1060: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
1070: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  */..typedef enum
1080: 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3d 30 2c   {LEMON_FALSE=0,
1090: 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d 20 42 6f 6f   LEMON_TRUE} Boo
10a0: 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62 6f 6c  lean;../* Symbol
10b0: 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  s (terminals and
10c0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 29 20 6f   nonterminals) o
10d0: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 61 72  f the grammar ar
10e0: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  e stored.** in t
10f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f  he following: */
1100: 0a 65 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74 79 70  .enum symbol_typ
1110: 65 20 7b 0a 20 20 54 45 52 4d 49 4e 41 4c 2c 0a  e {.  TERMINAL,.
1120: 20 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 2c 0a 20    NONTERMINAL,. 
1130: 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 0a 7d   MULTITERMINAL.}
1140: 3b 0a 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 7b  ;.enum e_assoc {
1150: 0a 20 20 20 20 4c 45 46 54 2c 0a 20 20 20 20 52  .    LEFT,.    R
1160: 49 47 48 54 2c 0a 20 20 20 20 4e 4f 4e 45 2c 0a  IGHT,.    NONE,.
1170: 20 20 20 20 55 4e 4b 0a 7d 3b 0a 73 74 72 75 63      UNK.};.struc
1180: 74 20 73 79 6d 62 6f 6c 20 7b 0a 20 20 63 6f 6e  t symbol {.  con
1190: 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  st char *name;  
11a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
11b0: 20 74 68 65 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20   the symbol */. 
11c0: 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20   int index;     
11d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11e0: 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ex number for th
11f0: 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65  is symbol */.  e
1200: 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74 79 70 65 20  num symbol_type 
1210: 74 79 70 65 3b 20 20 20 2f 2a 20 53 79 6d 62 6f  type;   /* Symbo
1220: 6c 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65  ls are all eithe
1230: 72 20 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20 4e  r TERMINALS or N
1240: 54 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  Ts */.  struct r
1250: 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20  ule *rule;      
1260: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
1270: 6f 66 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73  of rules of this
1280: 20 28 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a 20   (if an NT) */. 
1290: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
12a0: 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a 20 66 61 6c  fallback; /* fal
12b0: 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 69 6e 20 63  lback token in c
12c0: 61 73 65 20 74 68 69 73 20 74 6f 6b 65 6e 20 64  ase this token d
12d0: 6f 65 73 6e 27 74 20 70 61 72 73 65 20 2a 2f 0a  oesn't parse */.
12e0: 20 20 69 6e 74 20 70 72 65 63 3b 20 20 20 20 20    int prec;     
12f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
1300: 65 63 65 64 65 6e 63 65 20 69 66 20 64 65 66 69  ecedence if defi
1310: 6e 65 64 20 28 2d 31 20 6f 74 68 65 72 77 69 73  ned (-1 otherwis
1320: 65 29 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  e) */.  enum e_a
1330: 73 73 6f 63 20 61 73 73 6f 63 3b 20 20 20 20 20  ssoc assoc;     
1340: 20 2f 2a 20 41 73 73 6f 63 69 61 74 69 76 69 74   /* Associativit
1350: 79 20 69 66 20 70 72 65 63 65 64 65 6e 63 65 20  y if precedence 
1360: 69 73 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  is defined */.  
1370: 63 68 61 72 20 2a 66 69 72 73 74 73 65 74 3b 20  char *firstset; 
1380: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1390: 74 2d 73 65 74 20 66 6f 72 20 61 6c 6c 20 72 75  t-set for all ru
13a0: 6c 65 73 20 6f 66 20 74 68 69 73 20 73 79 6d 62  les of this symb
13b0: 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20  ol */.  Boolean 
13c0: 6c 61 6d 62 64 61 3b 20 20 20 20 20 20 20 20 20  lambda;         
13d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 4e 54 20 61   /* True if NT a
13e0: 6e 64 20 63 61 6e 20 67 65 6e 65 72 61 74 65 20  nd can generate 
13f0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
1400: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 43 6e 74 3b  */.  int useCnt;
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1420: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
1430: 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20   used */.  char 
1440: 2a 64 65 73 74 72 75 63 74 6f 72 3b 20 20 20 20  *destructor;    
1450: 20 20 20 20 2f 2a 20 43 6f 64 65 20 77 68 69 63      /* Code whic
1460: 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65  h executes whene
1470: 76 65 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20  ver this symbol 
1480: 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  is.             
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
14a0: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
14b0: 20 73 74 61 63 6b 20 64 75 72 69 6e 67 20 65 72   stack during er
14c0: 72 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  ror processing *
14d0: 2f 0a 20 20 69 6e 74 20 64 65 73 74 4c 69 6e 65  /.  int destLine
14e0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no;          /* 
14f0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
1500: 73 74 61 72 74 20 6f 66 20 64 65 73 74 72 75 63  start of destruc
1510: 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  tor */.  char *d
1520: 61 74 61 74 79 70 65 3b 20 20 20 20 20 20 20 20  atatype;        
1530: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 74 79    /* The data ty
1540: 70 65 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f  pe of informatio
1550: 6e 20 68 65 6c 64 20 62 79 20 74 68 69 73 0a 20  n held by this. 
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 6a            ** obj
1580: 65 63 74 2e 20 4f 6e 6c 79 20 75 73 65 64 20 69  ect. Only used i
1590: 66 20 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49  f type==NONTERMI
15a0: 4e 41 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 74 6e  NAL */.  int dtn
15b0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
15c0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 74 79    /* The data ty
15d0: 70 65 20 6e 75 6d 62 65 72 2e 20 20 49 6e 20 74  pe number.  In t
15e0: 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 76  he parser, the v
15f0: 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  alue.           
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 2a 2a 20 73 74 61 63 6b 20 69 73 20 61 20 75 6e  ** stack is a un
1620: 69 6f 6e 2e 20 20 54 68 65 20 2e 79 79 25 64 20  ion.  The .yy%d 
1630: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 69 73 0a  element of this.
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 6e             ** un
1660: 69 6f 6e 20 69 73 20 74 68 65 20 63 6f 72 72 65  ion is the corre
1670: 63 74 20 64 61 74 61 20 74 79 70 65 20 66 6f 72  ct data type for
1680: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
1690: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
16a0: 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 75 73  ng fields are us
16b0: 65 64 20 62 79 20 4d 55 4c 54 49 54 45 52 4d 49  ed by MULTITERMI
16c0: 4e 41 4c 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  NALs only */.  i
16d0: 6e 74 20 6e 73 75 62 73 79 6d 3b 20 20 20 20 20  nt nsubsym;     
16e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16f0: 72 20 6f 66 20 63 6f 6e 73 74 69 74 75 65 6e 74  r of constituent
1700: 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20   symbols in the 
1710: 4d 55 4c 54 49 20 2a 2f 0a 20 20 73 74 72 75 63  MULTI */.  struc
1720: 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 75 62 73 79  t symbol **subsy
1730: 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
1740: 63 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62  constituent symb
1750: 6f 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61  ols */.};../* Ea
1760: 63 68 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75  ch production ru
1770: 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  le in the gramma
1780: 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  r is stored in t
1790: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
17a0: 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 73  structure.  */.s
17b0: 74 72 75 63 74 20 72 75 6c 65 20 7b 0a 20 20 73  truct rule {.  s
17c0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68  truct symbol *lh
17d0: 73 3b 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d  s;      /* Left-
17e0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
17f0: 20 72 75 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   rule */.  const
1800: 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b   char *lhsalias;
1810: 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72      /* Alias for
1820: 20 74 68 65 20 4c 48 53 20 28 4e 55 4c 4c 20 69   the LHS (NULL i
1830: 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74  f none) */.  int
1840: 20 6c 68 73 53 74 61 72 74 3b 20 20 20 20 20 20   lhsStart;      
1850: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1860: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
1870: 69 73 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  is the start sym
1880: 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 75 6c  bol */.  int rul
1890: 65 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  eline;          
18a0: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
18b0: 20 66 6f 72 20 74 68 65 20 72 75 6c 65 20 2a 2f   for the rule */
18c0: 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20  .  int nrhs;    
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18e0: 75 6d 62 65 72 20 6f 66 20 52 48 53 20 73 79 6d  umber of RHS sym
18f0: 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  bols */.  struct
1900: 20 73 79 6d 62 6f 6c 20 2a 2a 72 68 73 3b 20 20   symbol **rhs;  
1910: 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 73 79     /* The RHS sy
1920: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  mbols */.  const
1930: 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69 61 73   char **rhsalias
1940: 3b 20 20 20 2f 2a 20 41 6e 20 61 6c 69 61 73 20  ;   /* An alias 
1950: 66 6f 72 20 65 61 63 68 20 52 48 53 20 73 79 6d  for each RHS sym
1960: 62 6f 6c 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e  bol (NULL if non
1970: 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 69 6e 65  e) */.  int line
1980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1990: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
19a0: 61 74 20 77 68 69 63 68 20 63 6f 64 65 20 62 65  at which code be
19b0: 67 69 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  gins */.  const 
19c0: 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20 20 20  char *code;     
19d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 65     /* The code e
19e0: 78 65 63 75 74 65 64 20 77 68 65 6e 20 74 68 69  xecuted when thi
19f0: 73 20 72 75 6c 65 20 69 73 20 72 65 64 75 63 65  s rule is reduce
1a00: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  d */.  struct sy
1a10: 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d 3b 20 20  mbol *precsym;  
1a20: 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 73 79  /* Precedence sy
1a30: 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73 20 72 75  mbol for this ru
1a40: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65  le */.  int inde
1a50: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1a60: 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6e 75 6d   /* An index num
1a70: 62 65 72 20 66 6f 72 20 74 68 69 73 20 72 75 6c  ber for this rul
1a80: 65 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63  e */.  Boolean c
1a90: 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20  anReduce;       
1aa0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1ab0: 72 75 6c 65 20 69 73 20 65 76 65 72 20 72 65 64  rule is ever red
1ac0: 75 63 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  uced */.  struct
1ad0: 20 72 75 6c 65 20 2a 6e 65 78 74 6c 68 73 3b 20   rule *nextlhs; 
1ae0: 20 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20     /* Next rule 
1af0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 4c 48  with the same LH
1b00: 53 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  S */.  struct ru
1b10: 6c 65 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 20  le *next;       
1b20: 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20 69 6e 20  /* Next rule in 
1b30: 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20  the global list 
1b40: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 20 63 6f 6e 66  */.};../* A conf
1b50: 69 67 75 72 61 74 69 6f 6e 20 69 73 20 61 20 70  iguration is a p
1b60: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 6f  roduction rule o
1b70: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 74 6f  f the grammar to
1b80: 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 61  gether with.** a
1b90: 20 6d 61 72 6b 20 28 64 6f 74 29 20 73 68 6f 77   mark (dot) show
1ba0: 69 6e 67 20 68 6f 77 20 6d 75 63 68 20 6f 66 20  ing how much of 
1bb0: 74 68 61 74 20 72 75 6c 65 20 68 61 73 20 62 65  that rule has be
1bc0: 65 6e 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20  en processed so 
1bd0: 66 61 72 2e 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  far..** Configur
1be0: 61 74 69 6f 6e 73 20 61 6c 73 6f 20 63 6f 6e 74  ations also cont
1bf0: 61 69 6e 20 61 20 66 6f 6c 6c 6f 77 2d 73 65 74  ain a follow-set
1c00: 20 77 68 69 63 68 20 69 73 20 61 20 6c 69 73 74   which is a list
1c10: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20   of terminal.** 
1c20: 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 61 72  symbols which ar
1c30: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 69 6d 6d  e allowed to imm
1c40: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 20  ediately follow 
1c50: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
1c60: 75 6c 65 2e 0a 2a 2a 20 45 76 65 72 79 20 63 6f  ule..** Every co
1c70: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 72  nfiguration is r
1c80: 65 63 6f 72 64 65 64 20 61 73 20 61 6e 20 69 6e  ecorded as an in
1c90: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1ca0: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d  llowing: */.enum
1cb0: 20 63 66 67 73 74 61 74 75 73 20 7b 0a 20 20 43   cfgstatus {.  C
1cc0: 4f 4d 50 4c 45 54 45 2c 0a 20 20 49 4e 43 4f 4d  OMPLETE,.  INCOM
1cd0: 50 4c 45 54 45 0a 7d 3b 0a 73 74 72 75 63 74 20  PLETE.};.struct 
1ce0: 63 6f 6e 66 69 67 20 7b 0a 20 20 73 74 72 75 63  config {.  struc
1cf0: 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 20  t rule *rp;     
1d00: 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20      /* The rule 
1d10: 75 70 6f 6e 20 77 68 69 63 68 20 74 68 65 20 63  upon which the c
1d20: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20  onfiguration is 
1d30: 62 61 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  based */.  int d
1d40: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
1d50: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
1d60: 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 63 68 61 72   point */.  char
1d70: 20 2a 66 77 73 3b 20 20 20 20 20 20 20 20 20 20   *fws;          
1d80: 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73       /* Follow-s
1d90: 65 74 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 66  et for this conf
1da0: 69 67 75 72 61 74 69 6f 6e 20 6f 6e 6c 79 20 2a  iguration only *
1db0: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
1dc0: 20 2a 66 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20   *fplp;      /* 
1dd0: 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 77 61  Follow-set forwa
1de0: 72 64 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  rd propagation l
1df0: 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  inks */.  struct
1e00: 20 70 6c 69 6e 6b 20 2a 62 70 6c 70 3b 20 20 20   plink *bplp;   
1e10: 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74     /* Follow-set
1e20: 20 62 61 63 6b 77 61 72 64 73 20 70 72 6f 70 61   backwards propa
1e30: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a  gation links */.
1e40: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1e50: 73 74 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  stp;       /* Po
1e60: 69 6e 74 65 72 20 74 6f 20 73 74 61 74 65 20 77  inter to state w
1e70: 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68  hich contains th
1e80: 69 73 20 2a 2f 0a 20 20 65 6e 75 6d 20 63 66 67  is */.  enum cfg
1e90: 73 74 61 74 75 73 20 73 74 61 74 75 73 3b 20 20  status status;  
1ea0: 20 2f 2a 20 75 73 65 64 20 64 75 72 69 6e 67 20   /* used during 
1eb0: 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20 73 68  followset and sh
1ec0: 69 66 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 73  ift computations
1ed0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
1ee0: 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f  fig *next;     /
1ef0: 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75 72 61  * Next configura
1f00: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74  tion in the stat
1f10: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  e */.  struct co
1f20: 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20  nfig *bp;       
1f30: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61 73 69  /* The next basi
1f40: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
1f50: 2a 2f 0a 7d 3b 0a 0a 65 6e 75 6d 20 65 5f 61 63  */.};..enum e_ac
1f60: 74 69 6f 6e 20 7b 0a 20 20 53 48 49 46 54 2c 0a  tion {.  SHIFT,.
1f70: 20 20 41 43 43 45 50 54 2c 0a 20 20 52 45 44 55    ACCEPT,.  REDU
1f80: 43 45 2c 0a 20 20 45 52 52 4f 52 2c 0a 20 20 53  CE,.  ERROR,.  S
1f90: 53 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20 20  SCONFLICT,      
1fa0: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 68 69          /* A shi
1fb0: 66 74 2f 73 68 69 66 74 20 63 6f 6e 66 6c 69 63  ft/shift conflic
1fc0: 74 20 2a 2f 0a 20 20 53 52 43 4f 4e 46 4c 49 43  t */.  SRCONFLIC
1fd0: 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
1fe0: 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c  /* Was a reduce,
1ff0: 20 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63   but part of a c
2000: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 52 52 43  onflict */.  RRC
2010: 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20  ONFLICT,        
2020: 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72        /* Was a r
2030: 65 64 75 63 65 2c 20 62 75 74 20 70 61 72 74 20  educe, but part 
2040: 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  of a conflict */
2050: 0a 20 20 53 48 5f 52 45 53 4f 4c 56 45 44 2c 20  .  SH_RESOLVED, 
2060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2070: 61 73 20 61 20 73 68 69 66 74 2e 20 20 50 72 65  as a shift.  Pre
2080: 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64  cedence resolved
2090: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 52   conflict */.  R
20a0: 44 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20  D_RESOLVED,     
20b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 72          /* Was r
20c0: 65 64 75 63 65 2e 20 20 50 72 65 63 65 64 65 6e  educe.  Preceden
20d0: 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66  ce resolved conf
20e0: 6c 69 63 74 20 2a 2f 0a 20 20 4e 4f 54 5f 55 53  lict */.  NOT_US
20f0: 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ED              
2100: 20 20 20 2f 2a 20 44 65 6c 65 74 65 64 20 62 79     /* Deleted by
2110: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a   compression */.
2120: 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20 73 68 69  };../* Every shi
2130: 66 74 20 6f 72 20 72 65 64 75 63 65 20 6f 70 65  ft or reduce ope
2140: 72 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64  ration is stored
2150: 20 61 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   as one of the f
2160: 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 72 75  ollowing */.stru
2170: 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20 20 73 74  ct action {.  st
2180: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
2190: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
21a0: 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62 6f 6c 20  ok-ahead symbol 
21b0: 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74 69  */.  enum e_acti
21c0: 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e 69 6f 6e  on type;.  union
21d0: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74   {.    struct st
21e0: 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a  ate *stp;     /*
21f0: 20 54 68 65 20 6e 65 77 20 73 74 61 74 65 2c 20   The new state, 
2200: 69 66 20 61 20 73 68 69 66 74 20 2a 2f 0a 20 20  if a shift */.  
2210: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
2220: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
2230: 72 75 6c 65 2c 20 69 66 20 61 20 72 65 64 75 63  rule, if a reduc
2240: 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20 20 73 74  e */.  } x;.  st
2250: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78  ruct action *nex
2260: 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61  t;     /* Next a
2270: 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 73  ction for this s
2280: 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  tate */.  struct
2290: 20 61 63 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65   action *collide
22a0: 3b 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f  ;  /* Next actio
22b0: 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
22c0: 68 61 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45  hash */.};../* E
22d0: 61 63 68 20 73 74 61 74 65 20 6f 66 20 74 68 65  ach state of the
22e0: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
22f0: 72 27 73 20 66 69 6e 69 74 65 20 73 74 61 74 65  r's finite state
2300: 20 6d 61 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65   machine.** is e
2310: 6e 63 6f 64 65 64 20 61 73 20 61 6e 20 69 6e 73  ncoded as an ins
2320: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
2330: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
2340: 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
2350: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  e {.  struct con
2360: 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f  fig *bp;       /
2370: 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66  * The basis conf
2380: 69 67 75 72 61 74 69 6f 6e 73 20 66 6f 72 20 74  igurations for t
2390: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
23a0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
23b0: 70 3b 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63  p;      /* All c
23c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 69 6e  onfigurations in
23d0: 20 74 68 69 73 20 73 65 74 20 2a 2f 0a 20 20 69   this set */.  i
23e0: 6e 74 20 73 74 61 74 65 6e 75 6d 3b 20 20 20 20  nt statenum;    
23f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65          /* Seque
2400: 6e 74 69 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72  ntial number for
2410: 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20   this state */. 
2420: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
2430: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ap;       /* Arr
2440: 61 79 20 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f  ay of actions fo
2450: 72 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a  r this state */.
2460: 20 20 69 6e 74 20 6e 54 6b 6e 41 63 74 2c 20 6e    int nTknAct, n
2470: 4e 74 41 63 74 3b 20 20 20 20 20 2f 2a 20 4e 75  NtAct;     /* Nu
2480: 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
2490: 6f 6e 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  on terminals and
24a0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 2a 2f   nonterminals */
24b0: 0a 20 20 69 6e 74 20 69 54 6b 6e 4f 66 73 74 2c  .  int iTknOfst,
24c0: 20 69 4e 74 4f 66 73 74 3b 20 20 20 2f 2a 20 79   iNtOfst;   /* y
24d0: 79 5f 61 63 74 69 6f 6e 5b 5d 20 6f 66 66 73 65  y_action[] offse
24e0: 74 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 73 20  t for terminals 
24f0: 61 6e 64 20 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a  and nonterms */.
2500: 20 20 69 6e 74 20 69 44 66 6c 74 3b 20 20 20 20    int iDflt;    
2510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
2520: 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 2a 2f 0a  fault action */.
2530: 7d 3b 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46  };.#define NO_OF
2540: 46 53 45 54 20 28 2d 32 31 34 37 34 38 33 36 34  FSET (-214748364
2550: 37 29 0a 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73  7)../* A follows
2560: 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  et propagation l
2570: 69 6e 6b 20 69 6e 64 69 63 61 74 65 73 20 74 68  ink indicates th
2580: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
2590: 6f 66 20 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67  of one.** config
25a0: 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65  uration followse
25b0: 74 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 70  t should be prop
25c0: 61 67 61 74 65 64 20 74 6f 20 61 6e 6f 74 68 65  agated to anothe
25d0: 72 20 77 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68  r whenever.** th
25e0: 65 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 2e  e first changes.
25f0: 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b   */.struct plink
2600: 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
2610: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
2620: 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   The configurati
2630: 6f 6e 20 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b  on to which link
2640: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70  ed */.  struct p
2650: 6c 69 6e 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20  link *next;     
2660: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 72 6f   /* The next pro
2670: 70 61 67 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d  pagate link */.}
2680: 3b 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20  ;../* The state 
2690: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 65  vector for the e
26a0: 6e 74 69 72 65 20 70 61 72 73 65 72 20 67 65 6e  ntire parser gen
26b0: 65 72 61 74 6f 72 20 69 73 20 72 65 63 6f 72 64  erator is record
26c0: 65 64 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  ed as.** follows
26d0: 2e 20 20 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e  .  (LEMON uses n
26e0: 6f 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  o global variabl
26f0: 65 73 20 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74  es and makes lit
2700: 74 6c 65 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74  tle use of.** st
2710: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 2e 20  atic variables. 
2720: 20 46 69 65 6c 64 73 20 69 6e 20 74 68 65 20 66   Fields in the f
2730: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2740: 72 65 20 63 61 6e 20 62 65 20 74 68 6f 75 67 68  re can be though
2750: 74 0a 2a 2a 20 6f 66 20 61 73 20 62 65 67 69 6e  t.** of as begin
2760: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
2770: 73 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d  s in the program
2780: 2e 29 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d  .) */.struct lem
2790: 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  on {.  struct st
27a0: 61 74 65 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20  ate **sorted;   
27b0: 2f 2a 20 54 61 62 6c 65 20 6f 66 20 73 74 61 74  /* Table of stat
27c0: 65 73 20 73 6f 72 74 65 64 20 62 79 20 73 74 61  es sorted by sta
27d0: 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  te number */.  s
27e0: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65  truct rule *rule
27f0: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
2800: 6f 66 20 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a  of all rules */.
2810: 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20 20    int nstate;   
2820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2830: 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20 2a  mber of states *
2840: 2f 0a 20 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20  /.  int nrule;  
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2860: 4e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20  Number of rules 
2870: 2a 2f 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c  */.  int nsymbol
2880: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2890: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 69   Number of termi
28a0: 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69  nal and nontermi
28b0: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  nal symbols */. 
28c0: 20 69 6e 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20   int nterminal; 
28d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28e0: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
28f0: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72  symbols */.  str
2900: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d  uct symbol **sym
2910: 62 6f 6c 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20  bols; /* Sorted 
2920: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
2930: 73 20 74 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  s to symbols */.
2940: 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2960: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a  mber of errors *
2970: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
2980: 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20  l *errsym;   /* 
2990: 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c  The error symbol
29a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
29b0: 62 6f 6c 20 2a 77 69 6c 64 63 61 72 64 3b 20 2f  bol *wildcard; /
29c0: 2a 20 54 6f 6b 65 6e 20 74 68 61 74 20 6d 61 74  * Token that mat
29d0: 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20 2a 2f  ches anything */
29e0: 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  .  char *name;  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a00: 61 6d 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ame of the gener
2a10: 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 20  ated parser */. 
2a20: 20 63 68 61 72 20 2a 61 72 67 3b 20 20 20 20 20   char *arg;     
2a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63            /* Dec
2a40: 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  laration of the 
2a50: 33 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3th argument to 
2a60: 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72  parser */.  char
2a70: 20 2a 74 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20   *tokentype;    
2a80: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
2a90: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
2aa0: 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73   in the parser s
2ab0: 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tack */.  char *
2ac0: 76 61 72 74 79 70 65 3b 20 20 20 20 20 20 20 20  vartype;        
2ad0: 20 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c     /* The defaul
2ae0: 74 20 74 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65  t type of non-te
2af0: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a  rminal symbols *
2b00: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 72 74 3b  /.  char *start;
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b20: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 72  Name of the star
2b30: 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65  t symbol for the
2b40: 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68   grammar */.  ch
2b50: 61 72 20 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20  ar *stacksize;  
2b60: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2b70: 66 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61  f the parser sta
2b80: 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e  ck */.  char *in
2b90: 63 6c 75 64 65 3b 20 20 20 20 20 20 20 20 20 20  clude;          
2ba0: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 75 74 20   /* Code to put 
2bb0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2bc0: 74 68 65 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20  the C file */.  
2bd0: 63 68 61 72 20 2a 65 72 72 6f 72 3b 20 20 20 20  char *error;    
2be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2bf0: 20 74 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e   to execute when
2c00: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
2c10: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65  n */.  char *ove
2c20: 72 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20  rflow;          
2c30: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
2c40: 74 65 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76  te on a stack ov
2c50: 65 72 66 6c 6f 77 20 2a 2f 0a 20 20 63 68 61 72  erflow */.  char
2c60: 20 2a 66 61 69 6c 75 72 65 3b 20 20 20 20 20 20   *failure;      
2c70: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
2c80: 65 78 65 63 75 74 65 20 6f 6e 20 70 61 72 73 65  execute on parse
2c90: 72 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 63  r failure */.  c
2ca0: 68 61 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20  har *accept;    
2cb0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2cc0: 74 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e 20  to execute when 
2cd0: 74 68 65 20 70 61 72 73 65 72 20 65 78 63 65 70  the parser excep
2ce0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78  ts */.  char *ex
2cf0: 74 72 61 63 6f 64 65 3b 20 20 20 20 20 20 20 20  tracode;        
2d00: 20 2f 2a 20 43 6f 64 65 20 61 70 70 65 6e 64 65   /* Code appende
2d10: 64 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74  d to the generat
2d20: 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ed file */.  cha
2d30: 72 20 2a 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20  r *tokendest;   
2d40: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
2d50: 20 65 78 65 63 75 74 65 20 74 6f 20 64 65 73 74   execute to dest
2d60: 72 6f 79 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a  roy token data *
2d70: 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 64 65 73  /.  char *vardes
2d80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
2d90: 43 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 66  Code for the def
2da0: 61 75 6c 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  ault non-termina
2db0: 6c 20 64 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a  l destructor */.
2dc0: 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65    char *filename
2dd0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ;          /* Na
2de0: 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
2df0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2e00: 6f 75 74 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  outname;        
2e10: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2e20: 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
2e30: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2e40: 2a 74 6f 6b 65 6e 70 72 65 66 69 78 3b 20 20 20  *tokenprefix;   
2e50: 20 20 20 20 2f 2a 20 41 20 70 72 65 66 69 78 20      /* A prefix 
2e60: 61 64 64 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e  added to token n
2e70: 61 6d 65 73 20 69 6e 20 74 68 65 20 2e 68 20 66  ames in the .h f
2e80: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f  ile */.  int nco
2e90: 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20  nflict;         
2ea0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2eb0: 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73  arsing conflicts
2ec0: 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 6c 65 73   */.  int tables
2ed0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ize;           /
2ee0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
2ef0: 72 73 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  rse tables */.  
2f00: 69 6e 74 20 62 61 73 69 73 66 6c 61 67 3b 20 20  int basisflag;  
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6e           /* Prin
2f20: 74 20 6f 6e 6c 79 20 62 61 73 69 73 20 63 6f 6e  t only basis con
2f30: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20  figurations */. 
2f40: 20 69 6e 74 20 68 61 73 5f 66 61 6c 6c 62 61 63   int has_fallbac
2f50: 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  k;        /* Tru
2f60: 65 20 69 66 20 61 6e 79 20 25 66 61 6c 6c 62 61  e if any %fallba
2f70: 63 6b 20 69 73 20 73 65 65 6e 20 69 6e 20 74 68  ck is seen in th
2f80: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 69  e grammar */.  i
2f90: 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  nt nolinenosflag
2fa0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
2fb0: 69 66 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65  if #line stateme
2fc0: 6e 74 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  nts should not b
2fd0: 65 20 70 72 69 6e 74 65 64 20 2a 2f 0a 20 20 63  e printed */.  c
2fe0: 68 61 72 20 2a 61 72 67 76 30 3b 20 20 20 20 20  har *argv0;     
2ff0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
3000: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 2a  of the program *
3010: 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 4d 65  /.};..#define Me
3020: 6d 6f 72 79 43 68 65 63 6b 28 58 29 20 69 66 28  moryCheck(X) if(
3030: 28 58 29 3d 3d 30 29 7b 20 5c 0a 20 20 65 78 74  (X)==0){ \.  ext
3040: 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f  ern void memory_
3050: 65 72 72 6f 72 28 29 3b 20 5c 0a 20 20 6d 65 6d  error(); \.  mem
3060: 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 7d  ory_error(); \.}
3070: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
3080: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
3090: 65 20 22 74 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a  e "table.h" ****
30a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
30c0: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e  *.** All code in
30d0: 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62   this file has b
30e0: 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  een automaticall
30f0: 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66  y generated.** f
3100: 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74  rom a specificat
3110: 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  ion in the file.
3120: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
3130: 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20  "table.q".** by 
3140: 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20  the associative 
3150: 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64  array code build
3160: 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67  ing program "aag
3170: 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65  en"..** Do not e
3180: 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20  dit this file!  
3190: 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68  Instead, edit th
31a0: 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a  e specification.
31b0: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ** file, then re
31c0: 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a  run aagen..*/./*
31d0: 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f  .** Code for pro
31e0: 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69  cessing tables i
31f0: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
3200: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
3210: 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72  ./* Routines for
3220: 20 68 61 6e 64 6c 69 6e 67 20 61 20 73 74 72 69   handling a stri
3230: 6e 67 73 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68  ngs */..const ch
3240: 61 72 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73  ar *Strsafe(cons
3250: 74 20 63 68 61 72 20 2a 29 3b 0a 0a 76 6f 69 64  t char *);..void
3260: 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 76 6f   Strsafe_init(vo
3270: 69 64 29 3b 0a 69 6e 74 20 53 74 72 73 61 66 65  id);.int Strsafe
3280: 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74 20 63 68  _insert(const ch
3290: 61 72 20 2a 29 3b 0a 63 6f 6e 73 74 20 63 68 61  ar *);.const cha
32a0: 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28  r *Strsafe_find(
32b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a  const char *);..
32c0: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20  /* Routines for 
32d0: 68 61 6e 64 6c 69 6e 67 20 73 79 6d 62 6f 6c 73  handling symbols
32e0: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
32f0: 2a 2f 0a 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  */..struct symbo
3300: 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f  l *Symbol_new(co
3310: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 69 6e 74  nst char *);.int
3320: 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73   Symbolcmpp(cons
3330: 74 20 76 6f 69 64 20 2a 2c 20 63 6f 6e 73 74 20  t void *, const 
3340: 76 6f 69 64 20 2a 29 3b 0a 76 6f 69 64 20 53 79  void *);.void Sy
3350: 6d 62 6f 6c 5f 69 6e 69 74 28 76 6f 69 64 29 3b  mbol_init(void);
3360: 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
3370: 72 74 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  rt(struct symbol
3380: 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   *, const char *
3390: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
33a0: 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f   *Symbol_find(co
33b0: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72  nst char *);.str
33c0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
33d0: 6f 6c 5f 4e 74 68 28 69 6e 74 29 3b 0a 69 6e 74  ol_Nth(int);.int
33e0: 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 76 6f   Symbol_count(vo
33f0: 69 64 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  id);.struct symb
3400: 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61  ol **Symbol_arra
3410: 79 6f 66 28 76 6f 69 64 29 3b 0a 0a 2f 2a 20 52  yof(void);../* R
3420: 6f 75 74 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67  outines to manag
3430: 65 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  e the state tabl
3440: 65 20 2a 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67  e */..int Config
3450: 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  cmp(const char *
3460: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  , const char *);
3470: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53  .struct state *S
3480: 74 61 74 65 5f 6e 65 77 28 76 6f 69 64 29 3b 0a  tate_new(void);.
3490: 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28  void State_init(
34a0: 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74 61 74 65  void);.int State
34b0: 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73  _insert(struct s
34c0: 74 61 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63  tate *, struct c
34d0: 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74  onfig *);.struct
34e0: 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69   state *State_fi
34f0: 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  nd(struct config
3500: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74   *);.struct stat
3510: 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f  e **State_arrayo
3520: 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52  f(/*  */);../* R
3530: 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72  outines used for
3540: 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e 20 43   efficiency in C
3550: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20 2a 2f  onfiglist_add */
3560: 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62  ..void Configtab
3570: 6c 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69  le_init(void);.i
3580: 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  nt Configtable_i
3590: 6e 73 65 72 74 28 73 74 72 75 63 74 20 63 6f 6e  nsert(struct con
35a0: 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 63  fig *);.struct c
35b0: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62  onfig *Configtab
35c0: 6c 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63  le_find(struct c
35d0: 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43  onfig *);.void C
35e0: 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72  onfigtable_clear
35f0: 28 69 6e 74 28 2a 29 28 73 74 72 75 63 74 20 63  (int(*)(struct c
3600: 6f 6e 66 69 67 20 2a 29 29 3b 0a 0a 2f 2a 2a 2a  onfig *));../***
3610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
3620: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61  From the file "a
3630: 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  ction.c" *******
3640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3650: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
3660: 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73  Routines process
3670: 69 6e 67 20 70 61 72 73 65 72 20 61 63 74 69 6f  ing parser actio
3680: 6e 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  ns in the LEMON 
3690: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
36a0: 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  ..*/../* Allocat
36b0: 65 20 61 20 6e 65 77 20 70 61 72 73 65 72 20 61  e a new parser a
36c0: 63 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ction */.static 
36d0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
36e0: 63 74 69 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 7b  ction_new(void){
36f0: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
3700: 20 61 63 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73   action *freelis
3710: 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
3720: 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f  action *newactio
3730: 6e 3b 0a 0a 20 20 69 66 28 20 66 72 65 65 6c 69  n;..  if( freeli
3740: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
3750: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
3760: 3d 20 31 30 30 3b 0a 20 20 20 20 66 72 65 65 6c  = 100;.    freel
3770: 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 61 63  ist = (struct ac
3780: 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28 61 6d  tion *)calloc(am
3790: 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  t, sizeof(struct
37a0: 20 61 63 74 69 6f 6e 29 29 3b 0a 20 20 20 20 69   action));.    i
37b0: 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29  f( freelist==0 )
37c0: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
37d0: 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74  stderr,"Unable t
37e0: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
37f0: 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61 72 73  y for a new pars
3800: 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20 20  er action.");.  
3810: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
3820: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
3830: 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72  i<amt-1; i++) fr
3840: 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d  eelist[i].next =
3850: 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b   &freelist[i+1];
3860: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d  .    freelist[am
3870: 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20  t-1].next = 0;. 
3880: 20 7d 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d   }.  newaction =
3890: 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65   freelist;.  fre
38a0: 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74  elist = freelist
38b0: 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  ->next;.  return
38c0: 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f   newaction;.}../
38d0: 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 61 63  * Compare two ac
38e0: 74 69 6f 6e 73 20 66 6f 72 20 73 6f 72 74 69 6e  tions for sortin
38f0: 67 20 70 75 72 70 6f 73 65 73 2e 20 20 52 65 74  g purposes.  Ret
3900: 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
3910: 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69 74 69  ro, or.** positi
3920: 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ve if the first 
3930: 61 63 74 69 6f 6e 20 69 73 20 6c 65 73 73 20 74  action is less t
3940: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
3950: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a  r greater than.*
3960: 2a 20 74 68 65 20 66 69 72 73 74 0a 2a 2f 0a 73  * the first.*/.s
3970: 74 61 74 69 63 20 69 6e 74 20 61 63 74 69 6f 6e  tatic int action
3980: 63 6d 70 28 0a 20 20 73 74 72 75 63 74 20 61 63  cmp(.  struct ac
3990: 74 69 6f 6e 20 2a 61 70 31 2c 0a 20 20 73 74 72  tion *ap1,.  str
39a0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 32 0a  uct action *ap2.
39b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
39c0: 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64  c = ap1->sp->ind
39d0: 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e  ex - ap2->sp->in
39e0: 64 65 78 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  dex;.  if( rc==0
39f0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 28 69 6e   ){.    rc = (in
3a00: 74 29 61 70 31 2d 3e 74 79 70 65 20 2d 20 28 69  t)ap1->type - (i
3a10: 6e 74 29 61 70 32 2d 3e 74 79 70 65 3b 0a 20 20  nt)ap2->type;.  
3a20: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 26 26  }.  if( rc==0 &&
3a30: 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52 45 44 55   ap1->type==REDU
3a40: 43 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  CE ){.    rc = a
3a50: 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  p1->x.rp->index 
3a60: 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64  - ap2->x.rp->ind
3a70: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ex;.  }.  if( rc
3a80: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
3a90: 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61 70 31  (int) (ap2 - ap1
3aa0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3ab0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70  rc;.}../* Sort p
3ac0: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f  arser actions */
3ad0: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
3ae0: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f  ction *Action_so
3af0: 72 74 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  rt(.  struct act
3b00: 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20  ion *ap.){.  ap 
3b10: 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  = (struct action
3b20: 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a   *)msort((char *
3b30: 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70  )ap,(char **)&ap
3b40: 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ->next,.        
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28 63 6f        (int(*)(co
3b70: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
3b80: 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70  char*))actioncmp
3b90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a  );.  return ap;.
3ba0: 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61  }..void Action_a
3bb0: 64 64 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  dd(.  struct act
3bc0: 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65 6e 75  ion **app,.  enu
3bd0: 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 2c  m e_action type,
3be0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3bf0: 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a 61 72   *sp,.  char *ar
3c00: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 61 63  g.){.  struct ac
3c10: 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b  tion *newaction;
3c20: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 41  .  newaction = A
3c30: 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e  ction_new();.  n
3c40: 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74 20 3d  ewaction->next =
3c50: 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20   *app;.  *app = 
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 2d 3e 74 79 70 65 20 3d 20 74  action->type = t
3c80: 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ype;.  newaction
3c90: 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69 66 28  ->sp = sp;.  if(
3ca0: 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a   type==SHIFT ){.
3cb0: 20 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78      newaction->x
3cc0: 2e 73 74 70 20 3d 20 28 73 74 72 75 63 74 20 73  .stp = (struct s
3cd0: 74 61 74 65 20 2a 29 61 72 67 3b 0a 20 20 7d 65  tate *)arg;.  }e
3ce0: 6c 73 65 7b 0a 20 20 20 20 6e 65 77 61 63 74 69  lse{.    newacti
3cf0: 6f 6e 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75  on->x.rp = (stru
3d00: 63 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20  ct rule *)arg;. 
3d10: 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
3d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77  ************ New
3d30: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
3d40: 6e 74 20 74 68 65 20 22 61 63 74 74 61 62 22 20  nt the "acttab" 
3d50: 6d 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  module *********
3d60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  **/./*.** This m
3d70: 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73  odule implements
3d80: 20 72 6f 75 74 69 6e 65 73 20 75 73 65 20 74 6f   routines use to
3d90: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 79   construct the y
3da0: 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65  y_action[] table
3db0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ..*/../*.** The 
3dc0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 79 79 5f  state of the yy_
3dd0: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64  action table und
3de0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
3df0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
3e00: 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  f.** the followi
3e10: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
3e20: 0a 2a 2a 20 54 68 65 20 79 79 5f 61 63 74 69 6f  .** The yy_actio
3e30: 6e 20 74 61 62 6c 65 20 6d 61 70 73 20 74 68 65  n table maps the
3e40: 20 70 61 69 72 20 28 73 74 61 74 65 5f 6e 75 6d   pair (state_num
3e50: 62 65 72 2c 20 6c 6f 6f 6b 61 68 65 61 64 29 20  ber, lookahead) 
3e60: 69 6e 74 6f 20 61 6e 0a 2a 2a 20 61 63 74 69 6f  into an.** actio
3e70: 6e 5f 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 74  n_number.  The t
3e80: 61 62 6c 65 20 69 73 20 61 6e 20 61 72 72 61 79  able is an array
3e90: 20 6f 66 20 69 6e 74 65 67 65 72 73 20 70 61 69   of integers pai
3ea0: 72 73 2e 20 20 54 68 65 20 73 74 61 74 65 5f 6e  rs.  The state_n
3eb0: 75 6d 62 65 72 0a 2a 2a 20 64 65 74 65 72 6d 69  umber.** determi
3ec0: 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 20 6f  nes an initial o
3ed0: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 79  ffset into the y
3ee0: 79 5f 61 63 74 69 6f 6e 20 61 72 72 61 79 2e 20  y_action array. 
3ef0: 20 54 68 65 20 6c 6f 6f 6b 61 68 65 61 64 0a 2a   The lookahead.*
3f00: 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65 6e 20  * value is then 
3f10: 61 64 64 65 64 20 74 6f 20 74 68 69 73 20 69 6e  added to this in
3f20: 69 74 69 61 6c 20 6f 66 66 73 65 74 20 74 6f 20  itial offset to 
3f30: 67 65 74 20 61 6e 20 69 6e 64 65 78 20 58 20 69  get an index X i
3f40: 6e 74 6f 20 74 68 65 0a 2a 2a 20 79 79 5f 61 63  nto the.** yy_ac
3f50: 74 69 6f 6e 20 61 72 72 61 79 2e 20 49 66 20 74  tion array. If t
3f60: 68 65 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 6c 6f  he aAction[X].lo
3f70: 6f 6b 61 68 65 61 64 20 65 71 75 61 6c 73 20 74  okahead equals t
3f80: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  he value of the.
3f90: 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68  ** of the lookah
3fa0: 65 61 64 20 69 6e 70 75 74 2c 20 74 68 65 6e 20  ead input, then 
3fb0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3fc0: 20 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72 20 6f   action_number o
3fd0: 75 74 70 75 74 20 69 73 0a 2a 2a 20 61 41 63 74  utput is.** aAct
3fe0: 69 6f 6e 5b 58 5d 2e 61 63 74 69 6f 6e 2e 20 20  ion[X].action.  
3ff0: 49 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  If the lookahead
4000: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
4010: 68 65 6e 20 74 68 65 0a 2a 2a 20 64 65 66 61 75  hen the.** defau
4020: 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  lt action for th
4030: 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 69  e state_number i
4040: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
4050: 2a 20 41 6c 6c 20 61 63 74 69 6f 6e 73 20 61 73  * All actions as
4060: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
4070: 73 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d  single state_num
4080: 62 65 72 20 61 72 65 20 66 69 72 73 74 20 65 6e  ber are first en
4090: 74 65 72 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 4c  tered.** into aL
40a0: 6f 6f 6b 61 68 65 61 64 5b 5d 20 75 73 69 6e 67  ookahead[] using
40b0: 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20   multiple calls 
40c0: 74 6f 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  to acttab_action
40d0: 28 29 2e 20 20 54 68 65 6e 20 74 68 65 20 0a 2a  ().  Then the .*
40e0: 2a 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68  * actions for th
40f0: 61 74 20 73 69 6e 67 6c 65 20 73 74 61 74 65 5f  at single state_
4100: 6e 75 6d 62 65 72 20 61 72 65 20 70 6c 61 63 65  number are place
4110: 64 20 69 6e 74 6f 20 74 68 65 20 61 41 63 74 69  d into the aActi
4120: 6f 6e 5b 5d 20 0a 2a 2a 20 61 72 72 61 79 20 77  on[] .** array w
4130: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ith a single cal
4140: 6c 20 74 6f 20 61 63 74 74 61 62 5f 69 6e 73 65  l to acttab_inse
4150: 72 74 28 29 2e 20 20 54 68 65 20 61 63 74 74 61  rt().  The actta
4160: 62 5f 69 6e 73 65 72 74 28 29 20 63 61 6c 6c 0a  b_insert() call.
4170: 2a 2a 20 61 6c 73 6f 20 72 65 73 65 74 73 20 74  ** also resets t
4180: 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  he aLookahead[] 
4190: 61 72 72 61 79 20 69 6e 20 70 72 65 70 61 72 61  array in prepara
41a0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 78  tion for the nex
41b0: 74 0a 2a 2a 20 73 74 61 74 65 20 6e 75 6d 62 65  t.** state numbe
41c0: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 6f  r..*/.struct loo
41d0: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 7b 0a  kahead_action {.
41e0: 20 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 3b    int lookahead;
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4200: 56 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  Value of the loo
4210: 6b 61 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a  kahead token */.
4220: 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20    int action;   
4230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4240: 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f  Action to take o
4250: 6e 20 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b  n the given look
4260: 61 68 65 61 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65  ahead */.};.type
4270: 64 65 66 20 73 74 72 75 63 74 20 61 63 74 74 61  def struct actta
4280: 62 20 61 63 74 74 61 62 3b 0a 73 74 72 75 63 74  b acttab;.struct
4290: 20 61 63 74 74 61 62 20 7b 0a 20 20 69 6e 74 20   acttab {.  int 
42a0: 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  nAction;        
42b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
42c0: 65 72 20 6f 66 20 75 73 65 64 20 73 6c 6f 74 73  er of used slots
42d0: 20 69 6e 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f   in aAction[] */
42e0: 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 41 6c  .  int nActionAl
42f0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
4300: 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74  /* Slots allocat
4310: 65 64 20 66 6f 72 20 61 41 63 74 69 6f 6e 5b 5d  ed for aAction[]
4320: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 6f   */.  struct loo
4330: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 0a 20 20  kahead_action.  
4340: 20 20 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20 20    *aAction,     
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4360: 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  The yy_action[] 
4370: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
4380: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
4390: 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20  *aLookahead;    
43a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
43b0: 73 69 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e 73  single new trans
43c0: 61 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20  action set */.  
43d0: 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b  int mnLookahead;
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
43f0: 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65  Minimum aLookahe
4400: 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a  ad[].lookahead *
4410: 2f 0a 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f 6e  /.  int mnAction
4420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4430: 20 2f 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f 63   /* Action assoc
4440: 69 61 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f 6f  iated with mnLoo
4450: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
4460: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20  mxLookahead;    
4470: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
4480: 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d  mum aLookahead[]
4490: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20  .lookahead */.  
44a0: 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  int nLookahead; 
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
44c0: 55 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 4c  Used slots in aL
44d0: 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20  ookahead[] */.  
44e0: 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c  int nLookaheadAl
44f0: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  loc;         /* 
4500: 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20  Slots allocated 
4510: 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  in aLookahead[] 
4520: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e  */.};../* Return
4530: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
4540: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79 79  ntries in the yy
4550: 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f  _action table */
4560: 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f  .#define acttab_
4570: 73 69 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e 41  size(X) ((X)->nA
4580: 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76  ction)../* The v
4590: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74  alue for the N-t
45a0: 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 61 63  h entry in yy_ac
45b0: 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  tion */.#define 
45c0: 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28  acttab_yyaction(
45d0: 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74  X,N)  ((X)->aAct
45e0: 69 6f 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a  ion[N].action)..
45f0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72  /* The value for
4600: 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20   the N-th entry 
4610: 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20  in yy_lookahead 
4620: 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61  */.#define actta
4630: 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c  b_yylookahead(X,
4640: 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f  N)  ((X)->aActio
4650: 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a  n[N].lookahead).
4660: 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  ./* Free all mem
4670: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
4680: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 63  ith the given ac
4690: 74 74 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74  ttab */.void act
46a0: 74 61 62 5f 66 72 65 65 28 61 63 74 74 61 62 20  tab_free(acttab 
46b0: 2a 70 29 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e  *p){.  free( p->
46c0: 61 41 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65  aAction );.  fre
46d0: 65 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  e( p->aLookahead
46e0: 20 29 3b 0a 20 20 66 72 65 65 28 20 70 20 29 3b   );.  free( p );
46f0: 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  .}../* Allocate 
4700: 61 20 6e 65 77 20 61 63 74 74 61 62 20 73 74 72  a new acttab str
4710: 75 63 74 75 72 65 20 2a 2f 0a 61 63 74 74 61 62  ucture */.acttab
4720: 20 2a 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 76   *acttab_alloc(v
4730: 6f 69 64 29 7b 0a 20 20 61 63 74 74 61 62 20 2a  oid){.  acttab *
4740: 70 20 3d 20 28 61 63 74 74 61 62 20 2a 29 20 63  p = (acttab *) c
4750: 61 6c 6c 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66  alloc( 1, sizeof
4760: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
4770: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
4780: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
4790: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
47a0: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 61 63  ory for a new ac
47b0: 74 74 61 62 2e 22 29 3b 0a 20 20 20 20 65 78 69  ttab.");.    exi
47c0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  t(1);.  }.  mems
47d0: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
47e0: 2a 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  *p));.  return p
47f0: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65  ;.}../* Add a ne
4800: 77 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  w action to the 
4810: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
4820: 69 6f 6e 20 73 65 74 2e 20 20 0a 2a 2a 0a 2a 2a  ion set.  .**.**
4830: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4840: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
4850: 20 65 61 63 68 20 6c 6f 6f 6b 61 68 65 61 64 20   each lookahead 
4860: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
4870: 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f  .** state..*/.vo
4880: 69 64 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  id acttab_action
4890: 28 61 63 74 74 61 62 20 2a 70 2c 20 69 6e 74 20  (acttab *p, int 
48a0: 6c 6f 6f 6b 61 68 65 61 64 2c 20 69 6e 74 20 61  lookahead, int a
48b0: 63 74 69 6f 6e 29 7b 0a 20 20 69 66 28 20 70 2d  ction){.  if( p-
48c0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d 3e  >nLookahead>=p->
48d0: 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20  nLookaheadAlloc 
48e0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b 61  ){.    p->nLooka
48f0: 68 65 61 64 41 6c 6c 6f 63 20 2b 3d 20 32 35 3b  headAlloc += 25;
4900: 0a 20 20 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  .    p->aLookahe
4910: 61 64 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f  ad = (struct loo
4920: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29  kahead_action *)
4930: 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f   realloc( p->aLo
4940: 6f 6b 61 68 65 61 64 2c 0a 20 20 20 20 20 20 20  okahead,.       
4950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4960: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e        sizeof(p->
4970: 61 4c 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70  aLookahead[0])*p
4980: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f  ->nLookaheadAllo
4990: 63 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  c );.    if( p->
49a0: 61 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b  aLookahead==0 ){
49b0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
49c0: 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61  tderr,"malloc fa
49d0: 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20  iled\n");.      
49e0: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
49f0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f   }.  if( p->nLoo
4a00: 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20  kahead==0 ){.   
4a10: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20   p->mxLookahead 
4a20: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
4a30: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
4a40: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
4a50: 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61   p->mnAction = a
4a60: 63 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ction;.  }else{.
4a70: 20 20 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f      if( p->mxLoo
4a80: 6b 61 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64  kahead<lookahead
4a90: 20 29 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61   ) p->mxLookahea
4aa0: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
4ab0: 20 20 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b     if( p->mnLook
4ac0: 61 68 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20  ahead>lookahead 
4ad0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f  ){.      p->mnLo
4ae0: 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68  okahead = lookah
4af0: 65 61 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e  ead;.      p->mn
4b00: 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b  Action = action;
4b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
4b20: 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c  aLookahead[p->nL
4b30: 6f 6f 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68  ookahead].lookah
4b40: 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b  ead = lookahead;
4b50: 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  .  p->aLookahead
4b60: 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e  [p->nLookahead].
4b70: 61 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b  action = action;
4b80: 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  .  p->nLookahead
4b90: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ++;.}../*.** Add
4ba0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4bb0: 20 73 65 74 20 62 75 69 6c 74 20 75 70 20 77 69   set built up wi
4bc0: 74 68 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  th prior calls t
4bd0: 6f 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28  o acttab_action(
4be0: 29 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 75  ).** into the cu
4bf0: 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62  rrent action tab
4c00: 6c 65 2e 20 20 54 68 65 6e 20 72 65 73 65 74 20  le.  Then reset 
4c10: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
4c20: 73 65 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61  set back.** to a
4c30: 6e 20 65 6d 70 74 79 20 73 65 74 20 69 6e 20 70  n empty set in p
4c40: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 61  reparation for a
4c50: 20 6e 65 77 20 72 6f 75 6e 64 20 6f 66 20 61 63   new round of ac
4c60: 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 20 63 61  ttab_action() ca
4c70: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lls..**.** Retur
4c80: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  n the offset int
4c90: 6f 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  o the action tab
4ca0: 6c 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 72  le of the new tr
4cb0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
4cc0: 74 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28  t acttab_insert(
4cd0: 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e  acttab *p){.  in
4ce0: 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20  t i, j, k, n;.  
4cf0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b  assert( p->nLook
4d00: 61 68 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ahead>0 );..  /*
4d10: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
4d20: 76 65 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ve enough space 
4d30: 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 78 70 61  to hold the expa
4d40: 6e 64 65 64 20 61 63 74 69 6f 6e 20 74 61 62 6c  nded action tabl
4d50: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f  e.  ** in the wo
4d60: 72 73 74 20 63 61 73 65 2e 20 20 54 68 65 20 77  rst case.  The w
4d70: 6f 72 73 74 20 63 61 73 65 20 6f 63 63 75 72 73  orst case occurs
4d80: 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
4d90: 69 6f 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73  ion set.  ** mus
4da0: 74 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  t be appended to
4db0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63 74   the current act
4dc0: 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  ion table.  */. 
4dd0: 20 6e 20 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68   n = p->mxLookah
4de0: 65 61 64 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ead + 1;.  if( p
4df0: 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d  ->nAction + n >=
4e00: 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63   p->nActionAlloc
4e10: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41   ){.    int oldA
4e20: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f  lloc = p->nActio
4e30: 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e  nAlloc;.    p->n
4e40: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d  ActionAlloc = p-
4e50: 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70  >nAction + n + p
4e60: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b  ->nActionAlloc +
4e70: 20 32 30 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74   20;.    p->aAct
4e80: 69 6f 6e 20 3d 20 28 73 74 72 75 63 74 20 6c 6f  ion = (struct lo
4e90: 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a  okahead_action *
4ea0: 29 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41  ) realloc( p->aA
4eb0: 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ction,.         
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69   sizeof(p->aActi
4ee0: 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f  on[0])*p->nActio
4ef0: 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
4f00: 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29   p->aAction==0 )
4f10: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
4f20: 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66  stderr,"malloc f
4f30: 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20  ailed\n");.     
4f40: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
4f50: 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c      for(i=oldAll
4f60: 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  oc; i<p->nAction
4f70: 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  Alloc; i++){.   
4f80: 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d     p->aAction[i]
4f90: 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b  .lookahead = -1;
4fa0: 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  .      p->aActio
4fb0: 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31  n[i].action = -1
4fc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
4fd0: 2a 20 53 63 61 6e 20 74 68 65 20 65 78 69 73 74  * Scan the exist
4fe0: 69 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ing action table
4ff0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20   looking for an 
5000: 6f 66 66 73 65 74 20 74 68 61 74 20 69 73 20 61  offset that is a
5010: 20 0a 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65   .  ** duplicate
5020: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
5030: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e  transaction set.
5040: 20 20 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68    Fall out of th
5050: 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66 20 61  e loop.  ** if a
5060: 6e 64 20 77 68 65 6e 20 74 68 65 20 64 75 70 6c  nd when the dupl
5070: 69 63 61 74 65 20 69 73 20 66 6f 75 6e 64 2e 0a  icate is found..
5080: 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74    **.  ** i is t
5090: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61  he index in p->a
50a0: 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70  Action[] where p
50b0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73  ->mnLookahead is
50c0: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
50d0: 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 41 63 74 69    for(i=p->nActi
50e0: 6f 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  on-1; i>=0; i--)
50f0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63  {.    if( p->aAc
5100: 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[i].lookahea
5110: 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61  d==p->mnLookahea
5120: 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  d ){.      /* Al
5130: 6c 20 6c 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64  l lookaheads and
5140: 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   actions in the 
5150: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61  aLookahead[] tra
5160: 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
5170: 2a 20 6d 75 73 74 20 6d 61 74 63 68 20 61 67 61  * must match aga
5180: 69 6e 73 74 20 74 68 65 20 63 61 6e 64 69 64 61  inst the candida
5190: 74 65 20 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e  te aAction[i] en
51a0: 74 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  try. */.      if
51b0: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e  ( p->aAction[i].
51c0: 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74  action!=p->mnAct
51d0: 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ion ) continue;.
51e0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
51f0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
5200: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
5210: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
5220: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
5230: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
5240: 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  i;.        if( k
5250: 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74  <0 || k>=p->nAct
5260: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
5270: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f       if( p->aLoo
5280: 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68  kahead[j].lookah
5290: 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ead!=p->aAction[
52a0: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62  k].lookahead ) b
52b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
52c0: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  ( p->aLookahead[
52d0: 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41  j].action!=p->aA
52e0: 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20  ction[k].action 
52f0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
5300: 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e  .      if( j<p->
5310: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e  nLookahead ) con
5320: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  tinue;..      /*
5330: 20 4e 6f 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f   No possible loo
5340: 6b 61 68 65 61 64 20 76 61 6c 75 65 20 74 68 61  kahead value tha
5350: 74 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  t is not in the 
5360: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20  aLookahead[].   
5370: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
5380: 6e 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  n is allowed to 
5390: 6d 61 74 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d  match aAction[i]
53a0: 20 2a 2f 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b   */.      n = 0;
53b0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
53c0: 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b  j<p->nAction; j+
53d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
53e0: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f  p->aAction[j].lo
53f0: 6f 6b 61 68 65 61 64 3c 30 20 29 20 63 6f 6e 74  okahead<0 ) cont
5400: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
5410: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e  ( p->aAction[j].
5420: 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e  lookahead==j+p->
5430: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20  mnLookahead-i ) 
5440: 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
5450: 20 20 20 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f     if( n==p->nLo
5460: 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20  okahead ){.     
5470: 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e     break;  /* An
5480: 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
5490: 66 6f 75 6e 64 20 61 74 20 6f 66 66 73 65 74 20  found at offset 
54a0: 69 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  i */.      }.   
54b0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
54c0: 6e 6f 20 65 78 69 73 74 69 6e 67 20 6f 66 66 73  no existing offs
54d0: 65 74 73 20 65 78 61 63 74 6c 79 20 6d 61 74 63  ets exactly matc
54e0: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  h the current tr
54f0: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20  ansaction, find 
5500: 61 6e 0a 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79  an.  ** an empty
5510: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 61   offset in the a
5520: 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69  Action[] table i
5530: 6e 20 77 68 69 63 68 20 77 65 20 63 61 6e 20 61  n which we can a
5540: 64 64 20 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f  dd the.  ** aLoo
5550: 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63  kahead[] transac
5560: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
5570: 20 69 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4c   i<0 ){.    /* L
5580: 6f 6f 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e  ook for holes in
5590: 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74   the aAction[] t
55a0: 61 62 6c 65 20 74 68 61 74 20 66 69 74 20 74 68  able that fit th
55b0: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
55c0: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72   aLookahead[] tr
55d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76  ansaction.  Leav
55e0: 65 20 69 20 73 65 74 20 74 6f 20 74 68 65 20 6f  e i set to the o
55f0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 68 6f 6c  ffset of the hol
5600: 65 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20  e..    ** If no 
5610: 68 6f 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 2c  holes are found,
5620: 20 69 20 69 73 20 6c 65 66 74 20 61 74 20 70 2d   i is left at p-
5630: 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20  >nAction, which 
5640: 6d 65 61 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a  means the.    **
5650: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
5660: 6c 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 2a  l be appended. *
5670: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
5680: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  <p->nActionAlloc
5690: 20 2d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61   - p->mxLookahea
56a0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  d; i++){.      i
56b0: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
56c0: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a  .lookahead<0 ){.
56d0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
56e0: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
56f0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
5700: 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68    k = p->aLookah
5710: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
5720: 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61   - p->mnLookahea
5730: 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 20  d + i;.         
5740: 20 69 66 28 20 6b 3c 30 20 29 20 62 72 65 61 6b   if( k<0 ) break
5750: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5760: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f  p->aAction[k].lo
5770: 6f 6b 61 68 65 61 64 3e 3d 30 20 29 20 62 72 65  okahead>=0 ) bre
5780: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5790: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e        if( j<p->n
57a0: 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74  Lookahead ) cont
57b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  inue;.        fo
57c0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74  r(j=0; j<p->nAct
57d0: 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ion; j++){.     
57e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
57f0: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
5800: 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ==j+p->mnLookahe
5810: 61 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  ad-i ) break;.  
5820: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5830: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f  if( j==p->nActio
5840: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  n ){.          b
5850: 72 65 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69  reak;  /* Fits i
5860: 6e 20 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f  n empty slots */
5870: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5880: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
5890: 2a 20 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63  * Insert transac
58a0: 74 69 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65  tion set at inde
58b0: 78 20 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d  x i. */.  for(j=
58c0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
58d0: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20  ad; j++){.    k 
58e0: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
58f0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
5900: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
5910: 69 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  i;.    p->aActio
5920: 6e 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61  n[k] = p->aLooka
5930: 68 65 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  head[j];.    if(
5940: 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29   k>=p->nAction )
5950: 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b   p->nAction = k+
5960: 31 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f  1;.  }.  p->nLoo
5970: 6b 61 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f  kahead = 0;..  /
5980: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
5990: 73 65 74 20 74 68 61 74 20 69 73 20 61 64 64 65  set that is adde
59a0: 64 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65  d to the lookahe
59b0: 61 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ad in order to g
59c0: 65 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  et the.  ** inde
59d0: 78 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e  x into yy_action
59e0: 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a   of the action *
59f0: 2f 0a 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70  /.  return i - p
5a00: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d  ->mnLookahead;.}
5a10: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
5a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
5a30: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 63  he file "build.c
5a40: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
5a60: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
5a70: 74 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  to construction 
5a80: 74 68 65 20 66 69 6e 69 74 65 20 73 74 61 74 65  the finite state
5a90: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68 65   machine for the
5aa0: 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72   LEMON.** parser
5ab0: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
5ac0: 2f 2a 20 46 69 6e 64 20 61 20 70 72 65 63 65 64  /* Find a preced
5ad0: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65  ence symbol of e
5ae0: 76 65 72 79 20 72 75 6c 65 20 69 6e 20 74 68 65  very rule in the
5af0: 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a   grammar..** .**
5b00: 20 54 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69   Those rules whi
5b10: 63 68 20 68 61 76 65 20 61 20 70 72 65 63 65 64  ch have a preced
5b20: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65  ence symbol code
5b30: 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a  d in the input.*
5b40: 2a 20 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20  * grammar using 
5b50: 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63  the "[symbol]" c
5b60: 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c  onstruct will al
5b70: 72 65 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a  ready have the.*
5b80: 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69  * rp->precsym fi
5b90: 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68  eld filled.  Oth
5ba0: 65 72 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73  er rules take as
5bb0: 20 74 68 65 69 72 20 70 72 65 63 65 64 65 6e 63   their precedenc
5bc0: 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20  e.** symbol the 
5bd0: 66 69 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c  first RHS symbol
5be0: 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20   with a defined 
5bf0: 70 72 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20  precedence.  If 
5c00: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74  there.** are not
5c10: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74   RHS symbols wit
5c20: 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63  h a defined prec
5c30: 65 64 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63  edence, the prec
5c40: 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c  edence.** symbol
5c50: 20 66 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62   field is left b
5c60: 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  lank..*/.void Fi
5c70: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
5c80: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
5c90: 78 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  xp).{.  struct r
5ca0: 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72  ule *rp;.  for(r
5cb0: 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  p=xp->rule; rp; 
5cc0: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
5cd0: 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79    if( rp->precsy
5ce0: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  m==0 ){.      in
5cf0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f  t i, j;.      fo
5d00: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
5d10: 73 20 26 26 20 72 70 2d 3e 70 72 65 63 73 79 6d  s && rp->precsym
5d20: 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ==0; i++){.     
5d30: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
5d40: 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
5d50: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ];.        if( s
5d60: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
5d70: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
5d80: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
5d90: 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  p->nsubsym; j++)
5da0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
5db0: 28 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  ( sp->subsym[j]-
5dc0: 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20  >prec>=0 ){.    
5dd0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72            rp->pr
5de0: 65 63 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73  ecsym = sp->subs
5df0: 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  ym[j];.         
5e00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5e10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5e20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
5e30: 6c 73 65 20 69 66 28 20 73 70 2d 3e 70 72 65 63  lse if( sp->prec
5e40: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
5e50: 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72   rp->precsym = r
5e60: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 09 7d 0a 20 20  p->rhs[i];..}.  
5e70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5e80: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
5e90: 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d  Find all nonterm
5ea0: 69 6e 61 6c 73 20 77 68 69 63 68 20 77 69 6c 6c  inals which will
5eb0: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 65 6d   generate the em
5ec0: 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54  pty string..** T
5ed0: 68 65 6e 20 67 6f 20 62 61 63 6b 20 61 6e 64 20  hen go back and 
5ee0: 63 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72 73  compute the firs
5ef0: 74 20 73 65 74 73 20 6f 66 20 65 76 65 72 79 20  t sets of every 
5f00: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20  nonterminal..** 
5f10: 54 68 65 20 66 69 72 73 74 20 73 65 74 20 69 73  The first set is
5f20: 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20   the set of all 
5f30: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
5f40: 20 77 68 69 63 68 20 63 61 6e 20 62 65 67 69 6e   which can begin
5f50: 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20 67 65 6e  .** a string gen
5f60: 65 72 61 74 65 64 20 62 79 20 74 68 61 74 20 6e  erated by that n
5f70: 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76  onterminal..*/.v
5f80: 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53 65 74  oid FindFirstSet
5f90: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
5fa0: 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 2c  lemp).{.  int i,
5fb0: 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c   j;.  struct rul
5fc0: 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20 70 72 6f  e *rp;.  int pro
5fd0: 67 72 65 73 73 3b 0a 0a 20 20 66 6f 72 28 69 3d  gress;..  for(i=
5fe0: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
5ff0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  ol; i++){.    le
6000: 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
6010: 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46  lambda = LEMON_F
6020: 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ALSE;.  }.  for(
6030: 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i=lemp->ntermina
6040: 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  l; i<lemp->nsymb
6050: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65  ol; i++){.    le
6060: 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
6070: 66 69 72 73 74 73 65 74 20 3d 20 53 65 74 4e 65  firstset = SetNe
6080: 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  w();.  }..  /* F
6090: 69 72 73 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c  irst compute all
60a0: 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f   lambdas */.  do
60b0: 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d  {.    progress =
60c0: 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c   0;.    for(rp=l
60d0: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
60e0: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
60f0: 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e     if( rp->lhs->
6100: 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74 69 6e 75  lambda ) continu
6110: 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
6120: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
6130: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 73 74 72  +){.         str
6140: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
6150: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
6160: 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79        if( sp->ty
6170: 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  pe!=TERMINAL || 
6180: 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f  sp->lambda==LEMO
6190: 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b  N_FALSE ) break;
61a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
61b0: 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29  f( i==rp->nrhs )
61c0: 7b 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  {.        rp->lh
61d0: 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f  s->lambda = LEMO
61e0: 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20 20 20 20  N_TRUE;.        
61f0: 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  progress = 1;.  
6200: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
6210: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
6220: 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70  ;..  /* Now comp
6230: 75 74 65 20 61 6c 6c 20 66 69 72 73 74 20 73 65  ute all first se
6240: 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  ts */.  do{.    
6250: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
6260: 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70 72 6f 67  1, *s2;.    prog
6270: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
6280: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
6290: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
62a0: 29 7b 0a 20 20 20 20 20 20 73 31 20 3d 20 72 70  ){.      s1 = rp
62b0: 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 66 6f 72  ->lhs;.      for
62c0: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
62d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
62e0: 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  s2 = rp->rhs[i];
62f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 32 2d  .        if( s2-
6300: 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
6310: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f  ){.          pro
6320: 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28  gress += SetAdd(
6330: 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d  s1->firstset,s2-
6340: 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
6350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6360: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 32 2d 3e    }else if( s2->
6370: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
6380: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
6390: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 32 2d 3e   for(j=0; j<s2->
63a0: 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20  nsubsym; j++){. 
63b0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72             progr
63c0: 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31  ess += SetAdd(s1
63d0: 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 73  ->firstset,s2->s
63e0: 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64 65 78 29  ubsym[j]->index)
63f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
6400: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09          break;..
6410: 7d 65 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32  }else if( s1==s2
6420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
6430: 28 20 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45  ( s1->lambda==LE
6440: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
6450: 6b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20  k;..}else{.     
6460: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d       progress +=
6470: 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d 3e 66 69   SetUnion(s1->fi
6480: 72 73 74 73 65 74 2c 73 32 2d 3e 66 69 72 73 74  rstset,s2->first
6490: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  set);.          
64a0: 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64 61 3d 3d  if( s2->lambda==
64b0: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72  LEMON_FALSE ) br
64c0: 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a  eak;..}.      }.
64d0: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
64e0: 70 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 65  progress );.  re
64f0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  turn;.}../* Comp
6500: 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74  ute all LR(0) st
6510: 61 74 65 73 20 66 6f 72 20 74 68 65 20 67 72 61  ates for the gra
6520: 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20  mmar.  Links.** 
6530: 61 72 65 20 61 64 64 65 64 20 74 6f 20 62 65 74  are added to bet
6540: 77 65 65 6e 20 73 6f 6d 65 20 73 74 61 74 65 73  ween some states
6550: 20 73 6f 20 74 68 61 74 20 74 68 65 20 4c 52 28   so that the LR(
6560: 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a  1) follow sets.*
6570: 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65  * can be compute
6580: 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56  d later..*/.PRIV
6590: 41 54 45 20 73 74 72 75 63 74 20 73 74 61 74 65  ATE struct state
65a0: 20 2a 67 65 74 73 74 61 74 65 28 73 74 72 75 63   *getstate(struc
65b0: 74 20 6c 65 6d 6f 6e 20 2a 29 3b 20 20 2f 2a 20  t lemon *);  /* 
65c0: 66 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  forward referenc
65d0: 65 20 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 53 74  e */.void FindSt
65e0: 61 74 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f  ates(struct lemo
65f0: 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72  n *lemp).{.  str
6600: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
6610: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
6620: 70 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74  p;..  Configlist
6630: 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46  _init();..  /* F
6640: 69 6e 64 20 74 68 65 20 73 74 61 72 74 20 73 79  ind the start sy
6650: 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65  mbol */.  if( le
6660: 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20  mp->start ){.   
6670: 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e   sp = Symbol_fin
6680: 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a  d(lemp->start);.
6690: 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b      if( sp==0 ){
66a0: 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28  .      ErrorMsg(
66b0: 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30  lemp->filename,0
66c0: 2c 0a 22 54 68 65 20 73 70 65 63 69 66 69 65 64  ,."The specified
66d0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22   start symbol \"
66e0: 25 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e  %s\" is not \.in
66f0: 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f   a nonterminal o
6700: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  f the grammar.  
6710: 5c 22 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75  \"%s\" will be u
6720: 73 65 64 20 61 73 20 74 68 65 20 73 74 61 72 74  sed as the start
6730: 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61   \.symbol instea
6740: 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c  d.",lemp->start,
6750: 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d  lemp->rule->lhs-
6760: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65  >name);.      le
6770: 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
6780: 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d        sp = lemp-
6790: 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20  >rule->lhs;.    
67a0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
67b0: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
67c0: 6c 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  lhs;.  }..  /* M
67d0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 74 61  ake sure the sta
67e0: 72 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27  rt symbol doesn'
67f0: 74 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72  t occur on the r
6800: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
6810: 66 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e  f.  ** any rule.
6820: 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
6830: 72 20 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28  r if it does.  (
6840: 59 41 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72  YACC would gener
6850: 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73  ate a new.  ** s
6860: 74 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74  tart symbol in t
6870: 68 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20  his case.) */.  
6880: 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
6890: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
68a0: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
68b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
68c0: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
68d0: 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73       if( rp->rhs
68e0: 5b 69 5d 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20  [i]==sp ){   /* 
68f0: 46 49 58 20 4d 45 3a 20 20 44 65 61 6c 20 77 69  FIX ME:  Deal wi
6900: 74 68 20 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c  th multiterminal
6910: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 72 72  s */.        Err
6920: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
6930: 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 74 61  name,0,."The sta
6940: 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22  rt symbol \"%s\"
6950: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 5c   occurs on the \
6960: 0a 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65  .right-hand side
6970: 20 6f 66 20 61 20 72 75 6c 65 2e 20 54 68 69 73   of a rule. This
6980: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
6990: 61 20 70 61 72 73 65 72 20 77 68 69 63 68 20 5c  a parser which \
69a0: 0a 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70  .does not work p
69b0: 72 6f 70 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61  roperly.",sp->na
69c0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d  me);.        lem
69d0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
69e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
69f0: 0a 0a 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73  ..  /* The basis
6a00: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   configuration s
6a10: 65 74 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  et for the first
6a20: 20 73 74 61 74 65 0a 20 20 2a 2a 20 69 73 20 61   state.  ** is a
6a30: 6c 6c 20 72 75 6c 65 73 20 77 68 69 63 68 20 68  ll rules which h
6a40: 61 76 65 20 74 68 65 20 73 74 61 72 74 20 73 79  ave the start sy
6a50: 6d 62 6f 6c 20 61 73 20 74 68 65 69 72 0a 20 20  mbol as their.  
6a60: 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  ** left-hand sid
6a70: 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70  e */.  for(rp=sp
6a80: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
6a90: 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20  p->nextlhs){.   
6aa0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
6ab0: 6e 65 77 63 66 70 3b 0a 20 20 20 20 72 70 2d 3e  newcfp;.    rp->
6ac0: 6c 68 73 53 74 61 72 74 20 3d 20 31 3b 0a 20 20  lhsStart = 1;.  
6ad0: 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69    newcfp = Confi
6ae0: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72  glist_addbasis(r
6af0: 70 2c 30 29 3b 0a 20 20 20 20 53 65 74 41 64 64  p,0);.    SetAdd
6b00: 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b  (newcfp->fws,0);
6b10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  .  }..  /* Compu
6b20: 74 65 20 74 68 65 20 66 69 72 73 74 20 73 74 61  te the first sta
6b30: 74 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 73  te.  All other s
6b40: 74 61 74 65 73 20 77 69 6c 6c 20 62 65 0a 20 20  tates will be.  
6b50: 2a 2a 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f  ** computed auto
6b60: 6d 61 74 69 63 61 6c 6c 79 20 64 75 72 69 6e 67  matically during
6b70: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
6b80: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 6e   of the first on
6b90: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 74 75  e..  ** The retu
6ba0: 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20  rned pointer to 
6bb0: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20  the first state 
6bc0: 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a  is not used. */.
6bd0: 20 20 28 76 6f 69 64 29 67 65 74 73 74 61 74 65    (void)getstate
6be0: 28 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e  (lemp);.  return
6bf0: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
6c00: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
6c10: 61 74 65 20 77 68 69 63 68 20 69 73 20 64 65 73  ate which is des
6c20: 63 72 69 62 65 64 20 62 79 20 74 68 65 20 63 6f  cribed by the co
6c30: 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c  nfiguration.** l
6c40: 69 73 74 20 77 68 69 63 68 20 68 61 73 20 62 65  ist which has be
6c50: 65 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20 63 61  en built from ca
6c60: 6c 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73  lls to Configlis
6c70: 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54  t_add..*/.PRIVAT
6c80: 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66  E void buildshif
6c90: 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  ts(struct lemon 
6ca0: 2a 2c 20 73 74 72 75 63 74 20 73 74 61 74 65 20  *, struct state 
6cb0: 2a 29 3b 20 2f 2a 20 46 6f 72 77 64 20 72 65 66  *); /* Forwd ref
6cc0: 20 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75   */.PRIVATE stru
6cd0: 63 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61  ct state *getsta
6ce0: 74 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  te(struct lemon 
6cf0: 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63  *lemp).{.  struc
6d00: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a  t config *cfp, *
6d10: 62 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  bp;.  struct sta
6d20: 74 65 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45  te *stp;..  /* E
6d30: 78 74 72 61 63 74 20 74 68 65 20 73 6f 72 74 65  xtract the sorte
6d40: 64 20 62 61 73 69 73 20 6f 66 20 74 68 65 20 6e  d basis of the n
6d50: 65 77 20 73 74 61 74 65 2e 20 20 54 68 65 20 62  ew state.  The b
6d60: 61 73 69 73 20 77 61 73 20 63 6f 6e 73 74 72 75  asis was constru
6d70: 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 70 72 69  cted.  ** by pri
6d80: 6f 72 20 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e  or calls to "Con
6d90: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
6da0: 28 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67  ()". */.  Config
6db0: 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29  list_sortbasis()
6dc0: 3b 0a 20 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c  ;.  bp = Configl
6dd0: 69 73 74 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20  ist_basis();..  
6de0: 2f 2a 20 47 65 74 20 61 20 73 74 61 74 65 20 77  /* Get a state w
6df0: 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61 73  ith the same bas
6e00: 69 73 20 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74  is */.  stp = St
6e10: 61 74 65 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20  ate_find(bp);.  
6e20: 69 66 28 20 73 74 70 20 29 7b 0a 20 20 20 20 2f  if( stp ){.    /
6e30: 2a 20 41 20 73 74 61 74 65 20 77 69 74 68 20 74  * A state with t
6e40: 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 61 6c  he same basis al
6e50: 72 65 61 64 79 20 65 78 69 73 74 73 21 20 20 43  ready exists!  C
6e60: 6f 70 79 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c  opy all the foll
6e70: 6f 77 2d 73 65 74 0a 20 20 20 20 2a 2a 20 70 72  ow-set.    ** pr
6e80: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20  opagation links 
6e90: 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 75  from the state u
6ea0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
6eb0: 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  n into the.    *
6ec0: 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 73 74  * preexisting st
6ed0: 61 74 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ate, then return
6ee0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6ef0: 65 20 70 72 65 65 78 69 73 74 69 6e 67 20 73 74  e preexisting st
6f00: 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ate */.    struc
6f10: 74 20 63 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b  t config *x, *y;
6f20: 0a 20 20 20 20 66 6f 72 28 78 3d 62 70 2c 20 79  .    for(x=bp, y
6f30: 3d 73 74 70 2d 3e 62 70 3b 20 78 20 26 26 20 79  =stp->bp; x && y
6f40: 3b 20 78 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e  ; x=x->bp, y=y->
6f50: 62 70 29 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  bp){.      Plink
6f60: 5f 63 6f 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78  _copy(&y->bplp,x
6f70: 2d 3e 62 70 6c 70 29 3b 0a 20 20 20 20 20 20 50  ->bplp);.      P
6f80: 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66  link_delete(x->f
6f90: 70 6c 70 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66  plp);.      x->f
6fa0: 70 6c 70 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20  plp = x->bplp = 
6fb0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 66 70  0;.    }.    cfp
6fc0: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65   = Configlist_re
6fd0: 74 75 72 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66  turn();.    Conf
6fe0: 69 67 6c 69 73 74 5f 65 61 74 28 63 66 70 29 3b  iglist_eat(cfp);
6ff0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7000: 20 54 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20   This really is 
7010: 61 20 6e 65 77 20 73 74 61 74 65 2e 20 20 43 6f  a new state.  Co
7020: 6e 73 74 72 75 63 74 20 61 6c 6c 20 74 68 65 20  nstruct all the 
7030: 64 65 74 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43  details */.    C
7040: 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72  onfiglist_closur
7050: 65 28 6c 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43  e(lemp);    /* C
7060: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 66 69  ompute the confi
7070: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
7080: 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69   */.    Configli
7090: 73 74 5f 73 6f 72 74 28 29 3b 20 20 20 20 20 20  st_sort();      
70a0: 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 74 68 65       /* Sort the
70b0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
70c0: 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 63 66  losure */.    cf
70d0: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72  p = Configlist_r
70e0: 65 74 75 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65  eturn();   /* Ge
70f0: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
7100: 68 65 20 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a  he config list *
7110: 2f 0a 20 20 20 20 73 74 70 20 3d 20 53 74 61 74  /.    stp = Stat
7120: 65 5f 6e 65 77 28 29 3b 20 20 20 20 20 20 20 20  e_new();        
7130: 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 74 61 74     /* A new stat
7140: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
7150: 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73     MemoryCheck(s
7160: 74 70 29 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70  tp);.    stp->bp
7170: 20 3d 20 62 70 3b 20 20 20 20 20 20 20 20 20 20   = bp;          
7180: 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65        /* Remembe
7190: 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  r the configurat
71a0: 69 6f 6e 20 62 61 73 69 73 20 2a 2f 0a 20 20 20  ion basis */.   
71b0: 20 73 74 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b   stp->cfp = cfp;
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
71d0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f   Remember the co
71e0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73  nfiguration clos
71f0: 75 72 65 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  ure */.    stp->
7200: 73 74 61 74 65 6e 75 6d 20 3d 20 6c 65 6d 70 2d  statenum = lemp-
7210: 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a 20 45 76  >nstate++; /* Ev
7220: 65 72 79 20 73 74 61 74 65 20 67 65 74 73 20 61  ery state gets a
7230: 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72   sequence number
7240: 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20   */.    stp->ap 
7250: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7260: 20 20 20 20 20 2f 2a 20 4e 6f 20 61 63 74 69 6f       /* No actio
7270: 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a 20 20 20 20  ns, yet. */.    
7280: 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74 70  State_insert(stp
7290: 2c 73 74 70 2d 3e 62 70 29 3b 20 20 20 2f 2a 20  ,stp->bp);   /* 
72a0: 41 64 64 20 74 6f 20 74 68 65 20 73 74 61 74 65  Add to the state
72b0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 62 75   table */.    bu
72c0: 69 6c 64 73 68 69 66 74 73 28 6c 65 6d 70 2c 73  ildshifts(lemp,s
72d0: 74 70 29 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  tp);       /* Re
72e0: 63 75 72 73 69 76 65 6c 79 20 63 6f 6d 70 75 74  cursively comput
72f0: 65 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74  e successor stat
7300: 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  es */.  }.  retu
7310: 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn stp;.}../*.**
7320: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
7330: 74 77 6f 20 73 79 6d 62 6f 6c 73 20 61 72 65 20  two symbols are 
7340: 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  the same..*/.int
7350: 20 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 73 74 72   same_symbol(str
7360: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 61 2c 20 73  uct symbol *a, s
7370: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 29  truct symbol *b)
7380: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  .{.  int i;.  if
7390: 28 20 61 3d 3d 62 20 29 20 72 65 74 75 72 6e 20  ( a==b ) return 
73a0: 31 3b 0a 20 20 69 66 28 20 61 2d 3e 74 79 70 65  1;.  if( a->type
73b0: 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  !=MULTITERMINAL 
73c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
73d0: 28 20 62 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49  ( b->type!=MULTI
73e0: 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72  TERMINAL ) retur
73f0: 6e 20 30 3b 0a 20 20 69 66 28 20 61 2d 3e 6e 73  n 0;.  if( a->ns
7400: 75 62 73 79 6d 21 3d 62 2d 3e 6e 73 75 62 73 79  ubsym!=b->nsubsy
7410: 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  m ) return 0;.  
7420: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e 73  for(i=0; i<a->ns
7430: 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubsym; i++){.   
7440: 20 69 66 28 20 61 2d 3e 73 75 62 73 79 6d 5b 69   if( a->subsym[i
7450: 5d 21 3d 62 2d 3e 73 75 62 73 79 6d 5b 69 5d 20  ]!=b->subsym[i] 
7460: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
7470: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
7480: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20  * Construct all 
7490: 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73  successor states
74a0: 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 73 74   to the given st
74b0: 61 74 65 2e 20 20 41 20 22 73 75 63 63 65 73 73  ate.  A "success
74c0: 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20 69 73 20  or".** state is 
74d0: 61 6e 79 20 73 74 61 74 65 20 77 68 69 63 68 20  any state which 
74e0: 63 61 6e 20 62 65 20 72 65 61 63 68 65 64 20 62  can be reached b
74f0: 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e  y a shift action
7500: 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
7510: 64 20 62 75 69 6c 64 73 68 69 66 74 73 28 73 74  d buildshifts(st
7520: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
7530: 2c 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  , struct state *
7540: 73 74 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  stp).{.  struct 
7550: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 2f 2a  config *cfp;  /*
7560: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
7570: 75 20 74 68 65 20 63 6f 6e 66 69 67 20 63 6c 6f  u the config clo
7580: 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f  sure of "stp" */
7590: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
75a0: 20 2a 62 63 66 70 3b 20 2f 2a 20 46 6f 72 20 74   *bcfp; /* For t
75b0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f 6e  he inner loop on
75c0: 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20   config closure 
75d0: 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74  of "stp" */.  st
75e0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
75f0: 63 66 67 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74  cfg;  /* */.  st
7600: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
7610: 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c     /* Symbol fol
7620: 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69  lowing the dot i
7630: 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  n configuration 
7640: 22 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "cfp" */.  struc
7650: 74 20 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20  t symbol *bsp;  
7660: 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77  /* Symbol follow
7670: 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63  ing the dot in c
7680: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 62 63  onfiguration "bc
7690: 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  fp" */.  struct 
76a0: 73 74 61 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f  state *newstp; /
76b0: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
76c0: 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65   successor state
76d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63   */..  /* Each c
76e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 65 63  onfiguration bec
76f0: 6f 6d 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 66  omes complete af
7700: 74 65 72 20 69 74 20 63 6f 6e 74 69 62 75 74 65  ter it contibute
7710: 73 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72  s to a successor
7720: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e  .  ** state.  In
7730: 69 74 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e  itially, all con
7740: 66 69 67 75 72 61 74 69 6f 6e 73 20 61 72 65 20  figurations are 
7750: 69 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  incomplete */.  
7760: 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70  for(cfp=stp->cfp
7770: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
7780: 6e 65 78 74 29 20 63 66 70 2d 3e 73 74 61 74 75  next) cfp->statu
7790: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
77a0: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
77b0: 67 68 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61  gh all configura
77c0: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 74 61  tions of the sta
77d0: 74 65 20 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f  te "stp" */.  fo
77e0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
77f0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
7800: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 63 66 70  xt){.    if( cfp
7810: 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45  ->status==COMPLE
7820: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  TE ) continue;  
7830: 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65    /* Already use
7840: 64 20 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20  d by inner loop 
7850: 2a 2f 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e  */.    if( cfp->
7860: 64 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72  dot>=cfp->rp->nr
7870: 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  hs ) continue;  
7880: 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20 74  /* Can't shift t
7890: 68 69 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20  his config */.  
78a0: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73    Configlist_res
78b0: 65 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  et();           
78c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
78d0: 73 65 74 20 74 68 65 20 6e 65 77 20 63 6f 6e 66  set the new conf
78e0: 69 67 20 73 65 74 20 2a 2f 0a 20 20 20 20 73 70  ig set */.    sp
78f0: 20 3d 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b   = cfp->rp->rhs[
7900: 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20  cfp->dot];      
7910: 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c         /* Symbol
7920: 20 61 66 74 65 72 20 74 68 65 20 64 6f 74 20 2a   after the dot *
7930: 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65 76  /..    /* For ev
7940: 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ery configuratio
7950: 6e 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 22  n in the state "
7960: 73 74 70 22 20 77 68 69 63 68 20 68 61 73 20 74  stp" which has t
7970: 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20  he symbol "sp". 
7980: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
7990: 69 74 73 20 64 6f 74 2c 20 61 64 64 20 74 68 65  its dot, add the
79a0: 20 73 61 6d 65 20 63 6f 6e 66 69 67 75 72 61 74   same configurat
79b0: 69 6f 6e 20 74 6f 20 74 68 65 20 62 61 73 69 73  ion to the basis
79c0: 20 73 65 74 20 75 6e 64 65 72 0a 20 20 20 20 2a   set under.    *
79d0: 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62  * construction b
79e0: 75 74 20 77 69 74 68 20 74 68 65 20 64 6f 74 20  ut with the dot 
79f0: 73 68 69 66 74 65 64 20 6f 6e 65 20 73 79 6d 62  shifted one symb
7a00: 6f 6c 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e  ol to the right.
7a10: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 62 63 66 70   */.    for(bcfp
7a20: 3d 63 66 70 3b 20 62 63 66 70 3b 20 62 63 66 70  =cfp; bcfp; bcfp
7a30: 3d 62 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  =bcfp->next){.  
7a40: 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 73 74      if( bcfp->st
7a50: 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29  atus==COMPLETE )
7a60: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a   continue;    /*
7a70: 20 41 6c 72 65 61 64 79 20 75 73 65 64 20 2a 2f   Already used */
7a80: 0a 20 20 20 20 20 20 69 66 28 20 62 63 66 70 2d  .      if( bcfp-
7a90: 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e  >dot>=bcfp->rp->
7aa0: 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b  nrhs ) continue;
7ab0: 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20   /* Can't shift 
7ac0: 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20  this one */.    
7ad0: 20 20 62 73 70 20 3d 20 62 63 66 70 2d 3e 72 70    bsp = bcfp->rp
7ae0: 2d 3e 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d  ->rhs[bcfp->dot]
7af0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47  ;           /* G
7b00: 65 74 20 73 79 6d 62 6f 6c 20 61 66 74 65 72 20  et symbol after 
7b10: 64 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  dot */.      if(
7b20: 20 21 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 62 73   !same_symbol(bs
7b30: 70 2c 73 70 29 20 29 20 63 6f 6e 74 69 6e 75 65  p,sp) ) continue
7b40: 3b 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62  ;      /* Must b
7b50: 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20 22 63  e same as for "c
7b60: 66 70 22 20 2a 2f 0a 20 20 20 20 20 20 62 63 66  fp" */.      bcf
7b70: 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50  p->status = COMP
7b80: 4c 45 54 45 3b 20 20 20 20 20 20 20 20 20 20 20  LETE;           
7b90: 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74         /* Mark t
7ba0: 68 69 73 20 63 6f 6e 66 69 67 20 61 73 20 75 73  his config as us
7bb0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77 63  ed */.      newc
7bc0: 66 67 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fg = Configlist_
7bd0: 61 64 64 62 61 73 69 73 28 62 63 66 70 2d 3e 72  addbasis(bcfp->r
7be0: 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a  p,bcfp->dot+1);.
7bf0: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28        Plink_add(
7c00: 26 6e 65 77 63 66 67 2d 3e 62 70 6c 70 2c 62 63  &newcfg->bplp,bc
7c10: 66 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fp);.    }..    
7c20: 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72  /* Get a pointer
7c30: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 64 65   to the state de
7c40: 73 63 72 69 62 65 64 20 62 79 20 74 68 65 20 62  scribed by the b
7c50: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
7c60: 6f 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f  on set.    ** co
7c70: 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 65  nstructed in the
7c80: 20 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20   preceding loop 
7c90: 2a 2f 0a 20 20 20 20 6e 65 77 73 74 70 20 3d 20  */.    newstp = 
7ca0: 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a  getstate(lemp);.
7cb0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74  .    /* The stat
7cc0: 65 20 22 6e 65 77 73 74 70 22 20 69 73 20 72 65  e "newstp" is re
7cd0: 61 63 68 65 64 20 66 72 6f 6d 20 74 68 65 20 73  ached from the s
7ce0: 74 61 74 65 20 22 73 74 70 22 20 62 79 20 61 20  tate "stp" by a 
7cf0: 73 68 69 66 74 20 61 63 74 69 6f 6e 0a 20 20 20  shift action.   
7d00: 20 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f   ** on the symbo
7d10: 6c 20 22 73 70 22 20 2a 2f 0a 20 20 20 20 69 66  l "sp" */.    if
7d20: 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( sp->type==MULT
7d30: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
7d40: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
7d50: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e  for(i=0; i<sp->n
7d60: 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20  subsym; i++){.  
7d70: 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64        Action_add
7d80: 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c  (&stp->ap,SHIFT,
7d90: 73 70 2d 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63  sp->subsym[i],(c
7da0: 68 61 72 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20  har*)newstp);.  
7db0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7dc0: 0a 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64  .      Action_ad
7dd0: 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54  d(&stp->ap,SHIFT
7de0: 2c 73 70 2c 28 63 68 61 72 20 2a 29 6e 65 77 73  ,sp,(char *)news
7df0: 74 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  tp);.    }.  }.}
7e00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
7e10: 74 20 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f  t the propagatio
7e20: 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20  n links.*/.void 
7e30: 46 69 6e 64 4c 69 6e 6b 73 28 73 74 72 75 63 74  FindLinks(struct
7e40: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
7e50: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
7e60: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a  t config *cfp, *
7e70: 6f 74 68 65 72 3b 0a 20 20 73 74 72 75 63 74 20  other;.  struct 
7e80: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
7e90: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
7ea0: 0a 0a 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70  ..  /* Housekeep
7eb0: 69 6e 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a  ing detail:.  **
7ec0: 20 41 64 64 20 74 6f 20 65 76 65 72 79 20 70 72   Add to every pr
7ed0: 6f 70 61 67 61 74 65 20 6c 69 6e 6b 20 61 20 70  opagate link a p
7ee0: 6f 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74  ointer back to t
7ef0: 68 65 20 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a  he state to.  **
7f00: 20 77 68 69 63 68 20 74 68 65 20 6c 69 6e 6b 20   which the link 
7f10: 69 73 20 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a  is attached. */.
7f20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
7f30: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
7f40: 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
7f50: 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
7f60: 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70  for(cfp=stp->cfp
7f70: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
7f80: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70  next){.      cfp
7f90: 2d 3e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ->stp = stp;.   
7fa0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
7fb0: 76 65 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e  vert all backlin
7fc0: 6b 73 20 69 6e 74 6f 20 66 6f 72 77 61 72 64 20  ks into forward 
7fd0: 6c 69 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65  links.  Only the
7fe0: 20 66 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69   forward.  ** li
7ff0: 6e 6b 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  nks are used in 
8000: 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63  the follow-set c
8010: 6f 6d 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  omputation. */. 
8020: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
8030: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
8040: 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
8050: 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
8060: 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b  or(cfp=stp->cfp;
8070: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
8080: 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ext){.      for(
8090: 70 6c 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70  plp=cfp->bplp; p
80a0: 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78  lp; plp=plp->nex
80b0: 74 29 7b 0a 20 20 20 20 20 20 20 20 6f 74 68 65  t){.        othe
80c0: 72 20 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20  r = plp->cfp;.  
80d0: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28        Plink_add(
80e0: 26 6f 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70  &other->fplp,cfp
80f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8100: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75  .  }.}../* Compu
8110: 74 65 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74  te all followset
8120: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f  s..**.** A follo
8130: 77 73 65 74 20 69 73 20 74 68 65 20 73 65 74 20  wset is the set 
8140: 6f 66 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77  of all symbols w
8150: 68 69 63 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d  hich can come im
8160: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
8170: 65 72 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69  er a configurati
8180: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  on..*/.void Find
8190: 46 6f 6c 6c 6f 77 53 65 74 73 28 73 74 72 75 63  FollowSets(struc
81a0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
81b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
81c0: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
81d0: 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
81e0: 70 6c 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72  plp;.  int progr
81f0: 65 73 73 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67  ess;.  int chang
8200: 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e;..  for(i=0; i
8210: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
8220: 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 63 66 70  ++){.    for(cfp
8230: 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d  =lemp->sorted[i]
8240: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
8250: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
8260: 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20    cfp->status = 
8270: 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20  INCOMPLETE;.    
8280: 7d 0a 20 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20  }.  }.  .  do{. 
8290: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b     progress = 0;
82a0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
82b0: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
82c0: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 63 66  +){.      for(cf
82d0: 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  p=lemp->sorted[i
82e0: 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  ]->cfp; cfp; cfp
82f0: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
8300: 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74       if( cfp->st
8310: 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29  atus==COMPLETE )
8320: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8330: 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e     for(plp=cfp->
8340: 66 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70  fplp; plp; plp=p
8350: 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  lp->next){.     
8360: 20 20 20 20 20 63 68 61 6e 67 65 20 3d 20 53 65       change = Se
8370: 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d  tUnion(plp->cfp-
8380: 3e 66 77 73 2c 63 66 70 2d 3e 66 77 73 29 3b 0a  >fws,cfp->fws);.
8390: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 68            if( ch
83a0: 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ange ){.        
83b0: 20 20 20 20 70 6c 70 2d 3e 63 66 70 2d 3e 73 74      plp->cfp->st
83c0: 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54  atus = INCOMPLET
83d0: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  E;.            p
83e0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 09 20 20  rogress = 1;..  
83f0: 7d 0a 09 7d 0a 20 20 20 20 20 20 20 20 63 66 70  }..}.        cfp
8400: 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c  ->status = COMPL
8410: 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ETE;.      }.   
8420: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f   }.  }while( pro
8430: 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61 74  gress );.}..stat
8440: 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63  ic int resolve_c
8450: 6f 6e 66 6c 69 63 74 28 73 74 72 75 63 74 20 61  onflict(struct a
8460: 63 74 69 6f 6e 20 2a 2c 73 74 72 75 63 74 20 61  ction *,struct a
8470: 63 74 69 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20  ction *, struct 
8480: 73 79 6d 62 6f 6c 20 2a 29 3b 0a 0a 2f 2a 20 43  symbol *);../* C
8490: 6f 6d 70 75 74 65 20 74 68 65 20 72 65 64 75 63  ompute the reduc
84a0: 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72  e actions, and r
84b0: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
84c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63  ..*/.void FindAc
84d0: 74 69 6f 6e 73 28 73 74 72 75 63 74 20 6c 65 6d  tions(struct lem
84e0: 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e  on *lemp).{.  in
84f0: 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63 74 20  t i,j;.  struct 
8500: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
8510: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
8520: 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
8530: 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20  l *sp;.  struct 
8540: 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f 2a 20  rule *rp;..  /* 
8550: 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  Add all of the r
8560: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 0a 20  educe actions . 
8570: 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61 63 74   ** A reduce act
8580: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66 6f 72  ion is added for
8590: 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   each element of
85a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20 6f   the followset o
85b0: 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67 75  f.  ** a configu
85c0: 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68 61 73  ration which has
85d0: 20 69 74 73 20 64 6f 74 20 61 74 20 74 68 65 20   its dot at the 
85e0: 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e 0a 20  extreme right.. 
85f0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8600: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
8610: 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f  ++){   /* Loop o
8620: 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20 2a  ver all states *
8630: 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  /.    stp = lemp
8640: 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
8650: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
8660: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
8670: 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f 70  >next){  /* Loop
8680: 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69 67   over all config
8690: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  urations */.    
86a0: 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e 6e    if( cfp->rp->n
86b0: 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 7b  rhs==cfp->dot ){
86c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 64 6f          /* Is do
86d0: 74 20 61 74 20 65 78 74 72 65 6d 65 20 72 69 67  t at extreme rig
86e0: 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ht? */.        f
86f0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e  or(j=0; j<lemp->
8700: 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b  nterminal; j++){
8710: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53  .          if( S
8720: 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77 73 2c  etFind(cfp->fws,
8730: 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j) ){.          
8740: 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64 75 63    /* Add a reduc
8750: 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  e action to the 
8760: 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63  state "stp" whic
8770: 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20 62 79  h will reduce by
8780: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
8790: 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e 72   ** rule "cfp->r
87a0: 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68  p" if the lookah
87b0: 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20 22 6c  ead symbol is "l
87c0: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 22  emp->symbols[j]"
87d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
87e0: 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d  Action_add(&stp-
87f0: 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70 2d  >ap,REDUCE,lemp-
8800: 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68 61  >symbols[j],(cha
8810: 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20 20  r *)cfp->rp);.  
8820: 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20          }..}.   
8830: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
8840: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63    /* Add the acc
8850: 65 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a  epting token */.
8860: 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72    if( lemp->star
8870: 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79  t ){.    sp = Sy
8880: 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e  mbol_find(lemp->
8890: 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20  start);.    if( 
88a0: 73 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d  sp==0 ) sp = lem
88b0: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  p->rule->lhs;.  
88c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20  }else{.    sp = 
88d0: 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b  lemp->rule->lhs;
88e0: 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74 6f  .  }.  /* Add to
88f0: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
8900: 20 28 77 68 69 63 68 20 69 73 20 61 6c 77 61 79   (which is alway
8910: 73 20 74 68 65 20 73 74 61 72 74 69 6e 67 20 73  s the starting s
8920: 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tate of the.  **
8930: 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61   finite state ma
8940: 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69 6f 6e  chine) an action
8950: 20 74 6f 20 41 43 43 45 50 54 20 69 66 20 74 68   to ACCEPT if th
8960: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20 74  e lookahead is t
8970: 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e 6f  he.  ** start no
8980: 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20  nterminal.  */. 
8990: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65 6d   Action_add(&lem
89a0: 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61 70  p->sorted[0]->ap
89b0: 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a 0a  ,ACCEPT,sp,0);..
89c0: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6e    /* Resolve con
89d0: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28  flicts */.  for(
89e0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
89f0: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
8a00: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
8a10: 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74 72 75  , *nap;.    stru
8a20: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
8a30: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
8a40: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 2f 2a  orted[i];.    /*
8a50: 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61 70   assert( stp->ap
8a60: 20 29 3b 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e   ); */.    stp->
8a70: 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74  ap = Action_sort
8a80: 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20 66  (stp->ap);.    f
8a90: 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
8aa0: 70 20 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20 61  p && ap->next; a
8ab0: 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
8ac0: 20 20 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e     for(nap=ap->n
8ad0: 65 78 74 3b 20 6e 61 70 20 26 26 20 6e 61 70 2d  ext; nap && nap-
8ae0: 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61 70  >sp==ap->sp; nap
8af0: 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =nap->next){.   
8b00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
8b10: 20 61 63 74 69 6f 6e 73 20 22 61 70 22 20 61 6e   actions "ap" an
8b20: 64 20 22 6e 61 70 22 20 68 61 76 65 20 74 68 65  d "nap" have the
8b30: 20 73 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64 2e   same lookahead.
8b40: 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 46 69 67  .         ** Fig
8b50: 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e  ure out which on
8b60: 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  e should be used
8b70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 6c 65 6d   */.         lem
8b80: 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d 20  p->nconflict += 
8b90: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
8ba0: 28 61 70 2c 6e 61 70 2c 6c 65 6d 70 2d 3e 65 72  (ap,nap,lemp->er
8bb0: 72 73 79 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsym);.      }. 
8bc0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
8bd0: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66  eport an error f
8be0: 6f 72 20 65 61 63 68 20 72 75 6c 65 20 74 68 61  or each rule tha
8bf0: 74 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72  t can never be r
8c00: 65 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72  educed. */.  for
8c10: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
8c20: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
8c30: 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d   rp->canReduce =
8c40: 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20   LEMON_FALSE;.  
8c50: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
8c60: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
8c70: 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e     struct action
8c80: 20 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28 61 70   *ap;.    for(ap
8c90: 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d  =lemp->sorted[i]
8ca0: 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
8cb0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
8cc0: 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55  ( ap->type==REDU
8cd0: 43 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e 63  CE ) ap->x.rp->c
8ce0: 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e  anReduce = LEMON
8cf0: 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _TRUE;.    }.  }
8d00: 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
8d10: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
8d20: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
8d30: 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 29 20  rp->canReduce ) 
8d40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45 72  continue;.    Er
8d50: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
8d60: 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
8d70: 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20 63 61  ne,"This rule ca
8d80: 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64  n not be reduced
8d90: 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  .\n");.    lemp-
8da0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d  >errorcnt++;.  }
8db0: 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61  .}../* Resolve a
8dc0: 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77 65 65   conflict betwee
8dd0: 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20  n the two given 
8de0: 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  actions.  If the
8df0: 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e  .** conflict can
8e00: 27 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2c 20  't be resolved, 
8e10: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
8e20: 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52  .**.** NO LONGER
8e30: 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72   TRUE:.**   To r
8e40: 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63  esolve a conflic
8e50: 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f  t, first look to
8e60: 20 73 65 65 20 69 66 20 65 69 74 68 65 72 20 61   see if either a
8e70: 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e  ction.**   is on
8e80: 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20   an error rule. 
8e90: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
8ea0: 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77  ake the action w
8eb0: 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74  hich.**   is not
8ec0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8ed0: 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e   the error rule.
8ee0: 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20    If neither or 
8ef0: 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e  both.**   action
8f00: 73 20 61 72 65 20 61 73 73 6f 63 69 61 74 65 64  s are associated
8f10: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72   with an error r
8f20: 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  ule, then try to
8f30: 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65 64  .**   use preced
8f40: 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  ence to resolve 
8f50: 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a  the conflict..**
8f60: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61 63  .** If either ac
8f70: 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c  tion is a SHIFT,
8f80: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65   then it must be
8f90: 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66   apx.  This.** f
8fa0: 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f  unction won't wo
8fb0: 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d  rk if apx->type=
8fc0: 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d  =REDUCE and apy-
8fd0: 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f  >type==SHIFT..*/
8fe0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
8ff0: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20  lve_conflict(.  
9000: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
9010: 70 78 2c 0a 20 20 73 74 72 75 63 74 20 61 63 74  px,.  struct act
9020: 69 6f 6e 20 2a 61 70 79 2c 0a 20 20 73 74 72 75  ion *apy,.  stru
9030: 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79  ct symbol *errsy
9040: 6d 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72  m   /* The error
9050: 20 73 79 6d 62 6f 6c 20 28 69 66 20 64 65 66 69   symbol (if defi
9060: 6e 65 64 2e 20 20 4e 55 4c 4c 20 6f 74 68 65 72  ned.  NULL other
9070: 77 69 73 65 29 20 2a 2f 0a 29 7b 0a 20 20 73 74  wise) */.){.  st
9080: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78  ruct symbol *spx
9090: 2c 20 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65 72  , *spy;.  int er
90a0: 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73 65  rcnt = 0;.  asse
90b0: 72 74 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79  rt( apx->sp==apy
90c0: 2d 3e 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65  ->sp );  /* Othe
90d0: 72 77 69 73 65 20 74 68 65 72 65 20 77 6f 75 6c  rwise there woul
90e0: 64 20 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74  d be no conflict
90f0: 20 2a 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e 74   */.  if( apx->t
9100: 79 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70  ype==SHIFT && ap
9110: 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 29  y->type==SHIFT )
9120: 7b 0a 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20  {.    apy->type 
9130: 3d 20 53 53 43 4f 4e 46 4c 49 43 54 3b 0a 20 20  = SSCONFLICT;.  
9140: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a    errcnt++;.  }.
9150: 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d    if( apx->type=
9160: 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74  =SHIFT && apy->t
9170: 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20  ype==REDUCE ){. 
9180: 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70     spx = apx->sp
9190: 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d  ;.    spy = apy-
91a0: 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a  >x.rp->precsym;.
91b0: 20 20 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c      if( spy==0 |
91c0: 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c  | spx->prec<0 ||
91d0: 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a   spy->prec<0 ){.
91e0: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f        /* Not eno
91f0: 75 67 68 20 70 72 65 63 65 64 65 6e 63 65 20 69  ugh precedence i
9200: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20  nformation. */. 
9210: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
9220: 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   SRCONFLICT;.   
9230: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
9240: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
9250: 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29  prec>spy->prec )
9260: 7b 20 20 20 20 2f 2a 20 4c 6f 77 65 72 20 70 72  {    /* Lower pr
9270: 65 63 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f  ecedence wins */
9280: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
9290: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a   = RD_RESOLVED;.
92a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
92b0: 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65  x->prec<spy->pre
92c0: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e  c ){.      apx->
92d0: 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56  type = SH_RESOLV
92e0: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
92f0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
9300: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
9310: 73 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f  ssoc==RIGHT ){ /
9320: 2a 20 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a  * Use operator *
9330: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
9340: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9370: 61 73 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f  associativity */
9380: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
9390: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
93a0: 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f  rec && spx->asso
93b0: 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74  c==LEFT ){  /* t
93c0: 6f 20 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20  o break tie */. 
93d0: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
93e0: 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   SH_RESOLVED;.  
93f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
9400: 73 73 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63  ssert( spx->prec
9410: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
9420: 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20  px->assoc==NONE 
9430: 29 3b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  );.      apy->ty
9440: 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b  pe = SRCONFLICT;
9450: 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b  .      errcnt++;
9460: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
9470: 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45  f( apx->type==RE
9480: 44 55 43 45 20 26 26 20 61 70 79 2d 3e 74 79 70  DUCE && apy->typ
9490: 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20  e==REDUCE ){.   
94a0: 20 73 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70   spx = apx->x.rp
94b0: 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 73  ->precsym;.    s
94c0: 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e  py = apy->x.rp->
94d0: 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28  precsym;.    if(
94e0: 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d   spx==0 || spy==
94f0: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30  0 || spx->prec<0
9500: 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72 65   ||.    spy->pre
9510: 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63  c<0 || spx->prec
9520: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  ==spy->prec ){. 
9530: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
9540: 20 52 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   RRCONFLICT;.   
9550: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
9560: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
9570: 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29  prec>spy->prec )
9580: 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  {.      apy->typ
9590: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
95a0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
95b0: 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72  px->prec<spy->pr
95c0: 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d  ec ){.      apx-
95d0: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
95e0: 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  VED;.    }.  }el
95f0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
9600: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
9610: 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==SH_RESOLVED ||
9620: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
9630: 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==RD_RESOLVED ||
9640: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
9650: 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a  ==SSCONFLICT ||.
9660: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
9670: 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =SRCONFLICT ||. 
9680: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d       apx->type==
9690: 52 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20  RRCONFLICT ||.  
96a0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53      apy->type==S
96b0: 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20  H_RESOLVED ||.  
96c0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52      apy->type==R
96d0: 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20  D_RESOLVED ||.  
96e0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53      apy->type==S
96f0: 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20  SCONFLICT ||.   
9700: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 52     apy->type==SR
9710: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
9720: 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 52 43    apy->type==RRC
9730: 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29 3b 0a 20  ONFLICT.    );. 
9740: 20 20 20 2f 2a 20 54 68 65 20 52 45 44 55 43 45     /* The REDUCE
9750: 2f 53 48 49 46 54 20 63 61 73 65 20 63 61 6e 6e  /SHIFT case cann
9760: 6f 74 20 68 61 70 70 65 6e 20 62 65 63 61 75 73  ot happen becaus
9770: 65 20 53 48 49 46 54 73 20 63 6f 6d 65 20 62 65  e SHIFTs come be
9780: 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52 45 44 55  fore.    ** REDU
9790: 43 45 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e  CEs on the list.
97a0: 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68    If we reach th
97b0: 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73 74  is point it must
97c0: 20 62 65 20 62 65 63 61 75 73 65 0a 20 20 20 20   be because.    
97d0: 2a 2a 20 74 68 65 20 70 61 72 73 65 72 20 63 6f  ** the parser co
97e0: 6e 66 6c 69 63 74 20 68 61 64 20 61 6c 72 65 61  nflict had alrea
97f0: 64 79 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  dy been resolved
9800: 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  . */.  }.  retur
9810: 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a  n errcnt;.}./***
9820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9830: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
9840: 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63 22 20   "configlist.c" 
9850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
9870: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 70 72 6f   Routines to pro
9880: 63 65 73 73 69 6e 67 20 61 20 63 6f 6e 66 69 67  cessing a config
9890: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64  uration list and
98a0: 20 62 75 69 6c 64 69 6e 67 20 61 20 73 74 61 74   building a stat
98b0: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f  e.** in the LEMO
98c0: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
98d0: 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 73  or..*/..static s
98e0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 66 72  truct config *fr
98f0: 65 65 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  eelist = 0;     
9900: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
9910: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
9920: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
9930: 20 63 6f 6e 66 69 67 20 2a 63 75 72 72 65 6e 74   config *current
9940: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
9950: 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 63 6f  op of list of co
9960: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
9970: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
9980: 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e 74 65 6e  nfig **currenten
9990: 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61 73 74  d = 0;   /* Last
99a0: 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66   on list of conf
99b0: 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  igs */.static st
99c0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 61 73  ruct config *bas
99d0: 69 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  is = 0;         
99e0: 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f  /* Top of list o
99f0: 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20  f basis configs 
9a00: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
9a10: 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69 73 65   config **basise
9a20: 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 45  nd = 0;     /* E
9a30: 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61  nd of list of ba
9a40: 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a  sis configs */..
9a50: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
9a60: 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 6f 6e  ter to a new con
9a70: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52  figuration */.PR
9a80: 49 56 41 54 45 20 73 74 72 75 63 74 20 63 6f 6e  IVATE struct con
9a90: 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67 28 29  fig *newconfig()
9aa0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
9ab0: 67 20 2a 6e 65 77 63 66 67 3b 0a 20 20 69 66 28  g *newcfg;.  if(
9ac0: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
9ad0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
9ae0: 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20  nt amt = 3;.    
9af0: 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
9b00: 63 74 20 63 6f 6e 66 69 67 20 2a 29 63 61 6c 6c  ct config *)call
9b10: 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
9b20: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 20 29  struct config) )
9b30: 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69  ;.    if( freeli
9b40: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
9b50: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
9b60: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
9b70: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
9b80: 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ew configuration
9b90: 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  .");.      exit(
9ba0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
9bb0: 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20  r(i=0; i<amt-1; 
9bc0: 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d  i++) freelist[i]
9bd0: 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73  .next = &freelis
9be0: 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65  t[i+1];.    free
9bf0: 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74  list[amt-1].next
9c00: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 63   = 0;.  }.  newc
9c10: 66 67 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  fg = freelist;. 
9c20: 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65   freelist = free
9c30: 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
9c40: 74 75 72 6e 20 6e 65 77 63 66 67 3b 0a 7d 0a 0a  turn newcfg;.}..
9c50: 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61  /* The configura
9c60: 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f  tion "old" is no
9c70: 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a   longer used */.
9c80: 50 52 49 56 41 54 45 20 76 6f 69 64 20 64 65 6c  PRIVATE void del
9c90: 65 74 65 63 6f 6e 66 69 67 28 73 74 72 75 63 74  eteconfig(struct
9ca0: 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 29 0a 7b 0a   config *old).{.
9cb0: 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72    old->next = fr
9cc0: 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69  eelist;.  freeli
9cd0: 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20  st = old;.}../* 
9ce0: 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20  Initialized the 
9cf0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
9d00: 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f  st builder */.vo
9d10: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e  id Configlist_in
9d20: 69 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  it(){.  current 
9d30: 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  = 0;.  currenten
9d40: 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20  d = &current;.  
9d50: 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73  basis = 0;.  bas
9d60: 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a  isend = &basis;.
9d70: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e    Configtable_in
9d80: 69 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  it();.  return;.
9d90: 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  }../* Initialize
9da0: 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  d the configurat
9db0: 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72  ion list builder
9dc0: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
9dd0: 69 73 74 5f 72 65 73 65 74 28 29 7b 0a 20 20 63  ist_reset(){.  c
9de0: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75  urrent = 0;.  cu
9df0: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72  rrentend = &curr
9e00: 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  ent;.  basis = 0
9e10: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26  ;.  basisend = &
9e20: 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74  basis;.  Configt
9e30: 61 62 6c 65 5f 63 6c 65 61 72 28 30 29 3b 0a 20  able_clear(0);. 
9e40: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41   return;.}../* A
9e50: 64 64 20 61 6e 6f 74 68 65 72 20 63 6f 6e 66 69  dd another confi
9e60: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
9e70: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
9e80: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
9e90: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
9ea0: 61 64 64 28 0a 20 20 73 74 72 75 63 74 20 72 75  add(.  struct ru
9eb0: 6c 65 20 2a 72 70 2c 20 20 20 20 2f 2a 20 54 68  le *rp,    /* Th
9ec0: 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e rule */.  int 
9ed0: 64 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  dot             
9ee0: 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
9ef0: 65 20 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c  e RHS of the rul
9f00: 65 20 77 68 65 72 65 20 74 68 65 20 64 6f 74 20  e where the dot 
9f10: 67 6f 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  goes */.){.  str
9f20: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c  uct config *cfp,
9f30: 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72   model;..  asser
9f40: 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30  t( currentend!=0
9f50: 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d   );.  model.rp =
9f60: 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74   rp;.  model.dot
9f70: 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20   = dot;.  cfp = 
9f80: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64  Configtable_find
9f90: 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20  (&model);.  if( 
9fa0: 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66  cfp==0 ){.    cf
9fb0: 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b  p = newconfig();
9fc0: 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72  .    cfp->rp = r
9fd0: 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20  p;.    cfp->dot 
9fe0: 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e  = dot;.    cfp->
9ff0: 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a  fws = SetNew();.
a000: 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30      cfp->stp = 0
a010: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20  ;.    cfp->fplp 
a020: 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b  = cfp->bplp = 0;
a030: 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d  .    cfp->next =
a040: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20   0;.    cfp->bp 
a050: 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e  = 0;.    *curren
a060: 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20  tend = cfp;.    
a070: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66  currentend = &cf
a080: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f 6e  p->next;.    Con
a090: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
a0a0: 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  cfp);.  }.  retu
a0b0: 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41 64  rn cfp;.}../* Ad
a0c0: 64 20 61 20 62 61 73 69 73 20 63 6f 6e 66 69 67  d a basis config
a0d0: 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63  uration to the c
a0e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
a0f0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
a100: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
a110: 64 64 62 61 73 69 73 28 73 74 72 75 63 74 20 72  ddbasis(struct r
a120: 75 6c 65 20 2a 72 70 2c 20 69 6e 74 20 64 6f 74  ule *rp, int dot
a130: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ).{.  struct con
a140: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
a150: 0a 0a 20 20 61 73 73 65 72 74 28 20 62 61 73 69  ..  assert( basi
a160: 73 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  send!=0 );.  ass
a170: 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21  ert( currentend!
a180: 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70  =0 );.  model.rp
a190: 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64   = rp;.  model.d
a1a0: 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20  ot = dot;.  cfp 
a1b0: 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69  = Configtable_fi
a1c0: 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66  nd(&model);.  if
a1d0: 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ( cfp==0 ){.    
a1e0: 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28  cfp = newconfig(
a1f0: 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d  );.    cfp->rp =
a200: 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f   rp;.    cfp->do
a210: 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70  t = dot;.    cfp
a220: 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29  ->fws = SetNew()
a230: 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d  ;.    cfp->stp =
a240: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c   0;.    cfp->fpl
a250: 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20  p = cfp->bplp = 
a260: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74  0;.    cfp->next
a270: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62   = 0;.    cfp->b
a280: 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72  p = 0;.    *curr
a290: 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20  entend = cfp;.  
a2a0: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26    currentend = &
a2b0: 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a  cfp->next;.    *
a2c0: 62 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a  basisend = cfp;.
a2d0: 20 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26      basisend = &
a2e0: 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e  cfp->bp;.    Con
a2f0: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
a300: 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  cfp);.  }.  retu
a310: 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f  rn cfp;.}../* Co
a320: 6d 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75 72  mpute the closur
a330: 65 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  e of the configu
a340: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
a350: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63  oid Configlist_c
a360: 6c 6f 73 75 72 65 28 73 74 72 75 63 74 20 6c 65  losure(struct le
a370: 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73  mon *lemp).{.  s
a380: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
a390: 70 2c 20 2a 6e 65 77 63 66 70 3b 0a 20 20 73 74  p, *newcfp;.  st
a3a0: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a  ruct rule *rp, *
a3b0: 6e 65 77 72 70 3b 0a 20 20 73 74 72 75 63 74 20  newrp;.  struct 
a3c0: 73 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a 78 73 70  symbol *sp, *xsp
a3d0: 3b 0a 20 20 69 6e 74 20 69 2c 20 64 6f 74 3b 0a  ;.  int i, dot;.
a3e0: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65  .  assert( curre
a3f0: 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 66 6f  ntend!=0 );.  fo
a400: 72 28 63 66 70 3d 63 75 72 72 65 6e 74 3b 20 63  r(cfp=current; c
a410: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
a420: 74 29 7b 0a 20 20 20 20 72 70 20 3d 20 63 66 70  t){.    rp = cfp
a430: 2d 3e 72 70 3b 0a 20 20 20 20 64 6f 74 20 3d 20  ->rp;.    dot = 
a440: 63 66 70 2d 3e 64 6f 74 3b 0a 20 20 20 20 69 66  cfp->dot;.    if
a450: 28 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72 68 73 20  ( dot>=rp->nrhs 
a460: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a470: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 64 6f 74  sp = rp->rhs[dot
a480: 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  ];.    if( sp->t
a490: 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c  ype==NONTERMINAL
a4a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 70   ){.      if( sp
a4b0: 2d 3e 72 75 6c 65 3d 3d 30 20 26 26 20 73 70 21  ->rule==0 && sp!
a4c0: 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b  =lemp->errsym ){
a4d0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
a4e0: 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
a4f0: 2c 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65  ,rp->line,"Nonte
a500: 72 6d 69 6e 61 6c 20 5c 22 25 73 5c 22 20 68 61  rminal \"%s\" ha
a510: 73 20 6e 6f 20 72 75 6c 65 73 2e 22 2c 0a 20 20  s no rules.",.  
a520: 20 20 20 20 20 20 20 20 73 70 2d 3e 6e 61 6d 65          sp->name
a530: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d  );.        lemp-
a540: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
a550: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e     }.      for(n
a560: 65 77 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e  ewrp=sp->rule; n
a570: 65 77 72 70 3b 20 6e 65 77 72 70 3d 6e 65 77 72  ewrp; newrp=newr
a580: 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20  p->nextlhs){.   
a590: 20 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f       newcfp = Co
a5a0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 6e 65 77  nfiglist_add(new
a5b0: 72 70 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 66  rp,0);.        f
a5c0: 6f 72 28 69 3d 64 6f 74 2b 31 3b 20 69 3c 72 70  or(i=dot+1; i<rp
a5d0: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
a5e0: 20 20 20 20 20 20 20 20 78 73 70 20 3d 20 72 70          xsp = rp
a5f0: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
a600: 20 20 20 20 69 66 28 20 78 73 70 2d 3e 74 79 70      if( xsp->typ
a610: 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  e==TERMINAL ){. 
a620: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 41 64             SetAd
a630: 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73  d(newcfp->fws,xs
a640: 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
a650: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a660: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
a670: 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  ( xsp->type==MUL
a680: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
a690: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
a6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
a6b0: 28 6b 3d 30 3b 20 6b 3c 78 73 70 2d 3e 6e 73 75  (k=0; k<xsp->nsu
a6c0: 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  bsym; k++){.    
a6d0: 20 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64            SetAdd
a6e0: 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 20 78 73  (newcfp->fws, xs
a6f0: 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 69 6e  p->subsym[k]->in
a700: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
a710: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
a720: 62 72 65 61 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b  break;..  }else{
a730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  .            Set
a740: 55 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77  Union(newcfp->fw
a750: 73 2c 78 73 70 2d 3e 66 69 72 73 74 73 65 74 29  s,xsp->firstset)
a760: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
a770: 28 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  ( xsp->lambda==L
a780: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
a790: 61 6b 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20  ak;..  }..}.    
a7a0: 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
a7b0: 72 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28  rhs ) Plink_add(
a7c0: 26 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66  &cfp->fplp,newcf
a7d0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
a7e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  }.  }.  return;.
a7f0: 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63  }../* Sort the c
a800: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
a810: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
a820: 6c 69 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63  list_sort(){.  c
a830: 75 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74  urrent = (struct
a840: 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28   config *)msort(
a850: 28 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74 2c  (char *)current,
a860: 28 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72 65  (char **)&(curre
a870: 6e 74 2d 3e 6e 65 78 74 29 2c 43 6f 6e 66 69 67  nt->next),Config
a880: 63 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65  cmp);.  currente
a890: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
a8a0: 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65  ;.}../* Sort the
a8b0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
a8c0: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
a8d0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
a8e0: 74 62 61 73 69 73 28 29 7b 0a 20 20 62 61 73 69  tbasis(){.  basi
a8f0: 73 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  s = (struct conf
a900: 69 67 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72  ig *)msort((char
a910: 20 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72   *)current,(char
a920: 20 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 62   **)&(current->b
a930: 70 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20  p),Configcmp);. 
a940: 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20   basisend = 0;. 
a950: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
a960: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
a970: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
a980: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
a990: 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73   list and.** res
a9a0: 65 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73  et the list */.s
a9b0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
a9c0: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
a9d0: 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  ){.  struct conf
a9e0: 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d  ig *old;.  old =
a9f0: 20 63 75 72 72 65 6e 74 3b 0a 20 20 63 75 72 72   current;.  curr
aa00: 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65  ent = 0;.  curre
aa10: 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74  ntend = 0;.  ret
aa20: 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52  urn old;.}../* R
aa30: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
aa40: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74  to the head of t
aa50: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
aa60: 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73   list and.** res
aa70: 65 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73  et the list */.s
aa80: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
aa90: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29  nfiglist_basis()
aaa0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
aab0: 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20  g *old;.  old = 
aac0: 62 61 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d  basis;.  basis =
aad0: 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d   0;.  basisend =
aae0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64   0;.  return old
aaf0: 3b 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c  ;.}../* Free all
ab00: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
ab10: 20 67 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61   given configura
ab20: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
ab30: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74  d Configlist_eat
ab40: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
ab50: 63 66 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  cfp).{.  struct 
ab60: 63 6f 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b  config *nextcfp;
ab70: 0a 20 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66  .  for(; cfp; cf
ab80: 70 3d 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20  p=nextcfp){.    
ab90: 6e 65 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e  nextcfp = cfp->n
aba0: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
abb0: 20 63 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b   cfp->fplp==0 );
abc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70  .    assert( cfp
abd0: 2d 3e 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20  ->bplp==0 );.   
abe0: 20 69 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20   if( cfp->fws ) 
abf0: 53 65 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73  SetFree(cfp->fws
ac00: 29 3b 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e  );.    deletecon
ac10: 66 69 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20  fig(cfp);.  }.  
ac20: 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  return;.}./*****
ac30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
ac40: 6d 20 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f  m the file "erro
ac50: 72 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  r.c" ***********
ac60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac70: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  ******/./*.** Co
ac80: 64 65 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20  de for printing 
ac90: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
aca0: 2f 0a 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67  /..void ErrorMsg
acb0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c  (const char *fil
acc0: 65 6e 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e  ename, int linen
acd0: 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  o, const char *f
ace0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
acf0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 66 70 72  a_list ap;.  fpr
ad00: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
ad10: 3a 25 64 3a 20 22 2c 20 66 69 6c 65 6e 61 6d 65  :%d: ", filename
ad20: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 76 61 5f  , lineno);.  va_
ad30: 73 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74  start(ap, format
ad40: 29 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 73 74  );.  vfprintf(st
ad50: 64 65 72 72 2c 66 6f 72 6d 61 74 2c 61 70 29 3b  derr,format,ap);
ad60: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
ad70: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
ad80: 20 22 5c 6e 22 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a   "\n");.}./*****
ad90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
ada0: 20 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e   the file "main.
adb0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
adc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
add0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d  *******/./*.** M
ade0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65  ain program file
adf0: 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70   for the LEMON p
ae00: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
ae10: 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61  .*/../* Report a
ae20: 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20  n out-of-memory 
ae30: 63 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62  condition and ab
ae40: 6f 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ort.  This funct
ae50: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d  ion.** is used m
ae60: 6f 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65  ostly by the "Me
ae70: 6d 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f  moryCheck" macro
ae80: 20 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a   in struct.h.*/.
ae90: 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
aea0: 72 28 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73  r(){.  fprintf(s
aeb0: 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
aec0: 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e  mory.  Aborting.
aed0: 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31  ..\n");.  exit(1
aee0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
aef0: 20 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 20   nDefine = 0;   
af00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
af10: 2d 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20 74 68  -D options on th
af20: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a  e command line *
af30: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a  /.static char **
af40: 61 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20 20 2f  azDefine = 0;  /
af50: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 2d 44  * Name of the -D
af60: 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54   macros */../* T
af70: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
af80: 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 61  alled with the a
af90: 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63 68 20  rgument to each 
afa0: 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  -D command-line 
afb0: 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74  option..** Add t
afc0: 68 65 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64  he macro defined
afd0: 20 74 6f 20 74 68 65 20 61 7a 44 65 66 69 6e 65   to the azDefine
afe0: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
aff0: 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f 44 5f  c void handle_D_
b000: 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b  option(char *z){
b010: 0a 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b 0a 20  .  char **paz;. 
b020: 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a   nDefine++;.  az
b030: 44 65 66 69 6e 65 20 3d 20 28 63 68 61 72 20 2a  Define = (char *
b040: 2a 29 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66  *) realloc(azDef
b050: 69 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65  ine, sizeof(azDe
b060: 66 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65  fine[0])*nDefine
b070: 29 3b 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e  );.  if( azDefin
b080: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
b090: 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20  ntf(stderr,"out 
b0a0: 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
b0b0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
b0c0: 20 20 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e    paz = &azDefin
b0d0: 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20  e[nDefine-1];.  
b0e0: 2a 70 61 7a 20 3d 20 28 63 68 61 72 20 2a 29 20  *paz = (char *) 
b0f0: 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72  malloc( lemonStr
b100: 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66  len(z)+1 );.  if
b110: 28 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20  ( *paz==0 ){.   
b120: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
b130: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
b140: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
b150: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 2a 70  .  }.  strcpy(*p
b160: 61 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28 7a 3d  az, z);.  for(z=
b170: 2a 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d  *paz; *z && *z!=
b180: 27 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a 7a  '='; z++){}.  *z
b190: 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = 0;.}..static 
b1a0: 63 68 61 72 20 2a 75 73 65 72 5f 74 65 6d 70 6c  char *user_templ
b1b0: 61 74 65 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  atename = NULL;.
b1c0: 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e 64  static void hand
b1d0: 6c 65 5f 54 5f 6f 70 74 69 6f 6e 28 63 68 61 72  le_T_option(char
b1e0: 20 2a 7a 29 7b 0a 20 20 75 73 65 72 5f 74 65 6d   *z){.  user_tem
b1f0: 70 6c 61 74 65 6e 61 6d 65 20 3d 20 28 63 68 61  platename = (cha
b200: 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d  r *) malloc( lem
b210: 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b  onStrlen(z)+1 );
b220: 0a 20 20 69 66 28 20 75 73 65 72 5f 74 65 6d 70  .  if( user_temp
b230: 6c 61 74 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  latename==0 ){. 
b240: 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28     memory_error(
b250: 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28  );.  }.  strcpy(
b260: 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
b270: 65 2c 20 7a 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  e, z);.}../* The
b280: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 20   main program.  
b290: 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e  Parse the comman
b2a0: 64 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69 74  d line and do it
b2b0: 2e 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28  ... */.int main(
b2c0: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
b2d0: 2a 61 72 67 76 29 0a 7b 0a 20 20 73 74 61 74 69  *argv).{.  stati
b2e0: 63 20 69 6e 74 20 76 65 72 73 69 6f 6e 20 3d 20  c int version = 
b2f0: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
b300: 72 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74  rpflag = 0;.  st
b310: 61 74 69 63 20 69 6e 74 20 62 61 73 69 73 66 6c  atic int basisfl
b320: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
b330: 20 69 6e 74 20 63 6f 6d 70 72 65 73 73 20 3d 20   int compress = 
b340: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
b350: 71 75 69 65 74 20 3d 20 30 3b 0a 20 20 73 74 61  quiet = 0;.  sta
b360: 74 69 63 20 69 6e 74 20 73 74 61 74 69 73 74 69  tic int statisti
b370: 63 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  cs = 0;.  static
b380: 20 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20 30 3b   int mhflag = 0;
b390: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .  static int no
b3a0: 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 30 3b  linenosflag = 0;
b3b0: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
b3c0: 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69 6f   s_options optio
b3d0: 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f 50  ns[] = {.    {OP
b3e0: 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28 63 68  T_FLAG, "b", (ch
b3f0: 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67 2c 20  ar*)&basisflag, 
b400: 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65 20  "Print only the 
b410: 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72 74 2e  basis in report.
b420: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b430: 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a 29 26  G, "c", (char*)&
b440: 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27 74  compress, "Don't
b450: 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63   compress the ac
b460: 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a 20  tion table."},. 
b470: 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 44     {OPT_FSTR, "D
b480: 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c 65  ", (char*)handle
b490: 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65 66 69  _D_option, "Defi
b4a0: 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d 61 63  ne an %ifdef mac
b4b0: 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ro."},.    {OPT_
b4c0: 46 53 54 52 2c 20 22 54 22 2c 20 28 63 68 61 72  FSTR, "T", (char
b4d0: 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f  *)handle_T_optio
b4e0: 6e 2c 20 22 53 70 65 63 69 66 79 20 61 20 74 65  n, "Specify a te
b4f0: 6d 70 6c 61 74 65 20 66 69 6c 65 2e 22 7d 2c 0a  mplate file."},.
b500: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
b510: 67 22 2c 20 28 63 68 61 72 2a 29 26 72 70 66 6c  g", (char*)&rpfl
b520: 61 67 2c 20 22 50 72 69 6e 74 20 67 72 61 6d 6d  ag, "Print gramm
b530: 61 72 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f  ar without actio
b540: 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ns."},.    {OPT_
b550: 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68 61 72  FLAG, "m", (char
b560: 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74 70  *)&mhflag, "Outp
b570: 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65 72 73  ut a makeheaders
b580: 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65   compatible file
b590: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
b5a0: 41 47 2c 20 22 6c 22 2c 20 28 63 68 61 72 2a 29  AG, "l", (char*)
b5b0: 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 2c 20  &nolinenosflag, 
b5c0: 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74 20 23 6c  "Do not print #l
b5d0: 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 22  ine statements."
b5e0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
b5f0: 2c 20 22 71 22 2c 20 28 63 68 61 72 2a 29 26 71  , "q", (char*)&q
b600: 75 69 65 74 2c 20 22 28 51 75 69 65 74 29 20 44  uiet, "(Quiet) D
b610: 6f 6e 27 74 20 70 72 69 6e 74 20 74 68 65 20 72  on't print the r
b620: 65 70 6f 72 74 20 66 69 6c 65 2e 22 7d 2c 0a 20  eport file."},. 
b630: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 73     {OPT_FLAG, "s
b640: 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74 69  ", (char*)&stati
b650: 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20 20 20  stics,.         
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 20 20 20 20 20 20 20 22 50 72 69 6e 74            "Print
b680: 20 70 61 72 73 65 72 20 73 74 61 74 73 20 74 6f   parser stats to
b690: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
b6a0: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
b6b0: 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a 29  AG, "x", (char*)
b6c0: 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e 74  &version, "Print
b6d0: 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75 6d   the version num
b6e0: 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ber."},.    {OPT
b6f0: 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a 20 20 7d  _FLAG,0,0,0}.  }
b700: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
b710: 20 65 78 69 74 63 6f 64 65 3b 0a 20 20 73 74 72   exitcode;.  str
b720: 75 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a 0a  uct lemon lem;..
b730: 20 20 61 74 65 78 69 74 28 4c 65 6d 6f 6e 41 74    atexit(LemonAt
b740: 45 78 69 74 29 3b 0a 0a 20 20 4f 70 74 49 6e 69  Exit);..  OptIni
b750: 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73  t(argv,options,s
b760: 74 64 65 72 72 29 3b 0a 20 20 69 66 28 20 76 65  tderr);.  if( ve
b770: 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72  rsion ){.     pr
b780: 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73  intf("Lemon vers
b790: 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20 20  ion 1.0\n");.   
b7a0: 20 20 65 78 69 74 28 30 29 3b 20 0a 20 20 7d 0a    exit(0); .  }.
b7b0: 20 20 69 66 28 20 4f 70 74 4e 41 72 67 73 28 29    if( OptNArgs()
b7c0: 21 3d 31 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  !=1 ){.    fprin
b7d0: 74 66 28 73 74 64 65 72 72 2c 22 45 78 61 63 74  tf(stderr,"Exact
b7e0: 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65 20  ly one filename 
b7f0: 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65 71 75  argument is requ
b800: 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  ired.\n");.    e
b810: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65  xit(1);.  }.  me
b820: 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c 20 73 69  mset(&lem, 0, si
b830: 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20 20 6c 65  zeof(lem));.  le
b840: 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a  m.errorcnt = 0;.
b850: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
b860: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a   the machine */.
b870: 20 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29    Strsafe_init()
b880: 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28  ;.  Symbol_init(
b890: 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69 74 28  );.  State_init(
b8a0: 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d  );.  lem.argv0 =
b8b0: 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e   argv[0];.  lem.
b8c0: 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72  filename = OptAr
b8d0: 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69  g(0);.  lem.basi
b8e0: 73 66 6c 61 67 20 3d 20 62 61 73 69 73 66 6c 61  sflag = basisfla
b8f0: 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69 6e 65 6e  g;.  lem.nolinen
b900: 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69 6e 65 6e  osflag = nolinen
b910: 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d 62 6f 6c  osflag;.  Symbol
b920: 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20 6c 65 6d  _new("$");.  lem
b930: 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d 62 6f 6c  .errsym = Symbol
b940: 5f 6e 65 77 28 22 65 72 72 6f 72 22 29 3b 0a 20  _new("error");. 
b950: 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e 75 73 65   lem.errsym->use
b960: 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 50  Cnt = 0;..  /* P
b970: 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 66  arse the input f
b980: 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26  ile */.  Parse(&
b990: 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e  lem);.  if( lem.
b9a0: 65 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28  errorcnt ) exit(
b9b0: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20  lem.errorcnt);. 
b9c0: 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c 65 3d 3d   if( lem.nrule==
b9d0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
b9e0: 28 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20 67  (stderr,"Empty g
b9f0: 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20  rammar.\n");.   
ba00: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20   exit(1);.  }.. 
ba10: 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e   /* Count and in
ba20: 64 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  dex the symbols 
ba30: 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  of the grammar *
ba40: 2f 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20  /.  lem.nsymbol 
ba50: 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29  = Symbol_count()
ba60: 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22  ;.  Symbol_new("
ba70: 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c  {default}");.  l
ba80: 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d  em.symbols = Sym
ba90: 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20  bol_arrayof();. 
baa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d   for(i=0; i<=lem
bab0: 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c  .nsymbol; i++) l
bac0: 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69  em.symbols[i]->i
bad0: 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72  ndex = i;.  qsor
bae0: 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65  t(lem.symbols,le
baf0: 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65  m.nsymbol+1,size
bb00: 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
bb10: 2a 29 2c 20 53 79 6d 62 6f 6c 63 6d 70 70 29 3b  *), Symbolcmpp);
bb20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c  .  for(i=0; i<=l
bb30: 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  em.nsymbol; i++)
bb40: 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d   lem.symbols[i]-
bb50: 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 66 6f  >index = i;.  fo
bb60: 72 28 69 3d 31 3b 20 69 73 75 70 70 65 72 28 6c  r(i=1; isupper(l
bb70: 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  em.symbols[i]->n
bb80: 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20  ame[0]); i++);. 
bb90: 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d   lem.nterminal =
bba0: 20 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61   i;..  /* Genera
bbb0: 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f 66 20  te a reprint of 
bbc0: 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69 66 20  the grammar, if 
bbd0: 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74 68 65  requested on the
bbe0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f   command line */
bbf0: 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20 29 7b  .  if( rpflag ){
bc00: 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26 6c 65  .    Reprint(&le
bc10: 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
bc20: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
bc30: 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c 6c 20  he size for all 
bc40: 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72 73 74  follow and first
bc50: 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53 65 74   sets */.    Set
bc60: 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d 69 6e  Size(lem.ntermin
bc70: 61 6c 2b 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 46  al+1);..    /* F
bc80: 69 6e 64 20 74 68 65 20 70 72 65 63 65 64 65 6e  ind the preceden
bc90: 63 65 20 66 6f 72 20 65 76 65 72 79 20 70 72 6f  ce for every pro
bca0: 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28 74 68  duction rule (th
bcb0: 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20  at has one) */. 
bcc0: 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65     FindRulePrece
bcd0: 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20  dences(&lem);.. 
bce0: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
bcf0: 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d  e lambda-nonterm
bd00: 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20 66 69  inals and the fi
bd10: 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65 76 65  rst-sets for eve
bd20: 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72  ry.    ** nonter
bd30: 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e  minal */.    Fin
bd40: 64 46 69 72 73 74 53 65 74 73 28 26 6c 65 6d 29  dFirstSets(&lem)
bd50: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
bd60: 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74  e all LR(0) stat
bd70: 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f 72 64  es.  Also record
bd80: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70   follow-set prop
bd90: 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c  agation.    ** l
bda0: 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74 68 65  inks so that the
bdb0: 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20   follow-set can 
bdc0: 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65  be computed late
bdd0: 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74  r */.    lem.nst
bde0: 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e  ate = 0;.    Fin
bdf0: 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20  dStates(&lem);. 
be00: 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20     lem.sorted = 
be10: 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 3b  State_arrayof();
be20: 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75 70 20  ..    /* Tie up 
be30: 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20 74 68  loose ends on th
be40: 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69  e propagation li
be50: 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c  nks */.    FindL
be60: 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  inks(&lem);..   
be70: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
be80: 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20 65 76  follow set of ev
be90: 65 72 79 20 72 65 64 75 63 69 62 6c 65 20 63 6f  ery reducible co
bea0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20  nfiguration */. 
beb0: 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74     FindFollowSet
bec0: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
bed0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74   Compute the act
bee0: 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ion tables */.  
bef0: 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c    FindActions(&l
bf00: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  em);..    /* Com
bf10: 70 72 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e  press the action
bf20: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69   tables */.    i
bf30: 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29  f( compress==0 )
bf40: 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28   CompressTables(
bf50: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  &lem);..    /* R
bf60: 65 6f 72 64 65 72 20 61 6e 64 20 72 65 6e 75 6d  eorder and renum
bf70: 62 65 72 20 74 68 65 20 73 74 61 74 65 73 20 73  ber the states s
bf80: 6f 20 74 68 61 74 20 73 74 61 74 65 73 20 77 69  o that states wi
bf90: 74 68 20 66 65 77 65 72 20 63 68 6f 69 63 65 73  th fewer choices
bfa0: 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 20 61 74  .    ** occur at
bfb0: 20 74 68 65 20 65 6e 64 2e 20 2a 2f 0a 20 20 20   the end. */.   
bfc0: 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 26 6c   ResortStates(&l
bfd0: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  em);..    /* Gen
bfe0: 65 72 61 74 65 20 61 20 72 65 70 6f 72 74 20 6f  erate a report o
bff0: 66 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e  f the parser gen
c000: 65 72 61 74 65 64 2e 20 20 28 74 68 65 20 22 79  erated.  (the "y
c010: 2e 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20 2a  .output" file) *
c020: 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69 65 74  /.    if( !quiet
c030: 20 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28   ) ReportOutput(
c040: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  &lem);..    /* G
c050: 65 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75 72  enerate the sour
c060: 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ce code for the 
c070: 70 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52 65  parser */.    Re
c080: 70 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20  portTable(&lem, 
c090: 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a  mhflag);..    /*
c0a0: 20 50 72 6f 64 75 63 65 20 61 20 68 65 61 64 65   Produce a heade
c0b0: 72 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20 62  r file for use b
c0c0: 79 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20 20  y the scanner.  
c0d0: 28 54 68 69 73 20 73 74 65 70 20 69 73 0a 20 20  (This step is.  
c0e0: 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20    ** omitted if 
c0f0: 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20  the "-m" option 
c100: 69 73 20 75 73 65 64 20 62 65 63 61 75 73 65 20  is used because 
c110: 6d 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c 6c  makeheaders will
c120: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
c130: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75 73   the file for us
c140: 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d  .) */.    if( !m
c150: 68 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48 65  hflag ) ReportHe
c160: 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a  ader(&lem);.  }.
c170: 20 20 69 66 28 20 73 74 61 74 69 73 74 69 63 73    if( statistics
c180: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
c190: 50 61 72 73 65 72 20 73 74 61 74 69 73 74 69 63  Parser statistic
c1a0: 73 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73 2c  s: %d terminals,
c1b0: 20 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73   %d nonterminals
c1c0: 2c 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a 20  , %d rules\n",. 
c1d0: 20 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e       lem.ntermin
c1e0: 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20  al, lem.nsymbol 
c1f0: 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c  - lem.nterminal,
c200: 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20   lem.nrule);.   
c210: 20 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 20   printf("       
c220: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 73              %d s
c230: 74 61 74 65 73 2c 20 25 64 20 70 61 72 73 65 72  tates, %d parser
c240: 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c 20   table entries, 
c250: 25 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22 2c  %d conflicts\n",
c260: 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74  .      lem.nstat
c270: 65 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65  e, lem.tablesize
c280: 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  , lem.nconflict)
c290: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e  ;.  }.  if( lem.
c2a0: 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30 20 29 7b  nconflict > 0 ){
c2b0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
c2c0: 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20  err,"%d parsing 
c2d0: 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65  conflicts.\n",le
c2e0: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20  m.nconflict);.  
c2f0: 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72 6e 20 30  }..  /* return 0
c300: 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 31 20 6f   on success, 1 o
c310: 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f 0a 20 20  n failure. */.  
c320: 65 78 69 74 63 6f 64 65 20 3d 20 28 28 6c 65 6d  exitcode = ((lem
c330: 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30 29 20 7c  .errorcnt > 0) |
c340: 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74  | (lem.nconflict
c350: 20 3e 20 30 29 29 20 3f 20 31 20 3a 20 30 3b 0a   > 0)) ? 1 : 0;.
c360: 20 20 73 75 63 63 65 73 73 66 75 6c 5f 65 78 69    successful_exi
c370: 74 20 3d 20 28 65 78 69 74 63 6f 64 65 20 3d 3d  t = (exitcode ==
c380: 20 30 29 3b 0a 20 20 65 78 69 74 28 65 78 69 74   0);.  exit(exit
c390: 63 6f 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  code);.  return 
c3a0: 28 65 78 69 74 63 6f 64 65 29 3b 0a 7d 0a 2f 2a  (exitcode);.}./*
c3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3c0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
c3d0: 65 20 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a  e "msort.c" ****
c3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
c400: 2a 2a 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72  ** A generic mer
c410: 67 65 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e  ge-sort program.
c420: 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a  .**.** USAGE:.**
c430: 20 4c 65 74 20 22 70 74 72 22 20 62 65 20 61 20   Let "ptr" be a 
c440: 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20  pointer to some 
c450: 73 74 72 75 63 74 75 72 65 20 77 68 69 63 68 20  structure which 
c460: 69 73 20 61 74 20 74 68 65 20 68 65 61 64 20 6f  is at the head o
c470: 66 0a 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d  f.** a null-term
c480: 69 6e 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68  inated list.  Th
c490: 65 6e 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c  en to sort the l
c4a0: 69 73 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  ist call:.**.** 
c4b0: 20 20 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28      ptr = msort(
c4c0: 70 74 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29  ptr,&(ptr->next)
c4d0: 2c 63 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20  ,cmpfnc);.**.** 
c4e0: 49 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63  In the above, "c
c4f0: 6d 70 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e  mpfnc" is a poin
c500: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
c510: 6e 20 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73  n which compares
c520: 0a 2a 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65  .** two instance
c530: 73 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  s of the structu
c540: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  re and returns a
c550: 6e 20 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e  n integer, as in
c560: 0a 2a 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65  .** strcmp.  The
c570: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
c580: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c590: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20   the pointer to 
c5a0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c  the.** second el
c5b0: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e  ement of the lin
c5c0: 6b 65 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20  ked list.  This 
c5d0: 61 64 64 72 65 73 73 20 69 73 20 75 73 65 64 20  address is used 
c5e0: 74 6f 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68  to compute.** th
c5f0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
c600: 22 6e 65 78 74 22 20 66 69 65 6c 64 20 77 69 74  "next" field wit
c610: 68 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  hin the structur
c620: 65 2e 20 20 54 68 65 20 6f 66 66 73 65 74 20 74  e.  The offset t
c630: 6f 0a 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20  o.** the "next" 
c640: 66 69 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f  field must be co
c650: 6e 73 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73  nstant for all s
c660: 74 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65  tructures in the
c670: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   list..**.** The
c680: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
c690: 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  s a new pointer 
c6a0: 77 68 69 63 68 20 69 73 20 74 68 65 20 68 65 61  which is the hea
c6b0: 64 20 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a  d of the list.**
c6c0: 20 61 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a   after sorting..
c6d0: 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a  **.** ALGORITHM:
c6e0: 0a 2a 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a  .** Merge-sort..
c6f0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
c700: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
c710: 65 20 6e 65 78 74 20 73 74 72 75 63 74 75 72 65  e next structure
c720: 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
c730: 69 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ist..*/.#define 
c740: 4e 45 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a  NEXT(A) (*(char*
c750: 2a 29 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  *)(((unsigned lo
c760: 6e 67 29 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a  ng)A)+offset))..
c770: 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a  /*.** Inputs:.**
c780: 20 20 20 61 3a 20 20 20 20 20 20 20 41 20 73 6f     a:       A so
c790: 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69  rted, null-termi
c7a0: 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73  nated linked lis
c7b0: 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c  t.  (May be null
c7c0: 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20 20  )..**   b:      
c7d0: 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d   A sorted, null-
c7e0: 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65  terminated linke
c7f0: 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65  d list.  (May be
c800: 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70   null)..**   cmp
c810: 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65 72 20  :     A pointer 
c820: 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  to the compariso
c830: 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20  n function..**  
c840: 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73 65 74   offset:  Offset
c850: 20 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72   in the structur
c860: 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20  e to the "next" 
c870: 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  field..**.** Ret
c880: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
c890: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
c8a0: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
c8b0: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
c8c0: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
c8d0: 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20 61 6e  *   of both a an
c8e0: 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20  d b..**.** Side 
c8f0: 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68  effects:.**   Th
c900: 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72  e "next" pointer
c910: 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69  s for elements i
c920: 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20 61 6e  n the lists a an
c930: 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63 68 61  d b are.**   cha
c940: 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nged..*/.static 
c950: 63 68 61 72 20 2a 6d 65 72 67 65 28 0a 20 20 63  char *merge(.  c
c960: 68 61 72 20 2a 61 2c 0a 20 20 63 68 61 72 20 2a  har *a,.  char *
c970: 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29 28  b,.  int (*cmp)(
c980: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
c990: 74 20 63 68 61 72 2a 29 2c 0a 20 20 69 6e 74 20  t char*),.  int 
c9a0: 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63 68 61 72  offset.){.  char
c9b0: 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20   *ptr, *head;.. 
c9c0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
c9d0: 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c   head = b;.  }el
c9e0: 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20  se if( b==0 ){. 
c9f0: 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d     head = a;.  }
ca00: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 28 2a  else{.    if( (*
ca10: 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20 29 7b 0a  cmp)(a,b)<=0 ){.
ca20: 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20        ptr = a;. 
ca30: 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29       a = NEXT(a)
ca40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ca50: 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20     ptr = b;.    
ca60: 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20    b = NEXT(b);. 
ca70: 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20 3d 20     }.    head = 
ca80: 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ptr;.    while( 
ca90: 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20 20 20  a && b ){.      
caa0: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
cab0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 45  =0 ){.        NE
cac0: 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20  XT(ptr) = a;.   
cad0: 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20       ptr = a;.  
cae0: 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61        a = NEXT(a
caf0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
cb00: 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72          NEXT(ptr
cb10: 29 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 70  ) = b;.        p
cb20: 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20  tr = b;.        
cb30: 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20  b = NEXT(b);.   
cb40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
cb50: 66 28 20 61 20 29 20 4e 45 58 54 28 70 74 72 29  f( a ) NEXT(ptr)
cb60: 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65 20 20   = a;.    else  
cb70: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b    NEXT(ptr) = b;
cb80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 65  .  }.  return he
cb90: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  ad;.}../*.** Inp
cba0: 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a 20  uts:.**   list: 
cbb0: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
cbc0: 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20  a singly-linked 
cbd0: 6c 69 73 74 20 6f 66 20 73 74 72 75 63 74 75 72  list of structur
cbe0: 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a 20 20  es..**   next:  
cbf0: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 70      Pointer to p
cc00: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 65  ointer to the se
cc10: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
cc20: 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20 20 63  the list..**   c
cc30: 6d 70 3a 20 20 20 20 20 20 20 41 20 63 6f 6d 70  mp:       A comp
cc40: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
cc50: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61  .**.** Return Va
cc60: 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e  lue:.**   A poin
cc70: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
cc80: 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74  of a sorted list
cc90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
cca0: 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 72  elements.**   or
ccb0: 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73 74 2e  ginally in list.
ccc0: 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65  .**.** Side effe
ccd0: 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e  cts:.**   The "n
cce0: 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f  ext" pointers fo
ccf0: 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69  r elements in li
cd00: 73 74 20 61 72 65 20 63 68 61 6e 67 65 64 2e 0a  st are changed..
cd10: 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53 54 53  */.#define LISTS
cd20: 49 5a 45 20 33 30 0a 73 74 61 74 69 63 20 63 68  IZE 30.static ch
cd30: 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20 63 68 61  ar *msort(.  cha
cd40: 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68 61 72 20  r *list,.  char 
cd50: 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74 20 28 2a  **next,.  int (*
cd60: 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  cmp)(const char*
cd70: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
cd80: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
cd90: 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20   offset;.  char 
cda0: 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74  *ep;.  char *set
cdb0: 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LISTSIZE];.  in
cdc0: 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20  t i;.  offset = 
cdd0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6e  (unsigned long)n
cde0: 65 78 74 20 2d 20 28 75 6e 73 69 67 6e 65 64 20  ext - (unsigned 
cdf0: 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20 20 66 6f 72  long)list;.  for
ce00: 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45  (i=0; i<LISTSIZE
ce10: 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d 20  ; i++) set[i] = 
ce20: 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69 73 74  0;.  while( list
ce30: 20 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69 73   ){.    ep = lis
ce40: 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e 45  t;.    list = NE
ce50: 58 54 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e 45  XT(list);.    NE
ce60: 58 54 28 65 70 29 20 3d 20 30 3b 0a 20 20 20 20  XT(ep) = 0;.    
ce70: 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53  for(i=0; i<LISTS
ce80: 49 5a 45 2d 31 20 26 26 20 73 65 74 5b 69 5d 21  IZE-1 && set[i]!
ce90: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
cea0: 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65  ep = merge(ep,se
ceb0: 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29  t[i],cmp,offset)
cec0: 3b 0a 20 20 20 20 20 20 73 65 74 5b 69 5d 20 3d  ;.      set[i] =
ced0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65   0;.    }.    se
cee0: 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a 20  t[i] = ep;.  }. 
cef0: 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69   ep = 0;.  for(i
cf00: 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20  =0; i<LISTSIZE; 
cf10: 69 2b 2b 29 20 69 66 28 20 73 65 74 5b 69 5d 20  i++) if( set[i] 
cf20: 29 20 65 70 20 3d 20 6d 65 72 67 65 28 73 65 74  ) ep = merge(set
cf30: 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66 66 73 65  [i],ep,cmp,offse
cf40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 70 3b  t);.  return ep;
cf50: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
cf60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
cf70: 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69  m the file "opti
cf80: 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on.c" **********
cf90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cfa0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a  /.static char **
cfb0: 61 72 67 76 3b 0a 73 74 61 74 69 63 20 73 74 72  argv;.static str
cfc0: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f  uct s_options *o
cfd0: 70 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  p;.static FILE *
cfe0: 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65 66  errstream;..#def
cff0: 69 6e 65 20 49 53 4f 50 54 28 58 29 20 28 28 58  ine ISOPT(X) ((X
d000: 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30  )[0]=='-'||(X)[0
d010: 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28 28  ]=='+'||strchr((
d020: 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a  X),'=')!=0)../*.
d030: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6d  ** Print the com
d040: 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74 68 20 61  mand line with a
d050: 20 63 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e 67   carrot pointing
d060: 20 74 6f 20 74 68 65 20 6b 2d 74 68 20 63 68 61   to the k-th cha
d070: 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65  racter.** of the
d080: 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a   n-th field..*/.
d090: 73 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c  static void errl
d0a0: 69 6e 65 28 69 6e 74 20 6e 2c 20 69 6e 74 20 6b  ine(int n, int k
d0b0: 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20  , FILE *err).{. 
d0c0: 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a 20   int spcnt, i;. 
d0d0: 20 69 66 28 20 61 72 67 76 5b 30 5d 20 29 20 66   if( argv[0] ) f
d0e0: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 22 2c  printf(err,"%s",
d0f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63 6e  argv[0]);.  spcn
d100: 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  t = lemonStrlen(
d110: 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20  argv[0]) + 1;.  
d120: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20  for(i=1; i<n && 
d130: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
d140: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
d150: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
d160: 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c 65 6d 6f     spcnt += lemo
d170: 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d 29  nStrlen(argv[i])
d180: 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63 6e 74 20  +1;.  }.  spcnt 
d190: 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20 61 72  += k;.  for(; ar
d1a0: 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69  gv[i]; i++) fpri
d1b0: 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72  ntf(err," %s",ar
d1c0: 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20 73 70  gv[i]);.  if( sp
d1d0: 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20 66 70  cnt<20 ){.    fp
d1e0: 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73  rintf(err,"\n%*s
d1f0: 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70 63 6e  ^-- here\n",spcn
d200: 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t,"");.  }else{.
d210: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
d220: 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e  "\n%*shere --^\n
d230: 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b 0a 20  ",spcnt-7,"");. 
d240: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
d250: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
d260: 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69  the N-th non-swi
d270: 74 63 68 20 61 72 67 75 6d 65 6e 74 2e 20 20 52  tch argument.  R
d280: 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e  eturn -1.** if N
d290: 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
d2a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d2b0: 61 72 67 69 6e 64 65 78 28 69 6e 74 20 6e 29 0a  argindex(int n).
d2c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
d2d0: 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20   dashdash = 0;. 
d2e0: 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20   if( argv!=0 && 
d2f0: 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20  *argv!=0 ){.    
d300: 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d  for(i=1; argv[i]
d310: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d320: 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49  ( dashdash || !I
d330: 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b  SOPT(argv[i]) ){
d340: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  .        if( n==
d350: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
d360: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
d370: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72   }.      if( str
d380: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22  cmp(argv[i],"--"
d390: 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68 20  )==0 ) dashdash 
d3a0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
d3b0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73   return -1;.}..s
d3c0: 74 61 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b  tatic char emsg[
d3d0: 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e  ] = "Command lin
d3e0: 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20  e syntax error: 
d3f0: 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  ";../*.** Proces
d400: 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64  s a flag command
d410: 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a   line argument..
d420: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
d430: 6e 64 6c 65 66 6c 61 67 73 28 69 6e 74 20 69 2c  ndleflags(int i,
d440: 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b 0a 20 20   FILE *err).{.  
d450: 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65 72 72  int v;.  int err
d460: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  cnt = 0;.  int j
d470: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b  ;.  for(j=0; op[
d480: 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a  j].label; j++){.
d490: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
d4a0: 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a  &argv[i][1],op[j
d4b0: 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e 53 74 72  ].label,lemonStr
d4c0: 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29  len(op[j].label)
d4d0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
d4e0: 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b  }.  v = argv[i][
d4f0: 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b  0]=='-' ? 1 : 0;
d500: 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62  .  if( op[j].lab
d510: 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  el==0 ){.    if(
d520: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70   err ){.      fp
d530: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64  rintf(err,"%sund
d540: 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e  efined option.\n
d550: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65  ",emsg);.      e
d560: 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b  rrline(i,1,err);
d570: 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e  .    }.    errcn
d580: 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  t++;.  }else if(
d590: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
d5a0: 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28  _FLAG ){.    *((
d5b0: 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20  int*)op[j].arg) 
d5c0: 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = v;.  }else if(
d5d0: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
d5e0: 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a  _FFLAG ){.    (*
d5f0: 28 76 6f 69 64 28 2a 29 28 69 6e 74 29 29 28 6f  (void(*)(int))(o
d600: 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20  p[j].arg))(v);. 
d610: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d   }else if( op[j]
d620: 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20  .type==OPT_FSTR 
d630: 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a  ){.    (*(void(*
d640: 29 28 63 68 61 72 20 2a 29 29 28 6f 70 5b 6a 5d  )(char *))(op[j]
d650: 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b  .arg))(&argv[i][
d660: 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2]);.  }else{.  
d670: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
d680: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
d690: 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  %smissing argume
d6a0: 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22  nt on switch.\n"
d6b0: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
d6c0: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
d6d0: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
d6e0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
d6f0: 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   errcnt;.}../*.*
d700: 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d  * Process a comm
d710: 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20  and line switch 
d720: 77 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67  which has an arg
d730: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
d740: 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63   int handleswitc
d750: 68 28 69 6e 74 20 69 2c 20 46 49 4c 45 20 2a 65  h(int i, FILE *e
d760: 72 72 29 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d  rr).{.  int lv =
d770: 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20   0;.  double dv 
d780: 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73  = 0.0;.  char *s
d790: 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63  v = 0, *end;.  c
d7a0: 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a  har *cp;.  int j
d7b0: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
d7c0: 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68   0;.  cp = strch
d7d0: 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a  r(argv[i],'=');.
d7e0: 20 20 61 73 73 65 72 74 28 20 63 70 21 3d 30 20    assert( cp!=0 
d7f0: 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  );.  *cp = 0;.  
d800: 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c  for(j=0; op[j].l
d810: 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  abel; j++){.    
d820: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
d830: 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d  i],op[j].label)=
d840: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
d850: 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69    *cp = '=';.  i
d860: 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d  f( op[j].label==
d870: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  0 ){.    if( err
d880: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
d890: 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e  f(err,"%sundefin
d8a0: 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d  ed option.\n",em
d8b0: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
d8c0: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
d8d0: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
d8e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70  .  }else{.    cp
d8f0: 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ++;.    switch( 
d900: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
d910: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
d920: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
d930: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
d940: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
d950: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
d960: 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75  r,"%soption requ
d970: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
d980: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d990: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
d9a0: 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  0,err);.        
d9b0: 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  }.        errcnt
d9c0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
d9d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d9e0: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
d9f0: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
da00: 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28      dv = strtod(
da10: 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20  cp,&end);.      
da20: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
da30: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
da40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
da50: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c  printf(err,"%sil
da60: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
da70: 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  in floating-poin
da80: 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  t argument.\n",e
da90: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
daa0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e    errline(i,((un
dab0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29  signed long)end)
dac0: 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  -(unsigned long)
dad0: 61 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20  argv[i],err);.  
dae0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
daf0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
db00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
db10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
db20: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
db30: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
db40: 20 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74 72          lv = str
db50: 74 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a  tol(cp,&end,0);.
db60: 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64          if( *end
db70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
db80: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20  ( err ){.       
db90: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
dba0: 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72  ,"%sillegal char
dbb0: 61 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65 72  acter in integer
dbc0: 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d   argument.\n",em
dbd0: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
dbe0: 20 65 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73   errline(i,((uns
dbf0: 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d  igned long)end)-
dc00: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61  (unsigned long)a
dc10: 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20  rgv[i],err);.   
dc20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dc30: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
dc40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
dc50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
dc60: 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20   OPT_STR:.      
dc70: 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20  case OPT_FSTR:. 
dc80: 20 20 20 20 20 20 20 73 76 20 3d 20 63 70 3b 0a         sv = cp;.
dc90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dca0: 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
dcb0: 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20   op[j].type ){. 
dcc0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c       case OPT_FL
dcd0: 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  AG:.      case O
dce0: 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20  PT_FFLAG:.      
dcf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
dd00: 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20  ase OPT_DBL:.   
dd10: 20 20 20 20 20 2a 28 64 6f 75 62 6c 65 2a 29 28       *(double*)(
dd20: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 64 76 3b  op[j].arg) = dv;
dd30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dd40: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
dd50: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 28 2a 28  DBL:.        (*(
dd60: 76 6f 69 64 28 2a 29 28 64 6f 75 62 6c 65 29 29  void(*)(double))
dd70: 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64 76 29  (op[j].arg))(dv)
dd80: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
dd90: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
dda0: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a 28 69  INT:.        *(i
ddb0: 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  nt*)(op[j].arg) 
ddc0: 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = lv;.        br
ddd0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
dde0: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
ddf0: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 69 6e 74    (*(void(*)(int
de00: 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28  ))(op[j].arg))((
de10: 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20 20 20  int)lv);.       
de20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
de30: 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20  se OPT_STR:.    
de40: 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70      *(char**)(op
de50: 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20  [j].arg) = sv;. 
de60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
de70: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54      case OPT_FST
de80: 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f  R:.        (*(vo
de90: 69 64 28 2a 29 28 63 68 61 72 20 2a 29 29 28 6f  id(*)(char *))(o
dea0: 70 5b 6a 5d 2e 61 72 67 29 29 28 73 76 29 3b 0a  p[j].arg))(sv);.
deb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dec0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
ded0: 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74  n errcnt;.}..int
dee0: 20 4f 70 74 49 6e 69 74 28 63 68 61 72 20 2a 2a   OptInit(char **
def0: 61 2c 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69  a, struct s_opti
df00: 6f 6e 73 20 2a 6f 2c 20 46 49 4c 45 20 2a 65 72  ons *o, FILE *er
df10: 72 29 0a 7b 0a 20 20 69 6e 74 20 65 72 72 63 6e  r).{.  int errcn
df20: 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20 3d 20  t = 0;.  argv = 
df30: 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20 20 65  a;.  op = o;.  e
df40: 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72 3b 0a  rrstream = err;.
df50: 20 20 69 66 28 20 61 72 67 76 20 26 26 20 2a 61    if( argv && *a
df60: 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20 20 20  rgv && op ){.   
df70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
df80: 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  i=1; argv[i]; i+
df90: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72  +){.      if( ar
dfa0: 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c 7c  gv[i][0]=='+' ||
dfb0: 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27   argv[i][0]=='-'
dfc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63   ){.        errc
dfd0: 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c 61 67  nt += handleflag
dfe0: 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  s(i,err);.      
dff0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 68 72  }else if( strchr
e000: 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20 29 7b  (argv[i],'=') ){
e010: 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 20  .        errcnt 
e020: 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28  += handleswitch(
e030: 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a  i,err);.      }.
e040: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
e050: 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20  errcnt>0 ){.    
e060: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56 61 6c  fprintf(err,"Val
e070: 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  id command line 
e080: 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22 25 73  options for \"%s
e090: 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29 3b 0a  \" are:\n",*a);.
e0a0: 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29 3b 0a      OptPrint();.
e0b0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
e0c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
e0d0: 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 29 7b 0a  int OptNArgs(){.
e0e0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
e0f0: 20 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20   int dashdash = 
e100: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  0;.  int i;.  if
e110: 28 20 61 72 67 76 21 3d 30 20 26 26 20 61 72 67  ( argv!=0 && arg
e120: 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66  v[0]!=0 ){.    f
e130: 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b  or(i=1; argv[i];
e140: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e150: 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53   dashdash || !IS
e160: 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63  OPT(argv[i]) ) c
e170: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
e180: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
e190: 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61  --")==0 ) dashda
e1a0: 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  sh = 1;.    }.  
e1b0: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a  }.  return cnt;.
e1c0: 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28  }..char *OptArg(
e1d0: 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20 69  int n).{.  int i
e1e0: 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78  ;.  i = argindex
e1f0: 28 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3e  (n);.  return i>
e200: 3d 30 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 30  =0 ? argv[i] : 0
e210: 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 45 72 72  ;.}..void OptErr
e220: 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e 74 20  (int n).{.  int 
e230: 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65  i;.  i = arginde
e240: 78 28 6e 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30  x(n);.  if( i>=0
e250: 20 29 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65   ) errline(i,0,e
e260: 72 72 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f  rrstream);.}..vo
e270: 69 64 20 4f 70 74 50 72 69 6e 74 28 29 7b 0a 20  id OptPrint(){. 
e280: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61   int i;.  int ma
e290: 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78 20 3d 20  x, len;.  max = 
e2a0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70  0;.  for(i=0; op
e2b0: 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b  [i].label; i++){
e2c0: 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e  .    len = lemon
e2d0: 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62  Strlen(op[i].lab
e2e0: 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73 77 69  el) + 1;.    swi
e2f0: 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20  tch( op[i].type 
e300: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
e310: 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
e320: 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
e330: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e340: 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a     case OPT_INT:
e350: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e360: 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 65  FINT:.        le
e370: 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20 20 2f 2a  n += 9;       /*
e380: 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69 6e 74   length of "<int
e390: 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20 20 20  eger>" */.      
e3a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
e3b0: 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20  ase OPT_DBL:.   
e3c0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c     case OPT_FDBL
e3d0: 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d  :.        len +=
e3e0: 20 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e   6;       /* len
e3f0: 67 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e 22 20  gth of "<real>" 
e400: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
e410: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
e420: 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65  _STR:.      case
e430: 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20   OPT_FSTR:.     
e440: 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20 20 20     len += 8;    
e450: 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
e460: 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a 20 20  "<string>" */.  
e470: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e480: 20 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d   }.    if( len>m
e490: 61 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e 3b 0a  ax ) max = len;.
e4a0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f    }.  for(i=0; o
e4b0: 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29  p[i].label; i++)
e4c0: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  {.    switch( op
e4d0: 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20  [i].type ){.    
e4e0: 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a    case OPT_FLAG:
e4f0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e500: 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 66  FFLAG:.        f
e510: 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
e520: 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c 6e 22  ,"  -%-*s  %s\n"
e530: 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c  ,max,op[i].label
e540: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
e550: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e560: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49        case OPT_I
e570: 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  NT:.      case O
e580: 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20  PT_FINT:.       
e590: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
e5a0: 61 6d 2c 22 20 20 25 73 3d 3c 69 6e 74 65 67 65  am,"  %s=<intege
e5b0: 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b  r>%*s  %s\n",op[
e5c0: 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20  i].label,.      
e5d0: 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65      (int)(max-le
e5e0: 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  monStrlen(op[i].
e5f0: 6c 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b  label)-9),"",op[
e600: 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
e610: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e620: 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a    case OPT_DBL:.
e630: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e640: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 66 70 72  DBL:.        fpr
e650: 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22  intf(errstream,"
e660: 20 20 25 73 3d 3c 72 65 61 6c 3e 25 2a 73 20 20    %s=<real>%*s  
e670: 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65  %s\n",op[i].labe
e680: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  l,.          (in
e690: 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c  t)(max-lemonStrl
e6a0: 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d  en(op[i].label)-
e6b0: 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73  6),"",op[i].mess
e6c0: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
e6d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
e6e0: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63  OPT_STR:.      c
e6f0: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
e700: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
e710: 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 73  rstream,"  %s=<s
e720: 74 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c 6e 22  tring>%*s  %s\n"
e730: 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20  ,op[i].label,.  
e740: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61          (int)(ma
e750: 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  x-lemonStrlen(op
e760: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c 22 22  [i].label)-8),""
e770: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
e780: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e790: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a      }.  }.}./***
e7a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7b0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
e7c0: 6c 65 20 22 70 61 72 73 65 2e 63 22 20 2a 2a 2a  le "parse.c" ***
e7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
e7f0: 20 49 6e 70 75 74 20 66 69 6c 65 20 70 61 72 73   Input file pars
e800: 65 72 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  er for the LEMON
e810: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
e820: 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20 73 74  r..*/../* The st
e830: 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ate of the parse
e840: 72 20 2a 2f 0a 65 6e 75 6d 20 65 5f 73 74 61 74  r */.enum e_stat
e850: 65 20 7b 0a 20 20 49 4e 49 54 49 41 4c 49 5a 45  e {.  INITIALIZE
e860: 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
e870: 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20  DECL_OR_RULE,.  
e880: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
e890: 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 57 41 49 54  _KEYWORD,.  WAIT
e8a0: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
e8b0: 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ,.  WAITING_FOR_
e8c0: 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
e8d0: 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  L,.  WAITING_FOR
e8e0: 5f 41 52 52 4f 57 2c 0a 20 20 49 4e 5f 52 48 53  _ARROW,.  IN_RHS
e8f0: 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c  ,.  LHS_ALIAS_1,
e900: 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a  .  LHS_ALIAS_2,.
e910: 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c 0a 20    LHS_ALIAS_3,. 
e920: 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20   RHS_ALIAS_1,.  
e930: 52 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 50  RHS_ALIAS_2,.  P
e940: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
e950: 2c 0a 20 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  ,.  PRECEDENCE_M
e960: 41 52 4b 5f 32 2c 0a 20 20 52 45 53 59 4e 43 5f  ARK_2,.  RESYNC_
e970: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
e980: 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ,.  RESYNC_AFTER
e990: 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 57  _DECL_ERROR,.  W
e9a0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
e9b0: 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20  UCTOR_SYMBOL,.  
e9c0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
e9d0: 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 57  TYPE_SYMBOL,.  W
e9e0: 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42  AITING_FOR_FALLB
e9f0: 41 43 4b 5f 49 44 2c 0a 20 20 57 41 49 54 49 4e  ACK_ID,.  WAITIN
ea00: 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49  G_FOR_WILDCARD_I
ea10: 44 0a 7d 3b 0a 73 74 72 75 63 74 20 70 73 74 61  D.};.struct psta
ea20: 74 65 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c  te {.  char *fil
ea30: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20  ename;       /* 
ea40: 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
ea50: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  t file */.  int 
ea60: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20  tokenlineno;    
ea70: 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20    /* Linenumber 
ea80: 61 74 20 77 68 69 63 68 20 63 75 72 72 65 6e 74  at which current
ea90: 20 74 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f   token starts */
eaa0: 0a 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b  .  int errorcnt;
eab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
eac0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20  er of errors so 
ead0: 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  far */.  char *t
eae0: 6f 6b 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f  okenstart;     /
eaf0: 2a 20 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e  * Text of curren
eb00: 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72  t token */.  str
eb10: 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20  uct lemon *gp;  
eb20: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61     /* Global sta
eb30: 74 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65  te vector */.  e
eb40: 6e 75 6d 20 65 5f 73 74 61 74 65 20 73 74 61 74  num e_state stat
eb50: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
eb60: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
eb70: 72 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  rser */.  struct
eb80: 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63   symbol *fallbac
eb90: 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c  k;   /* The fall
eba0: 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  back token */.  
ebb0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c  struct symbol *l
ebc0: 68 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65  hs;        /* Le
ebd0: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
ebe0: 63 75 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a  current rule */.
ebf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 68    const char *lh
ec00: 73 61 6c 69 61 73 3b 20 20 20 20 20 20 2f 2a 20  salias;      /* 
ec10: 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48  Alias for the LH
ec20: 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b  S */.  int nrhs;
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
ec50: 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 73  ight-hand side s
ec60: 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20  ymbols seen */. 
ec70: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
ec80: 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a  rhs[MAXRHS];  /*
ec90: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a   RHS symbols */.
eca0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 6c    const char *al
ecb0: 69 61 73 5b 4d 41 58 52 48 53 5d 3b 20 2f 2a 20  ias[MAXRHS]; /* 
ecc0: 41 6c 69 61 73 65 73 20 66 6f 72 20 65 61 63 68  Aliases for each
ecd0: 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20   RHS symbol (or 
ece0: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63  NULL) */.  struc
ecf0: 74 20 72 75 6c 65 20 2a 70 72 65 76 72 75 6c 65  t rule *prevrule
ed00: 3b 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  ;     /* Previou
ed10: 73 20 72 75 6c 65 20 70 61 72 73 65 64 20 2a 2f  s rule parsed */
ed20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
ed30: 65 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20 2f 2a  eclkeyword;   /*
ed40: 20 4b 65 79 77 6f 72 64 20 6f 66 20 61 20 64 65   Keyword of a de
ed50: 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63  claration */.  c
ed60: 68 61 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f  har **declargslo
ed70: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t;        /* Whe
ed80: 72 65 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  re the declarati
ed90: 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  on argument shou
eda0: 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a 20 20 69  ld be put */.  i
edb0: 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  nt insertLineMac
edc0: 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ro;       /* Add
edd0: 20 23 6c 69 6e 65 20 62 65 66 6f 72 65 20 64 65   #line before de
ede0: 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  claration insert
edf0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c 6c   */.  int *decll
ee00: 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20 20 20  inenoslot;      
ee10: 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
ee20: 74 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c  te declaration l
ee30: 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
ee40: 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64 65 63  enum e_assoc dec
ee50: 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73  lassoc;    /* As
ee60: 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f 63 69  sign this associ
ee70: 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72  ation to decl ar
ee80: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  guments */.  int
ee90: 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20 20 20   preccounter;   
eea0: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 69 67          /* Assig
eeb0: 6e 20 74 68 69 73 20 70 72 65 63 65 64 65 6e 63  n this precedenc
eec0: 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65  e to decl argume
eed0: 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nts */.  struct 
eee0: 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c 65 3b  rule *firstrule;
eef0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
ef00: 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69 6e 20  o first rule in 
ef10: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
ef20: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6c 61   struct rule *la
ef30: 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50  strule;     /* P
ef40: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 6f  ointer to the mo
ef50: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
ef60: 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f  ed rule */.};../
ef70: 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c 65  * Parse a single
ef80: 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63   token */.static
ef90: 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65 74 6f   void parseoneto
efa0: 6b 65 6e 28 73 74 72 75 63 74 20 70 73 74 61 74  ken(struct pstat
efb0: 65 20 2a 70 73 70 29 0a 7b 0a 20 20 63 6f 6e 73  e *psp).{.  cons
efc0: 74 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d  t char *x;.  x =
efd0: 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74 6f   Strsafe(psp->to
efe0: 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20 2f  kenstart);     /
eff0: 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65 6e  * Save the token
f000: 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a   permanently */.
f010: 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22  #if 0.  printf("
f020: 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73  %s:%d: Token=[%s
f030: 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73  ] state=%d\n",ps
f040: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f050: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f060: 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b    x,psp->state);
f070: 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68  .#endif.  switch
f080: 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a  ( psp->state ){.
f090: 20 20 20 20 63 61 73 65 20 49 4e 49 54 49 41 4c      case INITIAL
f0a0: 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e  IZE:.      psp->
f0b0: 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20  prevrule = 0;.  
f0c0: 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75      psp->preccou
f0d0: 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  nter = 0;.      
f0e0: 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d  psp->firstrule =
f0f0: 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
f100: 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 67   0;.      psp->g
f110: 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20  p->nrule = 0;.  
f120: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
f130: 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a 2f   to next case */
f140: 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
f150: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
f160: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  LE:.      if( x[
f170: 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20  0]=='%' ){.     
f180: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f190: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
f1a0: 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20  _KEYWORD;.      
f1b0: 7d 65 6c 73 65 20 69 66 28 20 69 73 6c 6f 77 65  }else if( islowe
f1c0: 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  r(x[0]) ){.     
f1d0: 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79     psp->lhs = Sy
f1e0: 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
f1f0: 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d       psp->nrhs =
f200: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
f210: 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20  >lhsalias = 0;. 
f220: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f230: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
f240: 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c  ARROW;.      }el
f250: 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27  se if( x[0]=='{'
f260: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
f270: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30  psp->prevrule==0
f280: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
f290: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
f2a0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f2b0: 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73  ineno,."There is
f2c0: 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 6f   no prior rule o
f2d0: 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74 74  pon which to att
f2e0: 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a 66  ach the code \.f
f2f0: 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62 65  ragment which be
f300: 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e  gins on this lin
f310: 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e.");.          
f320: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
f330: 0a 09 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d  ..}else if( psp-
f340: 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 21  >prevrule->code!
f350: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f360: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f370: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f380: 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20 66  nlineno,."Code f
f390: 72 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e 69 6e  ragment beginnin
f3a0: 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  g on this line i
f3b0: 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20  s not the first 
f3c0: 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20  \.to follow the 
f3d0: 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29  previous rule.")
f3e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
f3f0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f400: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f410: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
f420: 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73 70 2d  ule->line = psp-
f430: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20  >tokenlineno;.  
f440: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
f450: 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20 26 78  vrule->code = &x
f460: 5b 31 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65  [1];..}.      }e
f470: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b  lse if( x[0]=='[
f480: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
f490: 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45 44  ->state = PRECED
f4a0: 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20  ENCE_MARK_1;.   
f4b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f4c0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f4d0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f4e0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
f4f0: 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73       "Token \"%s
f500: 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69 74  \" should be eit
f510: 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61 20  her \"%%\" or a 
f520: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65  nonterminal name
f530: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 29  .",.          x)
f540: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f550: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f560: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f570: 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45      case PRECEDE
f580: 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20  NCE_MARK_1:.    
f590: 20 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78    if( !isupper(x
f5a0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
f5b0: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f5c0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f5d0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
f5e0: 20 20 20 22 54 68 65 20 70 72 65 63 65 64 65 6e     "The preceden
f5f0: 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62  ce symbol must b
f600: 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b  e a terminal.");
f610: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
f620: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f630: 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70  }else if( psp->p
f640: 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20  revrule==0 ){.  
f650: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f660: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f670: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f680: 20 20 20 20 20 20 20 20 20 22 54 68 65 72 65 20           "There 
f690: 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65  is no prior rule
f6a0: 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63 65   to assign prece
f6b0: 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22  dence \"[%s]\"."
f6c0: 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ,x);.        psp
f6d0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
f6e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73      }else if( ps
f6f0: 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65  p->prevrule->pre
f700: 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  csym!=0 ){.     
f710: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f720: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f730: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65  okenlineno,."Pre
f740: 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20  cedence mark on 
f750: 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
f760: 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20   the first \.to 
f770: 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69  follow the previ
f780: 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20  ous rule.");.   
f790: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f7a0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
f7b0: 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  e{.        psp->
f7c0: 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79  prevrule->precsy
f7d0: 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  m = Symbol_new(x
f7e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f7f0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52   psp->state = PR
f800: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b  ECEDENCE_MARK_2;
f810: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f820: 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43    case PRECEDENC
f830: 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20  E_MARK_2:.      
f840: 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b  if( x[0]!=']' ){
f850: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f860: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f870: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f880: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
f890: 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72  sing \"]\" on pr
f8a0: 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29  ecedence mark.")
f8b0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f8c0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f8d0: 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74   }.      psp->st
f8e0: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
f8f0: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
f900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f910: 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
f920: 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20 69  R_ARROW:.      i
f930: 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20  f( x[0]==':' && 
f940: 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32  x[1]==':' && x[2
f950: 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='=' ){.      
f960: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49    psp->state = I
f970: 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c  N_RHS;.      }el
f980: 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27  se if( x[0]=='('
f990: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
f9a0: 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49  >state = LHS_ALI
f9b0: 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_1;.      }els
f9c0: 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
f9d0: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f9e0: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f9f0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 45  no,.          "E
fa00: 78 70 65 63 74 65 64 20 74 6f 20 73 65 65 20 61  xpected to see a
fa10: 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \":\" following
fa20: 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20   the LHS symbol 
fa30: 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20  \"%s\".",.      
fa40: 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61      psp->lhs->na
fa50: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
fa60: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
fa70: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
fa80: 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
fa90: 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
faa0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
fab0: 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c  .    case LHS_AL
fac0: 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28  IAS_1:.      if(
fad0: 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29   isalpha(x[0]) )
fae0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c  {.        psp->l
faf0: 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20  hsalias = x;.   
fb00: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
fb10: 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20  = LHS_ALIAS_2;. 
fb20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fb30: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
fb40: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
fb50: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
fb60: 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69         "\"%s\" i
fb70: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c  s not a valid al
fb80: 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20  ias for the LHS 
fb90: 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
fba0: 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d       x,psp->lhs-
fbb0: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
fbc0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
fbd0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
fbe0: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
fbf0: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
fc00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
fc10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53  ak;.    case LHS
fc20: 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20  _ALIAS_2:.      
fc30: 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b  if( x[0]==')' ){
fc40: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
fc50: 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f  ate = LHS_ALIAS_
fc60: 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  3;.      }else{.
fc70: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
fc80: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
fc90: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
fca0: 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
fcb0: 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77  ing \")\" follow
fcc0: 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61  ing LHS alias na
fcd0: 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d  me \"%s\".",psp-
fce0: 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
fcf0: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
fd00: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
fd10: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
fd20: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
fd30: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
fd40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
fd50: 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20   LHS_ALIAS_3:.  
fd60: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a      if( x[0]==':
fd70: 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26  ' && x[1]==':' &
fd80: 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20  & x[2]=='=' ){. 
fd90: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
fda0: 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
fdb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
fdc0: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
fdd0: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
fde0: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
fdf0: 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d      "Missing \"-
fe00: 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c  >\" following: \
fe10: 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20  "%s(%s)\".",.   
fe20: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
fe30: 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61  ->name,psp->lhsa
fe40: 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70  lias);.        p
fe50: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
fe60: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
fe70: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
fe80: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
fe90: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
fea0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f 52  k;.    case IN_R
feb0: 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  HS:.      if( x[
fec0: 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]=='.' ){.     
fed0: 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a     struct rule *
fee0: 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20 3d  rp;.        rp =
fef0: 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29   (struct rule *)
ff00: 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  calloc( sizeof(s
ff10: 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a 20  truct rule) + . 
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
ff30: 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
ff40: 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73  *)*psp->nrhs + s
ff50: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73 70  izeof(char*)*psp
ff60: 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20 20  ->nrhs, 1);.    
ff70: 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29 7b      if( rp==0 ){
ff80: 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
ff90: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
ffa0: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
ffb0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
ffc0: 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
ffd0: 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f  enough memory fo
ffe0: 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a  r this rule.");.
fff0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
10000 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
10010 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
10020 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b 0a  le = 0;..}else{.
10030 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b            int i;
10040 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
10050 75 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74  uleline = psp->t
10060 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20  okenlineno;.    
10070 20 20 20 20 20 20 72 70 2d 3e 72 68 73 20 3d 20        rp->rhs = 
10080 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a  (struct symbol**
10090 29 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20  )&rp[1];.       
100a0 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 20     rp->rhsalias 
100b0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29  = (const char**)
100c0 26 28 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e  &(rp->rhs[psp->n
100d0 72 68 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  rhs]);.         
100e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d   for(i=0; i<psp-
100f0 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
10100 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
10110 5b 69 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69  [i] = psp->rhs[i
10120 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ];.            r
10130 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d  p->rhsalias[i] =
10140 20 70 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a   psp->alias[i];.
10150 09 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72  .  }.          r
10160 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68  p->lhs = psp->lh
10170 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  s;.          rp-
10180 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d  >lhsalias = psp-
10190 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20  >lhsalias;.     
101a0 20 20 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20       rp->nrhs = 
101b0 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20  psp->nrhs;.     
101c0 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20       rp->code = 
101d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  0;.          rp-
101e0 3e 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20  >precsym = 0;.  
101f0 20 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65          rp->inde
10200 78 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75  x = psp->gp->nru
10210 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  le++;.          
10220 72 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70  rp->nextlhs = rp
10230 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20  ->lhs->rule;.   
10240 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e         rp->lhs->
10250 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20  rule = rp;.     
10260 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20       rp->next = 
10270 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
10280 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d   psp->firstrule=
10290 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
102a0 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65    psp->firstrule
102b0 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65   = psp->lastrule
102c0 20 3d 20 72 70 3b 0a 09 20 20 7d 65 6c 73 65 7b   = rp;..  }else{
102d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
102e0 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74  ->lastrule->next
102f0 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20   = rp;.         
10300 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65     psp->lastrule
10310 20 3d 20 72 70 3b 0a 09 20 20 7d 0a 20 20 20 20   = rp;..  }.    
10320 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
10330 75 6c 65 20 3d 20 72 70 3b 0a 09 7d 0a 20 20 20  ule = rp;..}.   
10340 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10350 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
10360 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
10370 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c    }else if( isal
10380 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
10390 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72       if( psp->nr
103a0 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20  hs>=MAXRHS ){.  
103b0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
103c0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
103d0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
103e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 54 6f  .            "To
103f0 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 73 20 6f  o many symbols o
10400 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 20 62 65  n RHS of rule be
10410 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c  ginning at \"%s\
10420 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ".",.           
10430 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
10440 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10450 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
10460 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
10470 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
10480 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20  .}else{.        
10490 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e    psp->rhs[psp->
104a0 6e 72 68 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e  nrhs] = Symbol_n
104b0 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ew(x);.         
104c0 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d   psp->alias[psp-
104d0 3e 6e 72 68 73 5d 20 3d 20 30 3b 0a 20 20 20 20  >nrhs] = 0;.    
104e0 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 2b        psp->nrhs+
104f0 2b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73  +;..}.      }els
10500 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7c 27  e if( (x[0]=='|'
10510 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29 20 26   || x[0]=='/') &
10520 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b  & psp->nrhs>0 ){
10530 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
10540 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20 70 73  symbol *msp = ps
10550 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
10560 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  -1];.        if(
10570 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55 4c 54   msp->type!=MULT
10580 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
10590 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
105a0 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d 20 6d  mbol *origsp = m
105b0 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  sp;.          ms
105c0 70 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  p = (struct symb
105d0 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73  ol *) calloc(1,s
105e0 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20  izeof(*msp));.  
105f0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 6d          memset(m
10600 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6d  sp, 0, sizeof(*m
10610 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sp));.          
10620 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c 54  msp->type = MULT
10630 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 20  ITERMINAL;.     
10640 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79       msp->nsubsy
10650 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
10660 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28   msp->subsym = (
10670 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
10680 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f  ) calloc(1,sizeo
10690 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
106a0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  ));.          ms
106b0 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f  p->subsym[0] = o
106c0 72 69 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20  rigsp;.         
106d0 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69   msp->name = ori
106e0 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20  gsp->name;.     
106f0 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73       psp->rhs[ps
10700 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70  p->nrhs-1] = msp
10710 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10720 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d      msp->nsubsym
10730 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  ++;.        msp-
10740 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72 75 63  >subsym = (struc
10750 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72 65 61  t symbol **) rea
10760 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d  lloc(msp->subsym
10770 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65  ,.          size
10780 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
10790 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 29  *)*msp->nsubsym)
107a0 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73  ;.        msp->s
107b0 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62 73  ubsym[msp->nsubs
107c0 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e  ym-1] = Symbol_n
107d0 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20 20  ew(&x[1]);.     
107e0 20 20 20 69 66 28 20 69 73 6c 6f 77 65 72 28 78     if( islower(x
107f0 5b 31 5d 29 20 7c 7c 20 69 73 6c 6f 77 65 72 28  [1]) || islower(
10800 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e  msp->subsym[0]->
10810 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20  name[0]) ){.    
10820 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10830 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10840 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
10850 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 6e             "Cann
10860 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f 75  ot form a compou
10870 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  nd containing a 
10880 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b 0a  non-terminal");.
10890 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
108a0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
108b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
108c0 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26   if( x[0]=='(' &
108d0 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b  & psp->nrhs>0 ){
108e0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
108f0 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f  ate = RHS_ALIAS_
10900 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
10910 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
10920 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
10930 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
10940 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65  .          "Ille
10950 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e  gal character on
10960 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22   RHS of rule: \"
10970 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
10980 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10990 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
109a0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
109b0 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
109c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
109d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
109e0 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20  RHS_ALIAS_1:.   
109f0 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78     if( isalpha(x
10a00 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
10a10 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e  psp->alias[psp->
10a20 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20  nrhs-1] = x;.   
10a30 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10a40 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20  = RHS_ALIAS_2;. 
10a50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10a60 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10a70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10a80 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10a90 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69         "\"%s\" i
10aa0 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c  s not a valid al
10ab0 69 61 73 20 66 6f 72 20 74 68 65 20 52 48 53 20  ias for the RHS 
10ac0 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22  symbol \"%s\"\n"
10ad0 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73  ,.          x,ps
10ae0 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
10af0 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  -1]->name);.    
10b00 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
10b10 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
10b20 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
10b30 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
10b40 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
10b50 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
10b60 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20   RHS_ALIAS_2:.  
10b70 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29      if( x[0]==')
10b80 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
10b90 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53  ->state = IN_RHS
10ba0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10bb0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
10bc0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
10bd0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
10be0 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
10bf0 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69  ng \")\" followi
10c00 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d  ng LHS alias nam
10c10 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e  e \"%s\".",psp->
10c20 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20  lhsalias);.     
10c30 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10c40 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
10c50 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
10c60 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
10c70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10c80 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
10c90 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
10ca0 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20  _KEYWORD:.      
10cb0 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d  if( isalpha(x[0]
10cc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ) ){.        psp
10cd0 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20  ->declkeyword = 
10ce0 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  x;.        psp->
10cf0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b  declargslot = 0;
10d00 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
10d10 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 30  cllinenoslot = 0
10d20 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69  ;.        psp->i
10d30 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
10d40 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   1;.        psp-
10d50 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10d60 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20  _FOR_DECL_ARG;. 
10d70 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
10d80 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29  p(x,"name")==0 )
10d90 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10da0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10db0 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b  (psp->gp->name);
10dc0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10dd0 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
10de0 3d 20 30 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  = 0;..}else if( 
10df0 73 74 72 63 6d 70 28 78 2c 22 69 6e 63 6c 75 64  strcmp(x,"includ
10e00 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
10e10 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10e20 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
10e30 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a 09 7d 65 6c  ->include);..}el
10e40 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
10e50 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "code")==0 ){.  
10e60 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10e70 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
10e80 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29  ->gp->extracode)
10e90 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
10ea0 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 64 65 73  cmp(x,"token_des
10eb0 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
10ec0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10ed0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73  eclargslot = &ps
10ee0 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65 73 74  p->gp->tokendest
10ef0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
10f00 63 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64  cmp(x,"default_d
10f10 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29  estructor")==0 )
10f20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10f30 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10f40 70 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74  psp->gp->vardest
10f50 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
10f60 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 70 72 65  cmp(x,"token_pre
10f70 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  fix")==0 ){.    
10f80 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
10f90 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  rgslot = &psp->g
10fa0 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
10fb0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
10fc0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
10fd0 20 30 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73   0;..}else if( s
10fe0 74 72 63 6d 70 28 78 2c 22 73 79 6e 74 61 78 5f  trcmp(x,"syntax_
10ff0 65 72 72 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20  error")==0 ){.  
11000 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11010 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
11020 2d 3e 67 70 2d 3e 65 72 72 6f 72 29 3b 0a 09 7d  ->gp->error);..}
11030 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11040 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74 22  x,"parse_accept"
11050 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11060 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
11070 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
11080 61 63 63 65 70 74 29 3b 0a 09 7d 65 6c 73 65 20  accept);..}else 
11090 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61  if( strcmp(x,"pa
110a0 72 73 65 5f 66 61 69 6c 75 72 65 22 29 3d 3d 30  rse_failure")==0
110b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
110c0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
110d0 20 26 28 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c   &(psp->gp->fail
110e0 75 72 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28  ure);..}else if(
110f0 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b   strcmp(x,"stack
11100 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29  _overflow")==0 )
11110 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11120 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
11130 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c  (psp->gp->overfl
11140 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ow);.        }el
11150 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
11160 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 22  "extra_argument"
11170 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11180 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
11190 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
111a0 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  arg);.          
111b0 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
111c0 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
111d0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
111e0 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65  mp(x,"token_type
111f0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
11200 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11210 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
11220 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20  >tokentype);.   
11230 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
11240 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
11250 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11260 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66  f( strcmp(x,"def
11270 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20 29  ault_type")==0 )
11280 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11290 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
112a0 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70  (psp->gp->vartyp
112b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
112c0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
112d0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
112e0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
112f0 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29  (x,"stack_size")
11300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11310 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
11320 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73  t = &(psp->gp->s
11330 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20  tacksize);.     
11340 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
11350 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
11360 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
11370 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72 74   strcmp(x,"start
11380 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a  _symbol")==0 ){.
11390 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
113a0 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
113b0 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a  sp->gp->start);.
113c0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
113d0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
113e0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
113f0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11400 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  left")==0 ){.   
11410 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
11420 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
11430 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
11440 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20  soc = LEFT;.    
11450 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11460 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50   = WAITING_FOR_P
11470 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
11480 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
11490 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72 69  if( strcmp(x,"ri
114a0 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ght")==0 ){.    
114b0 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
114c0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
114d0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
114e0 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20 20  oc = RIGHT;.    
114f0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11500 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50   = WAITING_FOR_P
11510 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
11520 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
11530 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f  if( strcmp(x,"no
11540 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20  nassoc")==0 ){. 
11550 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
11560 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  eccounter++;.   
11570 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11580 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20  assoc = NONE;.  
11590 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
115a0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
115b0 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42  _PRECEDENCE_SYMB
115c0 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  OL;..}else if( s
115d0 74 72 63 6d 70 28 78 2c 22 64 65 73 74 72 75 63  trcmp(x,"destruc
115e0 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tor")==0 ){.    
115f0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11600 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
11610 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c  ESTRUCTOR_SYMBOL
11620 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
11630 63 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30  cmp(x,"type")==0
11640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11650 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11660 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f  NG_FOR_DATATYPE_
11670 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20  SYMBOL;.        
11680 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11690 28 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d  (x,"fallback")==
116a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
116b0 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30  sp->fallback = 0
116c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
116d0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
116e0 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44  _FOR_FALLBACK_ID
116f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
11700 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69  if( strcmp(x,"wi
11710 6c 64 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20  ldcard")==0 ){. 
11720 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
11730 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
11740 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20  R_WILDCARD_ID;. 
11750 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11760 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11770 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11780 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
11790 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e  .            "Un
117a0 6b 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74 69 6f  known declaratio
117b0 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25 25  n keyword: \"%%%
117c0 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
117d0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
117e0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
117f0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
11800 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
11810 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65  ROR;..}.      }e
11820 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
11830 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11840 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11850 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11860 22 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72 61  "Illegal declara
11870 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22  tion keyword: \"
11880 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
11890 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
118a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
118b0 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
118c0 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
118d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
118e0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
118f0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54  WAITING_FOR_DEST
11900 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20  RUCTOR_SYMBOL:. 
11910 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68       if( !isalph
11920 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
11930 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11940 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11950 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
11960 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61        "Symbol na
11970 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72  me missing after
11980 20 25 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65   %%destructor ke
11990 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20  yword");.       
119a0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
119b0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
119c0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
119d0 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
119e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
119f0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
11a00 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ol *sp = Symbol_
11a10 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
11a20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
11a30 20 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63 74   = &sp->destruct
11a40 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  or;.        psp-
11a50 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20  >decllinenoslot 
11a60 3d 20 26 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e  = &sp->destLinen
11a70 6f 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  o;.        psp->
11a80 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
11a90 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 1;.        psp
11aa0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11ab0 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a  G_FOR_DECL_ARG;.
11ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11ad0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
11ae0 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59  ITING_FOR_DATATY
11af0 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  PE_SYMBOL:.     
11b00 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 78 5b   if( !isalpha(x[
11b10 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
11b20 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
11b30 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
11b40 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
11b50 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d    "Symbol name m
11b60 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 25 74  issing after %%t
11b70 79 70 65 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20  ype keyword");. 
11b80 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
11b90 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
11ba0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
11bb0 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
11bc0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
11bd0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
11be0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
11bf0 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20  ymbol_find(x);. 
11c00 20 20 20 20 20 20 20 69 66 28 28 73 70 29 20 26         if((sp) &
11c10 26 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29  & (sp->datatype)
11c20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
11c30 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
11c40 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
11c50 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11c60 20 20 22 53 79 6d 62 6f 6c 20 25 25 74 79 70 65    "Symbol %%type
11c70 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
11c80 64 65 66 69 6e 65 64 22 2c 20 78 29 3b 0a 20 20  defined", x);.  
11c90 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11ca0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11cb0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11cc0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
11cd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  L_ERROR;.       
11ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11cf0 20 20 69 66 20 28 21 73 70 29 7b 0a 20 20 20 20    if (!sp){.    
11d00 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d          sp = Sym
11d10 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
11d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11d30 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
11d40 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74 79  ot = &sp->dataty
11d50 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  pe;.          ps
11d60 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
11d70 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
11d80 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11d90 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
11da0 41 52 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ARG;.        }. 
11db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
11dc0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49  ak;.    case WAI
11dd0 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
11de0 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20  NCE_SYMBOL:.    
11df0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
11e00 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
11e10 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11e20 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
11e30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
11e40 28 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20  ( isupper(x[0]) 
11e50 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
11e60 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
11e70 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f        sp = Symbo
11e80 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
11e90 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d    if( sp->prec>=
11ea0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
11eb0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
11ec0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
11ed0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
11ee0 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73      "Symbol \"%s
11ef0 5c 22 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  \" has already b
11f00 65 20 67 69 76 65 6e 20 61 20 70 72 65 63 65 64  e given a preced
11f10 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20  ence.",x);.     
11f20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11f30 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20  nt++;..}else{.  
11f40 20 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63          sp->prec
11f50 20 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e   = psp->preccoun
11f60 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ter;.          s
11f70 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e  p->assoc = psp->
11f80 64 65 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20  declassoc;..}.  
11f90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11fa0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11fb0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11fc0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
11fd0 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 73 73        "Can't ass
11fe0 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ign a precedence
11ff0 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b   to \"%s\".",x);
12000 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
12010 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12020 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
12030 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
12040 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20  FOR_DECL_ARG:.  
12050 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b      if( x[0]=='{
12060 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20  ' || x[0]=='\"' 
12070 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29  || isalnum(x[0])
12080 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
12090 74 20 63 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a  t char *zOld, *z
120a0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 63 68 61  New;.        cha
120b0 72 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20  r *zBuf, *z;.   
120c0 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e       int nOld, n
120d0 2c 20 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c 20 6e  , nLine, nNew, n
120e0 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e  Back;.        in
120f0 74 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a  t addLineMacro;.
12100 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69          char zLi
12110 6e 65 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20  ne[50];.        
12120 7a 4e 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20  zNew = x;.      
12130 20 20 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27    if( zNew[0]=='
12140 22 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27  "' || zNew[0]=='
12150 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20  {' ) zNew++;.   
12160 20 20 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f       nNew = lemo
12170 6e 53 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20  nStrlen(zNew);. 
12180 20 20 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d         if( *psp-
12190 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a  >declargslot ){.
121a0 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d            zOld =
121b0 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c   *psp->declargsl
121c0 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ot;.        }els
121d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c  e{.          zOl
121e0 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
121f0 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d  }.        nOld =
12200 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c   lemonStrlen(zOl
12210 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20  d);.        n = 
12220 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30  nOld + nNew + 20
12230 3b 0a 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e  ;.        addLin
12240 65 4d 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67  eMacro = !psp->g
12250 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
12260 20 26 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c   && psp->insertL
12270 69 6e 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20  ineMacro &&.    
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12290 20 20 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69      (psp->declli
122a0 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70  nenoslot==0 || p
122b0 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
122c0 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20  ot[0]!=0);.     
122d0 20 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61     if( addLineMa
122e0 63 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cro ){.         
122f0 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65   for(z=psp->file
12300 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a  name, nBack=0; *
12310 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
12320 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c       if( *z=='\\
12330 27 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20  ' ) nBack++;.   
12340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12350 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
12360 2c 20 22 23 6c 69 6e 65 20 25 64 20 22 2c 20 70  , "#line %d ", p
12370 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29  sp->tokenlineno)
12380 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e  ;.          nLin
12390 65 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  e = lemonStrlen(
123a0 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
123b0 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c    n += nLine + l
123c0 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e  emonStrlen(psp->
123d0 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63  filename) + nBac
123e0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
123f0 20 20 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61       *psp->decla
12400 72 67 73 6c 6f 74 20 3d 20 28 63 68 61 72 20 2a  rgslot = (char *
12410 29 20 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e  ) realloc(*psp->
12420 64 65 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b  declargslot, n);
12430 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20 3d 20  .        zBuf = 
12440 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  *psp->declargslo
12450 74 20 2b 20 6e 4f 6c 64 3b 0a 20 20 20 20 20 20  t + nOld;.      
12460 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61 63    if( addLineMac
12470 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
12480 69 66 28 20 6e 4f 6c 64 20 26 26 20 7a 42 75 66  if( nOld && zBuf
12490 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  [-1]!='\n' ){.  
124a0 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66            *(zBuf
124b0 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20  ++) = '\n';.    
124c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
124d0 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a    memcpy(zBuf, z
124e0 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
124f0 20 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20          zBuf += 
12500 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20 20 20 20  nLine;.         
12510 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27   *(zBuf++) = '"'
12520 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
12530 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b  z=psp->filename;
12540 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20   *z; z++){.     
12550 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27         if( *z=='
12560 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \\' ){.         
12570 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
12580 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 20 20 20   '\\';.         
12590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
125a0 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 2a 7a 3b   *(zBuf++) = *z;
125b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
125c0 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29         *(zBuf++)
125d0 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20   = '"';.        
125e0 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c    *(zBuf++) = '\
125f0 6e 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n';.        }.  
12600 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64        if( psp->d
12610 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 26 26  ecllinenoslot &&
12620 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
12630 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20  slot[0]==0 ){.  
12640 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
12650 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20 3d  llinenoslot[0] =
12660 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
12670 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
12680 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66       memcpy(zBuf
12690 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  , zNew, nNew);. 
126a0 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e         zBuf += n
126b0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 2a 7a 42  New;.        *zB
126c0 75 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  uf = 0;.        
126d0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
126e0 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
126f0 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
12700 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
12710 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12720 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
12730 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
12740 49 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74  Illegal argument
12750 20 74 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73   to %%%s: %s",ps
12760 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78  p->declkeyword,x
12770 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
12780 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12790 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
127a0 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
127b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
127c0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
127d0 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
127e0 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a  FOR_FALLBACK_ID:
127f0 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
12800 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
12810 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
12820 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
12830 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
12840 73 65 20 69 66 28 20 21 69 73 75 70 70 65 72 28  se if( !isupper(
12850 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
12860 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12870 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
12880 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12890 20 20 20 20 20 22 25 25 66 61 6c 6c 62 61 63 6b       "%%fallback
128a0 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22   argument \"%s\"
128b0 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b   should be a tok
128c0 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  en", x);.       
128d0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
128e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
128f0 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
12900 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
12910 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
12920 20 20 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62    if( psp->fallb
12930 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ack==0 ){.      
12940 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63      psp->fallbac
12950 6b 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20  k = sp;.        
12960 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 66 61  }else if( sp->fa
12970 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
12980 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
12990 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
129a0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
129b0 20 20 20 20 20 20 20 20 20 20 22 4d 6f 72 65 20            "More 
129c0 74 68 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63  than one fallbac
129d0 6b 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 6f  k assigned to to
129e0 6b 65 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  ken %s", x);.   
129f0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12a00 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
12a10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12a20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20   sp->fallback = 
12a30 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20  psp->fallback;. 
12a40 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70           psp->gp
12a50 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d  ->has_fallback =
12a60 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
12a70 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
12a80 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
12a90 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44  ING_FOR_WILDCARD
12aa0 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78  _ID:.      if( x
12ab0 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
12ac0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12ad0 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
12ae0 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
12af0 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 75 70   }else if( !isup
12b00 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  per(x[0]) ){.   
12b10 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12b20 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
12b30 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
12b40 20 20 20 20 20 20 20 20 20 22 25 25 77 69 6c 64           "%%wild
12b50 63 61 72 64 20 61 72 67 75 6d 65 6e 74 20 5c 22  card argument \"
12b60 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
12b70 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
12b80 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12b90 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
12ba0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
12bb0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
12bc0 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
12bd0 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 67        if( psp->g
12be0 70 2d 3e 77 69 6c 64 63 61 72 64 3d 3d 30 20 29  p->wildcard==0 )
12bf0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12c00 3e 67 70 2d 3e 77 69 6c 64 63 61 72 64 20 3d 20  >gp->wildcard = 
12c10 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  sp;.        }els
12c20 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  e{.          Err
12c30 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
12c40 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ame, psp->tokenl
12c50 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
12c60 20 20 20 22 45 78 74 72 61 20 77 69 6c 64 63 61     "Extra wildca
12c70 72 64 20 74 6f 20 74 6f 6b 65 6e 3a 20 25 73 22  rd to token: %s"
12c80 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , x);.          
12c90 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
12ca0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12cb0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
12cc0 20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f      case RESYNC_
12cd0 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
12ce0 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b  :./*      if( x[
12cf0 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73  0]=='.' ) psp->s
12d00 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
12d10 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
12d20 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  .**      break; 
12d30 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45 53 59  */.    case RESY
12d40 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
12d50 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ROR:.      if( x
12d60 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e  [0]=='.' ) psp->
12d70 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
12d80 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
12d90 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  ;.      if( x[0]
12da0 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61  =='%' ) psp->sta
12db0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
12dc0 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20  _DECL_KEYWORD;. 
12dd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
12de0 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68 65 20 70 72  }../* Run the pr
12df0 65 70 72 6f 63 65 73 73 6f 72 20 6f 76 65 72 20  eprocessor over 
12e00 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74  the input file t
12e10 65 78 74 2e 20 20 54 68 65 20 67 6c 6f 62 61 6c  ext.  The global
12e20 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 7a   variables.** az
12e30 44 65 66 69 6e 65 5b 30 5d 20 74 68 72 6f 75 67  Define[0] throug
12e40 68 20 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69  h azDefine[nDefi
12e50 6e 65 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74  ne-1] contains t
12e60 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
12e70 64 65 66 69 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f  defined.** macro
12e80 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
12e90 20 6c 6f 6f 6b 73 20 66 6f 72 20 22 25 69 66 64   looks for "%ifd
12ea0 65 66 22 20 61 6e 64 20 22 25 69 66 6e 64 65 66  ef" and "%ifndef
12eb0 22 20 61 6e 64 20 22 25 65 6e 64 69 66 22 20 61  " and "%endif" a
12ec0 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 74  nd.** comments t
12ed0 68 65 6d 20 6f 75 74 2e 20 20 54 65 78 74 20 69  hem out.  Text i
12ee0 6e 20 62 65 74 77 65 65 6e 20 69 73 20 61 6c 73  n between is als
12ef0 6f 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20  o commented out 
12f00 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
12f10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
12f20 72 65 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28  reprocess_input(
12f30 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
12f40 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 69 6e  i, j, k, n;.  in
12f50 74 20 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20  t exclude = 0;. 
12f60 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a   int start = 0;.
12f70 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 31    int lineno = 1
12f80 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 5f 6c 69  ;.  int start_li
12f90 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28  neno = 1;.  for(
12fa0 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
12fb0 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
12fc0 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
12fd0 20 20 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 25      if( z[i]!='%
12fe0 27 20 7c 7c 20 28 69 3e 30 20 26 26 20 7a 5b 69  ' || (i>0 && z[i
12ff0 2d 31 5d 21 3d 27 5c 6e 27 29 20 29 20 63 6f 6e  -1]!='\n') ) con
13000 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
13010 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 65  trncmp(&z[i],"%e
13020 6e 64 69 66 22 2c 36 29 3d 3d 30 20 26 26 20 69  ndif",6)==0 && i
13030 73 73 70 61 63 65 28 7a 5b 69 2b 36 5d 29 20 29  sspace(z[i+6]) )
13040 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c  {.      if( excl
13050 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ude ){.        e
13060 78 63 6c 75 64 65 2d 2d 3b 0a 20 20 20 20 20 20  xclude--;.      
13070 20 20 69 66 28 20 65 78 63 6c 75 64 65 3d 3d 30    if( exclude==0
13080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
13090 72 28 6a 3d 73 74 61 72 74 3b 20 6a 3c 69 3b 20  r(j=start; j<i; 
130a0 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a 5d 21 3d 27  j++) if( z[j]!='
130b0 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d 20 27 20 27  \n' ) z[j] = ' '
130c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
130d0 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
130e0 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21  i; z[j] && z[j]!
130f0 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d  ='\n'; j++) z[j]
13100 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d 65 6c 73   = ' ';.    }els
13110 65 20 69 66 28 20 28 73 74 72 6e 63 6d 70 28 26  e if( (strncmp(&
13120 7a 5b 69 5d 2c 22 25 69 66 64 65 66 22 2c 36 29  z[i],"%ifdef",6)
13130 3d 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a  ==0 && isspace(z
13140 5b 69 2b 36 5d 29 29 0a 20 20 20 20 20 20 20 20  [i+6])).        
13150 20 20 7c 7c 20 28 73 74 72 6e 63 6d 70 28 26 7a    || (strncmp(&z
13160 5b 69 5d 2c 22 25 69 66 6e 64 65 66 22 2c 37 29  [i],"%ifndef",7)
13170 3d 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a  ==0 && isspace(z
13180 5b 69 2b 37 5d 29 29 20 29 7b 0a 20 20 20 20 20  [i+7])) ){.     
13190 20 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a   if( exclude ){.
131a0 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 2b          exclude+
131b0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
131c0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b          for(j=i+
131d0 37 3b 20 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29  7; isspace(z[j])
131e0 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20  ; j++){}.       
131f0 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d   for(n=0; z[j+n]
13200 20 26 26 20 21 69 73 73 70 61 63 65 28 7a 5b 6a   && !isspace(z[j
13210 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20  +n]); n++){}.   
13220 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 31       exclude = 1
13230 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
13240 30 3b 20 6b 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b  0; k<nDefine; k+
13250 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
13260 28 20 73 74 72 6e 63 6d 70 28 61 7a 44 65 66 69  ( strncmp(azDefi
13270 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d  ne[k],&z[j],n)==
13280 30 20 26 26 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  0 && lemonStrlen
13290 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 29 3d 3d 6e  (azDefine[k])==n
132a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
132b0 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 20  exclude = 0;.   
132c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
132d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
132e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
132f0 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e 27 20 29 20  ( z[i+3]=='n' ) 
13300 65 78 63 6c 75 64 65 20 3d 20 21 65 78 63 6c 75  exclude = !exclu
13310 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  de;.        if( 
13320 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20  exclude ){.     
13330 20 20 20 20 20 73 74 61 72 74 20 3d 20 69 3b 0a       start = i;.
13340 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 5f            start_
13350 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b  lineno = lineno;
13360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13370 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69   }.      for(j=i
13380 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d  ; z[j] && z[j]!=
13390 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20  '\n'; j++) z[j] 
133a0 3d 20 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 7d  = ' ';.    }.  }
133b0 0a 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29  .  if( exclude )
133c0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
133d0 64 65 72 72 2c 22 75 6e 74 65 72 6d 69 6e 61 74  derr,"unterminat
133e0 65 64 20 25 25 69 66 64 65 66 20 73 74 61 72 74  ed %%ifdef start
133f0 69 6e 67 20 6f 6e 20 6c 69 6e 65 20 25 64 5c 6e  ing on line %d\n
13400 22 2c 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 29  ", start_lineno)
13410 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
13420 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69 74   }.}../* In spit
13430 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c 20 74  e of its name, t
13440 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13450 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e 65 72  really a scanner
13460 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20 69 6e  .  It read.** in
13470 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75   the entire inpu
13480 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74 20 6f  t file (all at o
13490 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65 6e 69  nce) then tokeni
134a0 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a 2a 2a  zes it.  Each.**
134b0 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73 65 64   token is passed
134c0 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
134d0 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 22   "parseonetoken"
134e0 20 77 68 69 63 68 20 62 75 69 6c 64 73 20 61 6c   which builds al
134f0 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72  l.** the appropr
13500 69 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74  iate data struct
13510 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c 6f 62  ures in the glob
13520 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20  al state vector 
13530 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61  "gp"..*/.void Pa
13540 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  rse(struct lemon
13550 20 2a 67 70 29 0a 7b 0a 20 20 73 74 72 75 63 74   *gp).{.  struct
13560 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49   pstate ps;.  FI
13570 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a  LE *fp;.  char *
13580 66 69 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66  filebuf;.  int f
13590 69 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c  ilesize;.  int l
135a0 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a  ineno;.  int c;.
135b0 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78    char *cp, *nex
135c0 74 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74  tcp;.  int start
135d0 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d  line = 0;..  mem
135e0 73 65 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73  set(&ps, '\0', s
135f0 69 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73  izeof(ps));.  ps
13600 2e 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66  .gp = gp;.  ps.f
13610 69 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69  ilename = gp->fi
13620 6c 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72  lename;.  ps.err
13630 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e  orcnt = 0;.  ps.
13640 73 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49  state = INITIALI
13650 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  ZE;..  /* Begin 
13660 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 69  by reading the i
13670 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66  nput file */.  f
13680 70 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c  p = fopen(ps.fil
13690 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69  ename,"rb");.  i
136a0 66 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( fp==0 ){.    
136b0 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
136c0 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70  name,0,"Can't op
136d0 65 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  en this file for
136e0 20 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20   reading.");.   
136f0 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b   gp->errorcnt++;
13700 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
13710 0a 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29  .  fseek(fp,0,2)
13720 3b 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66  ;.  filesize = f
13730 74 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69  tell(fp);.  rewi
13740 6e 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75  nd(fp);.  filebu
13750 66 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c  f = (char *)mall
13760 6f 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29  oc( filesize+1 )
13770 3b 0a 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d  ;.  if( filebuf=
13780 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d  =0 ){.    ErrorM
13790 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30  sg(ps.filename,0
137a0 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65  ,"Can't allocate
137b0 20 25 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f   %d of memory to
137c0 20 68 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e   hold this file.
137d0 22 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a  ",.      filesiz
137e0 65 2b 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72  e+1);.    gp->er
137f0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
13800 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
13810 66 72 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c  fread(filebuf,1,
13820 66 69 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69  filesize,fp)!=fi
13830 6c 65 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72  lesize ){.    Er
13840 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
13850 6d 65 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64  me,0,"Can't read
13860 20 69 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73   in all %d bytes
13870 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c   of this file.",
13880 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29  .      filesize)
13890 3b 0a 20 20 20 20 66 72 65 65 28 66 69 6c 65 62  ;.    free(fileb
138a0 75 66 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  uf);.    gp->err
138b0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
138c0 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  urn;.  }.  fclos
138d0 65 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66  e(fp);.  filebuf
138e0 5b 66 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a  [filesize] = 0;.
138f0 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e  .  /* Make an in
13900 69 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75  itial pass throu
13910 67 68 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68  gh the file to h
13920 61 6e 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64  andle %ifdef and
13930 20 25 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72   %ifndef */.  pr
13940 65 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66  eprocess_input(f
13950 69 6c 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e  ilebuf);..  /* N
13960 6f 77 20 73 63 61 6e 20 74 68 65 20 74 65 78 74  ow scan the text
13970 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69   of the input fi
13980 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d  le */.  lineno =
13990 20 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c   1;.  for(cp=fil
139a0 65 62 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d  ebuf; (c= *cp)!=
139b0 30 3b 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  0; ){.    if( c=
139c0 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
139d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
139e0 2a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  * Keep track of 
139f0 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
13a00 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 73 70 61  */.    if( isspa
13a10 63 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63  ce(c) ){ cp++; c
13a20 6f 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53  ontinue; }  /* S
13a30 6b 69 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70  kip all white sp
13a40 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  ace */.    if( c
13a50 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
13a60 27 2f 27 20 29 7b 20 20 20 20 20 20 20 20 20 20  '/' ){          
13a70 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c  /* Skip C++ styl
13a80 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20  e comments */.  
13a90 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20      cp+=2;.     
13aa0 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
13ab0 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29  !=0 && c!='\n' )
13ac0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e   cp++;.      con
13ad0 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
13ae0 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
13af0 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20  p[1]=='*' ){    
13b00 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20        /* Skip C 
13b10 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a  style comments *
13b20 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20  /.      cp+=2;. 
13b30 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
13b40 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27  *cp)!=0 && (c!='
13b50 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a  /' || cp[-1]!='*
13b60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ') ){.        if
13b70 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
13b80 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70  no++;.        cp
13b90 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
13ba0 20 20 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a    if( c ) cp++;.
13bb0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
13bc0 20 20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b      }.    ps.tok
13bd0 65 6e 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20  enstart = cp;   
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13bf0 4d 61 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69  Mark the beginni
13c00 6e 67 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20  ng of the token 
13c10 2a 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c  */.    ps.tokenl
13c20 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20  ineno = lineno; 
13c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
13c40 65 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68  enumber on which
13c50 20 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f   token begins */
13c60 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27  .    if( c=='\"'
13c70 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
13c80 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e          /* Strin
13c90 67 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20  g literals */.  
13ca0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
13cb0 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
13cc0 3d 30 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b  =0 && c!='\"' ){
13cd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
13ce0 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
13cf0 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  .        cp++;. 
13d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
13d10 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
13d20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
13d30 65 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c  ename,startline,
13d40 0a 22 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e  ."String startin
13d50 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  g on this line i
13d60 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64  s not terminated
13d70 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20   before the end 
13d80 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a  of the file.");.
13d90 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72          ps.error
13da0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  cnt++;.        n
13db0 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
13dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13dd0 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a   nextcp = cp+1;.
13de0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
13df0 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20  e if( c=='{' ){ 
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13e10 20 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f   A block of C co
13e20 64 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  de */.      int 
13e30 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b  level;.      cp+
13e40 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76  +;.      for(lev
13e50 65 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d  el=1; (c= *cp)!=
13e60 30 20 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c  0 && (level>1 ||
13e70 20 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b   c!='}'); cp++){
13e80 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
13e90 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
13ea0 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
13eb0 28 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c  ( c=='{' ) level
13ec0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  ++;.        else
13ed0 20 69 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65   if( c=='}' ) le
13ee0 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65  vel--;.        e
13ef0 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26  lse if( c=='/' &
13f00 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20  & cp[1]=='*' ){ 
13f10 20 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74   /* Skip comment
13f20 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
13f30 6e 74 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20  nt prevc;.      
13f40 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b      cp = &cp[2];
13f50 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63  .          prevc
13f60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
13f70 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
13f80 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c  =0 && (c!='/' ||
13f90 20 70 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a   prevc!='*') ){.
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
13fb0 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
13fc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
13fd0 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20  prevc = c;.     
13fe0 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20         cp++;..  
13ff0 7d 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  }..}else if( c==
14000 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f  '/' && cp[1]=='/
14010 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b  ' ){  /* Skip C+
14020 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  + style comments
14030 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20   too */.        
14040 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20    cp = &cp[2];. 
14050 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
14060 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63  (c= *cp)!=0 && c
14070 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20  !='\n' ) cp++;. 
14080 20 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29           if( c )
14090 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73   lineno++;..}els
140a0 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c  e if( c=='\'' ||
140b0 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f   c=='\"' ){    /
140c0 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61 72 61  * String a chara
140d0 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f  cter literals */
140e0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73  .          int s
140f0 74 61 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b  tartchar, prevc;
14100 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74  .          start
14110 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20  char = c;.      
14120 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20      prevc = 0;. 
14130 20 20 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b           for(cp+
14140 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  +; (c= *cp)!=0 &
14150 26 20 28 63 21 3d 73 74 61 72 74 63 68 61 72 20  & (c!=startchar 
14160 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b  || prevc=='\\');
14170 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   cp++){.        
14180 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
14190 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
141a0 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65 76          if( prev
141b0 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20  c=='\\' ) prevc 
141c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
141d0 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
141e0 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 09 20     prevc = c;.. 
141f0 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20   }..}.      }.  
14200 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
14210 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
14220 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e  (ps.filename,ps.
14230 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20  tokenlineno,."C 
14240 63 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e  code starting on
14250 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
14260 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66  t terminated bef
14270 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ore the end of t
14280 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20  he file.");.    
14290 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b      ps.errorcnt+
142a0 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  +;.        nextc
142b0 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65  p = cp;.      }e
142c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  lse{.        nex
142d0 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20  tcp = cp+1;.    
142e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
142f0 28 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20  ( isalnum(c) ){ 
14300 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e           /* Iden
14310 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20  tifiers */.     
14320 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
14330 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  !=0 && (isalnum(
14340 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20  c) || c=='_') ) 
14350 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
14360 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
14370 73 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26  se if( c==':' &&
14380 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63   cp[1]==':' && c
14390 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20  p[2]=='=' ){ /* 
143a0 54 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a  The operator "::
143b0 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b  =" */.      cp +
143c0 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  = 3;.      nextc
143d0 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
143e0 65 20 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c  e if( (c=='/' ||
143f0 20 63 3d 3d 27 7c 27 29 20 26 26 20 69 73 61 6c   c=='|') && isal
14400 70 68 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20  pha(cp[1]) ){.  
14410 20 20 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20      cp += 2;.   
14420 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a     while( (c = *
14430 63 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e  cp)!=0 && (isaln
14440 75 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29  um(c) || c=='_')
14450 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e   ) cp++;.      n
14460 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
14470 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
14480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14490 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e  /* All other (on
144a0 65 20 63 68 61 72 61 63 74 65 72 29 20 6f 70 65  e character) ope
144b0 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  rators */.      
144c0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
144d0 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20  cp = cp;.    }. 
144e0 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20     c = *cp;.    
144f0 2a 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *cp = 0;        
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 2f 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  /* Null terminat
14520 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20  e the token */. 
14530 20 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e     parseonetoken
14540 28 26 70 73 29 3b 20 20 20 20 20 20 20 20 20 20  (&ps);          
14550 20 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20     /* Parse the 
14560 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70  token */.    *cp
14570 20 3d 20 63 3b 20 20 20 20 20 20 20 20 20 20 20   = c;           
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14590 52 65 73 74 6f 72 65 20 74 68 65 20 62 75 66 66  Restore the buff
145a0 65 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e  er */.    cp = n
145b0 65 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65  extcp;.  }.  fre
145c0 65 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20  e(filebuf);     
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
145e0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 62 75  * Release the bu
145f0 66 66 65 72 20 61 66 74 65 72 20 70 61 72 73 69  ffer after parsi
14600 6e 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65  ng */.  gp->rule
14610 20 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b   = ps.firstrule;
14620 0a 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20  .  gp->errorcnt 
14630 3d 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d  = ps.errorcnt;.}
14640 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
14660 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69  om the file "pli
14670 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nk.c" **********
14680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
14690 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63  ** Routines proc
146a0 65 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61  essing configura
146b0 74 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20  tion follow-set 
146c0 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
146d0 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f  s.** in the LEMO
146e0 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
146f0 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  or..*/.static st
14700 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e  ruct plink *plin
14710 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a  k_freelist = 0;.
14720 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
14730 65 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75  ew plink */.stru
14740 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f  ct plink *Plink_
14750 6e 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20  new(){.  struct 
14760 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b 0a  plink *newlink;.
14770 0a 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65  .  if( plink_fre
14780 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
14790 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61  int i;.    int a
147a0 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c  mt = 100;.    pl
147b0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28  ink_freelist = (
147c0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 63  struct plink *)c
147d0 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65  alloc( amt, size
147e0 6f 66 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 29  of(struct plink)
147f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e   );.    if( plin
14800 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  k_freelist==0 ){
14810 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
14820 74 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e  tderr,.      "Un
14830 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
14840 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
14850 77 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  w follow-set pro
14860 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e  pagation link.\n
14870 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
14880 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
14890 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69  (i=0; i<amt-1; i
148a0 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  ++) plink_freeli
148b0 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c  st[i].next = &pl
148c0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31  ink_freelist[i+1
148d0 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  ];.    plink_fre
148e0 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
148f0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
14900 6c 69 6e 6b 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  link = plink_fre
14910 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66  elist;.  plink_f
14920 72 65 65 6c 69 73 74 20 3d 20 70 6c 69 6e 6b 5f  reelist = plink_
14930 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
14940 20 20 72 65 74 75 72 6e 20 6e 65 77 6c 69 6e 6b    return newlink
14950 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c  ;.}../* Add a pl
14960 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c  ink to a plink l
14970 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
14980 6b 5f 61 64 64 28 73 74 72 75 63 74 20 70 6c 69  k_add(struct pli
14990 6e 6b 20 2a 2a 70 6c 70 70 2c 20 73 74 72 75 63  nk **plpp, struc
149a0 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 29 0a 7b  t config *cfp).{
149b0 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
149c0 2a 6e 65 77 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c  *newlink;.  newl
149d0 69 6e 6b 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77 28  ink = Plink_new(
149e0 29 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d 3e 6e 65  );.  newlink->ne
149f0 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70  xt = *plpp;.  *p
14a00 6c 70 70 20 3d 20 6e 65 77 6c 69 6e 6b 3b 0a 20  lpp = newlink;. 
14a10 20 6e 65 77 6c 69 6e 6b 2d 3e 63 66 70 20 3d 20   newlink->cfp = 
14a20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73  cfp;.}../* Trans
14a30 66 65 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20  fer every plink 
14a40 6f 6e 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f  on the list "fro
14a50 6d 22 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22  m" to the list "
14a60 74 6f 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  to" */.void Plin
14a70 6b 5f 63 6f 70 79 28 73 74 72 75 63 74 20 70 6c  k_copy(struct pl
14a80 69 6e 6b 20 2a 2a 74 6f 2c 20 73 74 72 75 63 74  ink **to, struct
14a90 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 29 0a 7b 0a   plink *from).{.
14aa0 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
14ab0 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28  nextpl;.  while(
14ac0 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78   from ){.    nex
14ad0 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74  tpl = from->next
14ae0 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74  ;.    from->next
14af0 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20   = *to;.    *to 
14b00 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d  = from;.    from
14b10 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
14b20 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72  ../* Delete ever
14b30 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c  y plink on the l
14b40 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
14b50 6b 5f 64 65 6c 65 74 65 28 73 74 72 75 63 74 20  k_delete(struct 
14b60 70 6c 69 6e 6b 20 2a 70 6c 70 29 0a 7b 0a 20 20  plink *plp).{.  
14b70 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
14b80 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c 65 28 20  xtpl;..  while( 
14b90 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  plp ){.    nextp
14ba0 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  l = plp->next;. 
14bb0 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20 3d 20 70     plp->next = p
14bc0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20  link_freelist;. 
14bd0 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
14be0 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20 70 6c 70  t = plp;.    plp
14bf0 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
14c00 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
14c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
14c20 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e  he file "report.
14c30 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
14c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
14c50 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72 65 73 20  *.** Procedures 
14c60 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72  for generating r
14c70 65 70 6f 72 74 73 20 61 6e 64 20 74 61 62 6c 65  eports and table
14c80 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
14c90 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
14ca0 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  .*/../* Generate
14cb0 20 61 20 66 69 6c 65 6e 61 6d 65 20 77 69 74 68   a filename with
14cc0 20 74 68 65 20 67 69 76 65 6e 20 73 75 66 66 69   the given suffi
14cd0 78 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  x.  Space to hol
14ce0 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f  d the.** name co
14cf0 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  mes from malloc(
14d00 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
14d10 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
14d20 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
14d30 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20  */.PRIVATE char 
14d40 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 73  *file_makename(s
14d50 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
14d60 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  p, const char *s
14d70 75 66 66 69 78 29 0a 7b 0a 20 20 63 68 61 72 20  uffix).{.  char 
14d80 2a 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63  *name;.  char *c
14d90 70 3b 0a 0a 20 20 6e 61 6d 65 20 3d 20 28 63 68  p;..  name = (ch
14da0 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f  ar*)malloc( lemo
14db0 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69  nStrlen(lemp->fi
14dc0 6c 65 6e 61 6d 65 29 20 2b 20 6c 65 6d 6f 6e 53  lename) + lemonS
14dd0 74 72 6c 65 6e 28 73 75 66 66 69 78 29 20 2b 20  trlen(suffix) + 
14de0 35 20 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d  5 );.  if( name=
14df0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
14e00 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
14e10 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
14e20 6f 72 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e  or a filename.\n
14e30 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
14e40 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 6e 61  .  }.  strcpy(na
14e50 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  me,lemp->filenam
14e60 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63  e);.  cp = strrc
14e70 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20  hr(name,'.');.  
14e80 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30  if( cp ) *cp = 0
14e90 3b 0a 20 20 73 74 72 63 61 74 28 6e 61 6d 65 2c  ;.  strcat(name,
14ea0 73 75 66 66 69 78 29 3b 0a 20 20 72 65 74 75 72  suffix);.  retur
14eb0 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70  n name;.}../* Op
14ec0 65 6e 20 61 20 66 69 6c 65 20 77 69 74 68 20 61  en a file with a
14ed0 20 6e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 74   name based on t
14ee0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
14ef0 6e 70 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75  nput file,.** bu
14f00 74 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  t with a differe
14f10 6e 74 20 28 73 70 65 63 69 66 69 65 64 29 20 73  nt (specified) s
14f20 75 66 66 69 78 2c 20 61 6e 64 20 72 65 74 75 72  uffix, and retur
14f30 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
14f40 6f 20 74 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a  o the stream */.
14f50 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 66 69  PRIVATE FILE *fi
14f60 6c 65 5f 6f 70 65 6e 28 0a 20 20 73 74 72 75 63  le_open(.  struc
14f70 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20  t lemon *lemp,. 
14f80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 75 66   const char *suf
14f90 66 69 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  fix,.  const cha
14fa0 72 20 2a 6d 6f 64 65 0a 29 7b 0a 20 20 46 49 4c  r *mode.){.  FIL
14fb0 45 20 2a 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65  E *fp;..  if( le
14fc0 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72  mp->outname ) fr
14fd0 65 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  ee(lemp->outname
14fe0 29 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61  );.  lemp->outna
14ff0 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61  me = file_makena
15000 6d 65 28 6c 65 6d 70 2c 20 73 75 66 66 69 78 29  me(lemp, suffix)
15010 3b 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c  ;.  fp = fopen(l
15020 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64  emp->outname,mod
15030 65 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20  e);.  if( fp==0 
15040 26 26 20 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b  && *mode=='w' ){
15050 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
15060 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  err,"Can't open 
15070 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
15080 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a  lemp->outname);.
15090 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
150a0 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
150b0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64   0;.  }..  /* Ad
150c0 64 20 66 69 6c 65 73 20 77 65 20 63 72 65 61 74  d files we creat
150d0 65 20 74 6f 20 61 20 6c 69 73 74 2c 20 73 6f 20  e to a list, so 
150e0 77 65 20 63 61 6e 20 64 65 6c 65 74 65 20 74 68  we can delete th
150f0 65 6d 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  em if we fail. T
15100 68 69 73 0a 20 20 2a 2a 20 69 73 20 74 6f 20 6b  his.  ** is to k
15110 65 65 70 20 6d 61 6b 65 66 69 6c 65 73 20 66 72  eep makefiles fr
15120 6f 6d 20 67 65 74 74 69 6e 67 20 63 6f 6e 66 75  om getting confu
15130 73 65 64 2e 20 57 65 20 64 6f 6e 27 74 20 69 6e  sed. We don't in
15140 63 6c 75 64 65 20 2e 6f 75 74 20 66 69 6c 65 73  clude .out files
15150 2c 0a 20 20 2a 2a 20 74 68 6f 75 67 68 3a 20 74  ,.  ** though: t
15160 68 69 73 20 69 73 20 64 65 62 75 67 20 69 6e 66  his is debug inf
15170 6f 72 6d 61 74 69 6f 6e 2c 20 61 6e 64 20 79 6f  ormation, and yo
15180 75 20 64 6f 6e 27 74 20 77 61 6e 74 20 69 74 20  u don't want it 
15190 64 65 6c 65 74 65 64 20 69 66 20 74 68 65 72 65  deleted if there
151a0 0a 20 20 2a 2a 20 77 61 73 20 61 6e 20 65 72 72  .  ** was an err
151b0 6f 72 20 79 6f 75 20 6e 65 65 64 20 74 6f 20 74  or you need to t
151c0 72 61 63 6b 20 64 6f 77 6e 2e 0a 20 20 2a 2f 0a  rack down..  */.
151d0 20 20 69 66 28 28 20 2a 6d 6f 64 65 3d 3d 27 77    if(( *mode=='w
151e0 27 20 29 20 26 26 20 28 73 74 72 63 6d 70 28 73  ' ) && (strcmp(s
151f0 75 66 66 69 78 2c 20 22 2e 6f 75 74 22 29 20 21  uffix, ".out") !
15200 3d 20 30 29 29 7b 0a 20 20 20 20 63 6f 6e 73 74  = 0)){.    const
15210 20 63 68 61 72 20 2a 2a 70 74 72 20 3d 20 28 63   char **ptr = (c
15220 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 0a 20 20  onst char **).  
15230 20 20 20 20 20 20 72 65 61 6c 6c 6f 63 28 6d 61        realloc(ma
15240 64 65 5f 66 69 6c 65 73 2c 20 73 69 7a 65 6f 66  de_files, sizeof
15250 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29   (const char **)
15260 20 2a 20 28 6d 61 64 65 5f 66 69 6c 65 73 5f 63   * (made_files_c
15270 6f 75 6e 74 20 2b 20 31 29 29 3b 0a 20 20 20 20  ount + 1));.    
15280 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6e 61 6d  const char *fnam
15290 65 20 3d 20 53 74 72 73 61 66 65 28 6c 65 6d 70  e = Strsafe(lemp
152a0 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20  ->outname);.    
152b0 69 66 20 28 28 70 74 72 20 3d 3d 20 4e 55 4c 4c  if ((ptr == NULL
152c0 29 20 7c 7c 20 28 66 6e 61 6d 65 20 3d 3d 20 4e  ) || (fname == N
152d0 55 4c 4c 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ULL)) {.        
152e0 66 72 65 65 28 70 74 72 29 3b 0a 20 20 20 20 20  free(ptr);.     
152f0 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28     memory_error(
15300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61 64  );.    }.    mad
15310 65 5f 66 69 6c 65 73 20 3d 20 70 74 72 3b 0a 20  e_files = ptr;. 
15320 20 20 20 6d 61 64 65 5f 66 69 6c 65 73 5b 6d 61     made_files[ma
15330 64 65 5f 66 69 6c 65 73 5f 63 6f 75 6e 74 2b 2b  de_files_count++
15340 5d 20 3d 20 66 6e 61 6d 65 3b 0a 20 20 7d 0a 20  ] = fname;.  }. 
15350 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f   return fp;.}../
15360 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20  * Duplicate the 
15370 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f  input file witho
15380 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20  ut comments and 
15390 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20  without actions 
153a0 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a  .** on rules */.
153b0 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74 72  void Reprint(str
153c0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
153d0 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
153e0 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73   *rp;.  struct s
153f0 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74  ymbol *sp;.  int
15400 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c   i, j, maxlen, l
15410 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b  en, ncolumns, sk
15420 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f  ip;.  printf("//
15430 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75   Reprint of inpu
15440 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  t file \"%s\".\n
15450 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c  // Symbols:\n",l
15460 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
15470 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20    maxlen = 10;. 
15480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
15490 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
154a0 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
154b0 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
154c0 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  len = lemonStrle
154d0 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  n(sp->name);.   
154e0 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20   if( len>maxlen 
154f0 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a  ) maxlen = len;.
15500 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d    }.  ncolumns =
15510 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a   76/(maxlen+5);.
15520 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31    if( ncolumns<1
15530 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b   ) ncolumns = 1;
15540 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d  .  skip = (lemp-
15550 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75  >nsymbol + ncolu
15560 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e  mns - 1)/ncolumn
15570 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  s;.  for(i=0; i<
15580 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  skip; i++){.    
15590 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20  printf("//");.  
155a0 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d    for(j=i; j<lem
155b0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73  p->nsymbol; j+=s
155c0 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d  kip){.      sp =
155d0 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a   lemp->symbols[j
155e0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
155f0 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b   sp->index==j );
15600 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
15610 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61  %3d %-*.*s",j,ma
15620 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e  xlen,maxlen,sp->
15630 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
15640 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
15650 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
15660 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
15670 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72  p->next){.    pr
15680 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68  intf("%s",rp->lh
15690 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a  s->name);.    /*
156a0 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
156b0 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22 28  lias ) printf("(
156c0 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  %s)",rp->lhsalia
156d0 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  s); */.    print
156e0 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66  f(" ::=");.    f
156f0 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
15700 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
15710 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
15720 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
15730 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
15740 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79        if( sp->ty
15750 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
15760 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  L ){.        for
15770 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62  (j=1; j<sp->nsub
15780 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  sym; j++){.     
15790 20 20 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73       printf("|%s
157a0 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d  ", sp->subsym[j]
157b0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
157c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
157d0 20 2f 2a 20 69 66 28 20 72 70 2d 3e 72 68 73 61   /* if( rp->rhsa
157e0 6c 69 61 73 5b 69 5d 20 29 20 70 72 69 6e 74 66  lias[i] ) printf
157f0 28 22 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61  ("(%s)",rp->rhsa
15800 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20  lias[i]); */.   
15810 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e   }.    printf(".
15820 22 29 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  ");.    if( rp->
15830 70 72 65 63 73 79 6d 20 29 20 70 72 69 6e 74 66  precsym ) printf
15840 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65  (" [%s]",rp->pre
15850 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  csym->name);.   
15860 20 2f 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65   /* if( rp->code
15870 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20   ) printf("\n   
15880 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20   %s",rp->code); 
15890 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c  */.    printf("\
158a0 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64  n");.  }.}..void
158b0 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c   ConfigPrint(FIL
158c0 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f  E *fp, struct co
158d0 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73  nfig *cfp).{.  s
158e0 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
158f0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
15900 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  *sp;.  int i, j;
15910 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b  .  rp = cfp->rp;
15920 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25  .  fprintf(fp,"%
15930 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e  s ::=",rp->lhs->
15940 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  name);.  for(i=0
15950 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69  ; i<=rp->nrhs; i
15960 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
15970 63 66 70 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e  cfp->dot ) fprin
15980 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20  tf(fp," *");.   
15990 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73   if( i==rp->nrhs
159a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 70   ) break;.    sp
159b0 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
159c0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
159d0 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
159e0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
159f0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
15a00 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  ){.      for(j=1
15a10 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
15a20 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   j++){.        f
15a30 70 72 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c  printf(fp,"|%s",
15a40 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e  sp->subsym[j]->n
15a50 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
15a60 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64    }.  }.}../* #d
15a70 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69  efine TEST */.#i
15a80 66 20 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73  f 0./* Print a s
15a90 65 74 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  et */.PRIVATE vo
15aa0 69 64 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c  id SetPrint(out,
15ab0 73 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a  set,lemp).FILE *
15ac0 6f 75 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a  out;.char *set;.
15ad0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
15ae0 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
15af0 20 63 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20   char *spacer;. 
15b00 20 73 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20   spacer = "";.  
15b10 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32  fprintf(out,"%12
15b20 73 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69  s[","");.  for(i
15b30 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =0; i<lemp->nter
15b40 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
15b50 20 69 66 28 20 53 65 74 46 69 6e 64 28 73 65 74   if( SetFind(set
15b60 2c 69 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ,i) ){.      fpr
15b70 69 6e 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c  intf(out,"%s%s",
15b80 73 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d  spacer,lemp->sym
15b90 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a  bols[i]->name);.
15ba0 20 20 20 20 20 20 73 70 61 63 65 72 20 3d 20 22        spacer = "
15bb0 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   ";.    }.  }.  
15bc0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e  fprintf(out,"]\n
15bd0 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20  ");.}../* Print 
15be0 61 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f  a plink chain */
15bf0 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c  .PRIVATE void Pl
15c00 69 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70  inkPrint(out,plp
15c10 2c 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  ,tag).FILE *out;
15c20 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70  .struct plink *p
15c30 6c 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b  lp;.char *tag;.{
15c40 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b  .  while( plp ){
15c50 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
15c60 2c 22 25 31 32 73 25 73 20 28 73 74 61 74 65 20  ,"%12s%s (state 
15c70 25 32 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c  %2d) ","",tag,pl
15c80 70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61  p->cfp->stp->sta
15c90 74 65 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66  tenum);.    Conf
15ca0 69 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d  igPrint(out,plp-
15cb0 3e 63 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e  >cfp);.    fprin
15cc0 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  tf(out,"\n");.  
15cd0 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78    plp = plp->nex
15ce0 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  t;.  }.}.#endif.
15cf0 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74  ./* Print an act
15d00 69 6f 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ion to the given
15d10 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15d20 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
15d30 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61  if.** nothing wa
15d40 73 20 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74  s actually print
15d50 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74  ed..*/.int Print
15d60 41 63 74 69 6f 6e 28 73 74 72 75 63 74 20 61 63  Action(struct ac
15d70 74 69 6f 6e 20 2a 61 70 2c 20 46 49 4c 45 20 2a  tion *ap, FILE *
15d80 66 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b  fp, int indent){
15d90 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20  .  int result = 
15da0 31 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d  1;.  switch( ap-
15db0 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  >type ){.    cas
15dc0 65 20 53 48 49 46 54 3a 0a 20 20 20 20 20 20 66  e SHIFT:.      f
15dd0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
15de0 68 69 66 74 20 20 25 64 22 2c 69 6e 64 65 6e 74  hift  %d",indent
15df0 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
15e00 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75  ->x.stp->statenu
15e10 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
15e20 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45  .    case REDUCE
15e30 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
15e40 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25  fp,"%*s reduce %
15e50 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  d",indent,ap->sp
15e60 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
15e70 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62  >index);.      b
15e80 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
15e90 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72  CCEPT:.      fpr
15ea0 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63  intf(fp,"%*s acc
15eb0 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ept",indent,ap->
15ec0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
15ed0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15ee0 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70   ERROR:.      fp
15ef0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72  rintf(fp,"%*s er
15f00 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ror",indent,ap->
15f10 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
15f20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15f30 20 53 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   SRCONFLICT:.   
15f40 20 63 61 73 65 20 52 52 43 4f 4e 46 4c 49 43 54   case RRCONFLICT
15f50 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
15f60 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25  fp,"%*s reduce %
15f70 2d 33 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63  -3d ** Parsing c
15f80 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20  onflict **",.   
15f90 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
15fa0 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72  sp->name,ap->x.r
15fb0 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
15fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15fd0 20 53 53 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   SSCONFLICT:.   
15fe0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
15ff0 2a 73 20 73 68 69 66 74 20 20 25 64 20 2a 2a 20  *s shift  %d ** 
16000 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74  Parsing conflict
16010 20 2a 2a 22 2c 20 0a 20 20 20 20 20 20 20 20 69   **", .        i
16020 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
16030 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74  me,ap->x.stp->st
16040 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62  atenum);.      b
16050 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
16060 48 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20  H_RESOLVED:.    
16070 63 61 73 65 20 52 44 5f 52 45 53 4f 4c 56 45 44  case RD_RESOLVED
16080 3a 0a 20 20 20 20 63 61 73 65 20 4e 4f 54 5f 55  :.    case NOT_U
16090 53 45 44 3a 0a 20 20 20 20 20 20 72 65 73 75 6c  SED:.      resul
160a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  t = 0;.      bre
160b0 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
160c0 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47   result;.}../* G
160d0 65 6e 65 72 61 74 65 20 74 68 65 20 22 79 2e 6f  enerate the "y.o
160e0 75 74 70 75 74 22 20 6c 6f 67 20 66 69 6c 65 20  utput" log file 
160f0 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75  */.void ReportOu
16100 74 70 75 74 28 73 74 72 75 63 74 20 6c 65 6d 6f  tput(struct lemo
16110 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74  n *lemp).{.  int
16120 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
16130 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
16140 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
16150 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
16160 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a  ap;.  FILE *fp;.
16170 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f 70 65  .  fp = file_ope
16180 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c 22 77  n(lemp,".out","w
16190 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30  b");.  if( fp==0
161a0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
161b0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
161c0 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
161d0 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
161e0 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e  ed[i];.    fprin
161f0 74 66 28 66 70 2c 22 53 74 61 74 65 20 25 64 3a  tf(fp,"State %d:
16200 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75  \n",stp->statenu
16210 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70  m);.    if( lemp
16220 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66  ->basisflag ) cf
16230 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65  p=stp->bp;.    e
16240 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
16250 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e 63 66       cfp=stp->cf
16260 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 66  p;.    while( cf
16270 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  p ){.      char 
16280 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69  buf[20];.      i
16290 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70  f( cfp->dot==cfp
162a0 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20  ->rp->nrhs ){.  
162b0 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 62 75        sprintf(bu
162c0 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e 72 70  f,"(%d)",cfp->rp
162d0 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
162e0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20    fprintf(fp,"  
162f0 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a 20 20    %5s ",buf);.  
16300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16310 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
16320 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20 20 20           ");.   
16330 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66 69     }.      Confi
16340 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29 3b 0a  gPrint(fp,cfp);.
16350 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
16360 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a 20 20  ,"\n");.#if 0.  
16370 20 20 20 20 53 65 74 50 72 69 6e 74 28 66 70 2c      SetPrint(fp,
16380 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a  cfp->fws,lemp);.
16390 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74        PlinkPrint
163a0 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22 54  (fp,cfp->fplp,"T
163b0 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50 6c 69  o  ");.      Pli
163c0 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e  nkPrint(fp,cfp->
163d0 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23 65  bplp,"From");.#e
163e0 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6c  ndif.      if( l
163f0 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
16400 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20 20   cfp=cfp->bp;.  
16410 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
16420 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 63 66            cfp=cf
16430 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  p->next;.    }. 
16440 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c     fprintf(fp,"\
16450 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  n");.    for(ap=
16460 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
16470 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
16480 20 69 66 28 20 50 72 69 6e 74 41 63 74 69 6f 6e   if( PrintAction
16490 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66 70 72  (ap,fp,30) ) fpr
164a0 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
164b0 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
164c0 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  (fp,"\n");.  }. 
164d0 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 2d 2d   fprintf(fp, "--
164e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
164f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16510 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74  --\n");.  fprint
16520 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c 73 3a 5c  f(fp, "Symbols:\
16530 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n");.  for(i=0; 
16540 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
16550 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
16560 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  ;.    struct sym
16570 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20 20 73 70  bol *sp;..    sp
16580 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
16590 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  [i];.    fprintf
165a0 28 66 70 2c 20 22 20 20 25 33 64 3a 20 25 73 22  (fp, "  %3d: %s"
165b0 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  , i, sp->name);.
165c0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
165d0 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b  ==NONTERMINAL ){
165e0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
165f0 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20 20 20 69  p, ":");.      i
16600 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 20 29 7b  f( sp->lambda ){
16610 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
16620 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64 61 3e 22  (fp, " <lambda>"
16630 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16640 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70   for(j=0; j<lemp
16650 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b  ->nterminal; j++
16660 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
16670 70 2d 3e 66 69 72 73 74 73 65 74 20 26 26 20 53  p->firstset && S
16680 65 74 46 69 6e 64 28 73 70 2d 3e 66 69 72 73 74  etFind(sp->first
16690 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20 20 20 20  set, j) ){.     
166a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
166b0 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d 3e 73 79   " %s", lemp->sy
166c0 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b  mbols[j]->name);
166d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
166e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72   }.    }.    fpr
166f0 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22 29 3b 0a  intf(fp, "\n");.
16700 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29    }.  fclose(fp)
16710 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
16720 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
16730 20 66 69 6c 65 20 22 6e 61 6d 65 22 20 77 68 69   file "name" whi
16740 63 68 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d  ch is in the sam
16750 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a  e directory as.*
16760 2a 20 74 68 65 20 65 78 61 63 75 74 61 62 6c 65  * the exacutable
16770 20 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72   */.PRIVATE char
16780 20 2a 70 61 74 68 73 65 61 72 63 68 28 63 68 61   *pathsearch(cha
16790 72 20 2a 61 72 67 76 30 2c 20 63 68 61 72 20 2a  r *argv0, char *
167a0 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f 64 65 6d 61  name, int modema
167b0 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68  sk).{.  const ch
167c0 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20 20  ar *pathlist;.  
167d0 63 68 61 72 20 2a 70 61 74 68 62 75 66 70 74 72  char *pathbufptr
167e0 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 62 75  ;.  char *pathbu
167f0 66 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 2c  f;.  char *path,
16800 2a 63 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a 0a  *cp;.  char c;..
16810 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f  #ifdef __WIN32__
16820 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
16830 61 72 67 76 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c  argv0,'\\');.#el
16840 73 65 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  se.  cp = strrch
16850 72 28 61 72 67 76 30 2c 27 2f 27 29 3b 0a 23 65  r(argv0,'/');.#e
16860 6e 64 69 66 0a 20 20 69 66 28 20 63 70 20 29 7b  ndif.  if( cp ){
16870 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20  .    c = *cp;.  
16880 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 70    *cp = 0;.    p
16890 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  ath = (char *)ma
168a0 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
168b0 6e 28 61 72 67 76 30 29 20 2b 20 6c 65 6d 6f 6e  n(argv0) + lemon
168c0 53 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32  Strlen(name) + 2
168d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68   );.    if( path
168e0 20 29 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c   ) sprintf(path,
168f0 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61  "%s/%s",argv0,na
16900 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63  me);.    *cp = c
16910 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
16920 61 74 68 6c 69 73 74 20 3d 20 67 65 74 65 6e 76  athlist = getenv
16930 28 22 50 41 54 48 22 29 3b 0a 20 20 20 20 69 66  ("PATH");.    if
16940 28 20 70 61 74 68 6c 69 73 74 3d 3d 30 20 29 20  ( pathlist==0 ) 
16950 70 61 74 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62  pathlist = ".:/b
16960 69 6e 3a 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20  in:/usr/bin";.  
16970 20 20 70 61 74 68 62 75 66 20 3d 20 28 63 68 61    pathbuf = (cha
16980 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d  r *) malloc( lem
16990 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73  onStrlen(pathlis
169a0 74 29 20 2b 20 31 20 29 3b 0a 20 20 20 20 70 61  t) + 1 );.    pa
169b0 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c  th = (char *)mal
169c0 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  loc( lemonStrlen
169d0 28 70 61 74 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e  (pathlist)+lemon
169e0 53 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29  Strlen(name)+2 )
169f0 3b 0a 20 20 20 20 69 66 28 20 28 70 61 74 68 62  ;.    if( (pathb
16a00 75 66 20 21 3d 20 30 29 20 26 26 20 28 70 61 74  uf != 0) && (pat
16a10 68 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 70  h!=0) ){.      p
16a20 61 74 68 62 75 66 70 74 72 20 3d 20 70 61 74 68  athbufptr = path
16a30 62 75 66 3b 0a 20 20 20 20 20 20 73 74 72 63 70  buf;.      strcp
16a40 79 28 70 61 74 68 62 75 66 2c 20 70 61 74 68 6c  y(pathbuf, pathl
16a50 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
16a60 65 28 20 2a 70 61 74 68 62 75 66 20 29 7b 0a 20  e( *pathbuf ){. 
16a70 20 20 20 20 20 20 20 63 70 20 3d 20 73 74 72 63         cp = strc
16a80 68 72 28 70 61 74 68 62 75 66 2c 27 3a 27 29 3b  hr(pathbuf,':');
16a90 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 70 3d  .        if( cp=
16aa0 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74 68 62  =0 ) cp = &pathb
16ab0 75 66 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70  uf[lemonStrlen(p
16ac0 61 74 68 62 75 66 29 5d 3b 0a 20 20 20 20 20 20  athbuf)];.      
16ad0 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20    c = *cp;.     
16ae0 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20     *cp = 0;.    
16af0 20 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 68      sprintf(path
16b00 2c 22 25 73 2f 25 73 22 2c 70 61 74 68 62 75 66  ,"%s/%s",pathbuf
16b10 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ,name);.        
16b20 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  *cp = c;.       
16b30 20 69 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68   if( c==0 ) path
16b40 62 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  buf[0] = 0;.    
16b50 20 20 20 20 65 6c 73 65 20 70 61 74 68 62 75 66      else pathbuf
16b60 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20   = &cp[1];.     
16b70 20 20 20 69 66 28 20 61 63 63 65 73 73 28 70 61     if( access(pa
16b80 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20  th,modemask)==0 
16b90 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
16ba0 0a 20 20 20 20 20 20 66 72 65 65 28 70 61 74 68  .      free(path
16bb0 62 75 66 70 74 72 29 3b 0a 20 20 20 20 7d 0a 20  bufptr);.    }. 
16bc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 61 74 68   }.  return path
16bd0 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20 61 6e  ;.}../* Given an
16be0 20 61 63 74 69 6f 6e 2c 20 63 6f 6d 70 75 74 65   action, compute
16bf0 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c   the integer val
16c00 75 65 20 66 6f 72 20 74 68 61 74 20 61 63 74 69  ue for that acti
16c10 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 74  on.** which is t
16c20 6f 20 62 65 20 70 75 74 20 69 6e 20 74 68 65 20  o be put in the 
16c30 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20  action table of 
16c40 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 6d 61  the generated ma
16c50 63 68 69 6e 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  chine..** Return
16c60 20 6e 65 67 61 74 69 76 65 20 69 66 20 6e 6f 20   negative if no 
16c70 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  action should be
16c80 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 50   generated..*/.P
16c90 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6d 70 75  RIVATE int compu
16ca0 74 65 5f 61 63 74 69 6f 6e 28 73 74 72 75 63 74  te_action(struct
16cb0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74   lemon *lemp, st
16cc0 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 29  ruct action *ap)
16cd0 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20  .{.  int act;.  
16ce0 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65  switch( ap->type
16cf0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49   ){.    case SHI
16d00 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78  FT:  act = ap->x
16d10 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 3b 20  .stp->statenum; 
16d20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
16d30 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43  ;.    case REDUC
16d40 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72  E: act = ap->x.r
16d50 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d  p->index + lemp-
16d60 3e 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a  >nstate; break;.
16d70 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20      case ERROR: 
16d80 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74   act = lemp->nst
16d90 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
16da0 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;     break;.  
16db0 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20 61    case ACCEPT: a
16dc0 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ct = lemp->nstat
16dd0 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20  e + lemp->nrule 
16de0 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  + 1; break;.    
16df0 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74  default:     act
16e00 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20   = -1; break;.  
16e10 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a  }.  return act;.
16e20 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53  }..#define LINES
16e30 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20  IZE 1000./* The 
16e40 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20  next cluster of 
16e50 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72  routines are for
16e60 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d   reading the tem
16e70 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  plate file.** an
16e80 64 20 77 72 69 74 69 6e 67 20 74 68 65 20 72 65  d writing the re
16e90 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e  sults to the gen
16ea0 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f  erated parser */
16eb0 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 75  ./* The first fu
16ec0 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73  nction transfers
16ed0 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20   data from "in" 
16ee0 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a  to "out" until.*
16ef0 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e  * a line is seen
16f00 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 77 69   which begins wi
16f10 74 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69  th "%%".  The li
16f20 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  ne number is.** 
16f30 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69  tracked..**.** i
16f40 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20  f name!=0, then 
16f50 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62 65  any word that be
16f60 67 69 6e 20 77 69 74 68 20 22 50 61 72 73 65 22  gin with "Parse"
16f70 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a   is changed to.*
16f80 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61  * begin with *na
16f90 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50  me instead..*/.P
16fa0 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
16fb0 5f 78 66 65 72 28 63 68 61 72 20 2a 6e 61 6d 65  _xfer(char *name
16fc0 2c 20 46 49 4c 45 20 2a 69 6e 2c 20 46 49 4c 45  , FILE *in, FILE
16fd0 20 2a 6f 75 74 2c 20 69 6e 74 20 2a 6c 69 6e 65   *out, int *line
16fe0 6e 6f 29 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 69  no).{.  int i, i
16ff0 53 74 61 72 74 3b 0a 20 20 63 68 61 72 20 6c 69  Start;.  char li
17000 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  ne[LINESIZE];.  
17010 77 68 69 6c 65 28 20 66 67 65 74 73 28 6c 69 6e  while( fgets(lin
17020 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 20 26  e,LINESIZE,in) &
17030 26 20 28 6c 69 6e 65 5b 30 5d 21 3d 27 25 27 20  & (line[0]!='%' 
17040 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27 25 27 29  || line[1]!='%')
17050 20 29 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f   ){.    (*lineno
17060 29 2b 2b 3b 0a 20 20 20 20 69 53 74 61 72 74 20  )++;.    iStart 
17070 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 61 6d  = 0;.    if( nam
17080 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  e ){.      for(i
17090 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b 2b  =0; line[i]; i++
170a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  ){.        if( l
170b0 69 6e 65 5b 69 5d 3d 3d 27 50 27 20 26 26 20 73  ine[i]=='P' && s
170c0 74 72 6e 63 6d 70 28 26 6c 69 6e 65 5b 69 5d 2c  trncmp(&line[i],
170d0 22 50 61 72 73 65 22 2c 35 29 3d 3d 30 0a 20 20  "Parse",5)==0.  
170e0 20 20 20 20 20 20 20 20 26 26 20 28 69 3d 3d 30          && (i==0
170f0 20 7c 7c 20 21 69 73 61 6c 70 68 61 28 6c 69 6e   || !isalpha(lin
17100 65 5b 69 2d 31 5d 29 29 0a 20 20 20 20 20 20 20  e[i-1])).       
17110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
17120 28 20 69 3e 69 53 74 61 72 74 20 29 20 66 70 72  ( i>iStart ) fpr
17130 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c  intf(out,"%.*s",
17140 69 2d 69 53 74 61 72 74 2c 26 6c 69 6e 65 5b 69  i-iStart,&line[i
17150 53 74 61 72 74 5d 29 3b 0a 20 20 20 20 20 20 20  Start]);.       
17160 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17170 25 73 22 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  %s",name);.     
17180 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
17190 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
171a0 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i+1;.        }. 
171b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
171c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73   fprintf(out,"%s
171d0 22 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29  ",&line[iStart])
171e0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65 20  ;.  }.}../* The 
171f0 6e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 66 69  next function fi
17200 6e 64 73 20 74 68 65 20 74 65 6d 70 6c 61 74 65  nds the template
17210 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 73 20   file and opens 
17220 69 74 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  it, returning.**
17230 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
17240 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 2e 20 2a  e opened file. *
17250 2f 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a  /.PRIVATE FILE *
17260 74 70 6c 74 5f 6f 70 65 6e 28 73 74 72 75 63 74  tplt_open(struct
17270 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a   lemon *lemp).{.
17280 20 20 73 74 61 74 69 63 20 63 68 61 72 20 74 65    static char te
17290 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22  mplatename[] = "
172a0 6c 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68 61  lempar.c";.  cha
172b0 72 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46  r buf[1000];.  F
172c0 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ILE *in;.  char 
172d0 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61  *tpltname;.  cha
172e0 72 20 2a 63 70 3b 0a 0a 20 20 2f 2a 20 66 69 72  r *cp;..  /* fir
172f0 73 74 2c 20 73 65 65 20 69 66 20 75 73 65 72 20  st, see if user 
17300 73 70 65 63 69 66 69 65 64 20 61 20 74 65 6d 70  specified a temp
17310 6c 61 74 65 20 66 69 6c 65 6e 61 6d 65 20 6f 6e  late filename on
17320 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
17330 65 2e 20 2a 2f 0a 20 20 69 66 20 28 75 73 65 72  e. */.  if (user
17340 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 21 3d  _templatename !=
17350 20 30 29 20 7b 0a 20 20 20 20 69 66 28 20 61 63   0) {.    if( ac
17360 63 65 73 73 28 75 73 65 72 5f 74 65 6d 70 6c 61  cess(user_templa
17370 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 2d 31 20  tename,004)==-1 
17380 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
17390 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66  (stderr,"Can't f
173a0 69 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64  ind the parser d
173b0 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66  river template f
173c0 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a  ile \"%s\".\n",.
173d0 20 20 20 20 20 20 20 20 75 73 65 72 5f 74 65 6d          user_tem
173e0 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20  platename);.    
173f0 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
17400 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
17410 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e   0;.    }.    in
17420 20 3d 20 66 6f 70 65 6e 28 75 73 65 72 5f 74 65   = fopen(user_te
17430 6d 70 6c 61 74 65 6e 61 6d 65 2c 22 72 62 22 29  mplatename,"rb")
17440 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30 20  ;.    if( in==0 
17450 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
17460 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f  (stderr,"Can't o
17470 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  pen the template
17480 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
17490 2c 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61  ,user_templatena
174a0 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  me);.      lemp-
174b0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
174c0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
174d0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e   }.    return in
174e0 3b 0a 20 20 7d 0a 0a 20 20 63 70 20 3d 20 73 74  ;.  }..  cp = st
174f0 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65  rrchr(lemp->file
17500 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28  name,'.');.  if(
17510 20 63 70 20 29 7b 0a 20 20 20 20 73 70 72 69 6e   cp ){.    sprin
17520 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e 6c 74 22  tf(buf,"%.*s.lt"
17530 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d 70 2d 3e  ,(int)(cp-lemp->
17540 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e  filename),lemp->
17550 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  filename);.  }el
17560 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  se{.    sprintf(
17570 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d 70  buf,"%s.lt",lemp
17580 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  ->filename);.  }
17590 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 62 75  .  if( access(bu
175a0 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20  f,004)==0 ){.   
175b0 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75 66 3b   tpltname = buf;
175c0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63 63  .  }else if( acc
175d0 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ess(templatename
175e0 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,004)==0 ){.    
175f0 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d 70 6c  tpltname = templ
17600 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  atename;.  }else
17610 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d  {.    tpltname =
17620 20 70 61 74 68 73 65 61 72 63 68 28 6c 65 6d 70   pathsearch(lemp
17630 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61 74 65  ->argv0,template
17640 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20 20 69  name,0);.  }.  i
17650 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30 20 29  f( tpltname==0 )
17660 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
17670 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64  derr,"Can't find
17680 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69 76   the parser driv
17690 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  er template file
176a0 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20   \"%s\".\n",.   
176b0 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a   templatename);.
176c0 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
176d0 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
176e0 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66   0;.  }.  in = f
176f0 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c 22 72  open(tpltname,"r
17700 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  b");.  if( in==0
17710 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
17720 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70  stderr,"Can't op
17730 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  en the template 
17740 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
17750 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20  templatename);. 
17760 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
17770 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t++;.    return 
17780 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
17790 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20  in;.}../* Print 
177a0 61 20 23 6c 69 6e 65 20 64 69 72 65 63 74 69 76  a #line directiv
177b0 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 6f 75  e line to the ou
177c0 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a 50 52  tput file. */.PR
177d0 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f  IVATE void tplt_
177e0 6c 69 6e 65 64 69 72 28 46 49 4c 45 20 2a 6f 75  linedir(FILE *ou
177f0 74 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63  t, int lineno, c
17800 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 29 0a 7b  har *filename).{
17810 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
17820 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69 6e  #line %d \"",lin
17830 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a  eno);.  while( *
17840 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20  filename ){.    
17850 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d  if( *filename ==
17860 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c 5c   '\\' ) putc('\\
17870 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74 63  ',out);.    putc
17880 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b  (*filename,out);
17890 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b  .    filename++;
178a0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
178b0 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f  ut,"\"\n");.}../
178c0 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e 67  * Print a string
178d0 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e 64   to the file and
178e0 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e 75   keep the linenu
178f0 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74 65 20  mber up to date 
17900 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
17910 74 70 6c 74 5f 70 72 69 6e 74 28 46 49 4c 45 20  tplt_print(FILE 
17920 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 6c 65 6d  *out, struct lem
17930 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68 61 72 20 2a  on *lemp, char *
17940 73 74 72 2c 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f  str, int *lineno
17950 29 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d 30  ).{.  if( str==0
17960 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
17970 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20 20 20  le( *str ){.    
17980 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b 0a  putc(*str,out);.
17990 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27 5c      if( *str=='\
179a0 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n' ) (*lineno)++
179b0 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d  ;.    str++;.  }
179c0 0a 20 20 69 66 28 20 73 74 72 5b 2d 31 5d 21 3d  .  if( str[-1]!=
179d0 27 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75 74 63  '\n' ){.    putc
179e0 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20 20 20  ('\n',out);.    
179f0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 7d  (*lineno)++;.  }
17a00 0a 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f  .  if (!lemp->no
17a10 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 0a 20  linenosflag) {. 
17a20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20     (*lineno)++; 
17a30 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74  tplt_linedir(out
17a40 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f  ,*lineno,lemp->o
17a50 75 74 6e 61 6d 65 29 3b 20 0a 20 20 7d 0a 20 20  utname); .  }.  
17a60 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
17a70 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
17a80 6f 75 74 69 6e 65 20 65 6d 69 74 73 20 63 6f 64  outine emits cod
17a90 65 20 66 6f 72 20 74 68 65 20 64 65 73 74 72 75  e for the destru
17aa0 63 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ctor for the.** 
17ab0 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69  symbol sp.*/.voi
17ac0 64 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f  d emit_destructo
17ad0 72 5f 63 6f 64 65 28 0a 20 20 46 49 4c 45 20 2a  r_code(.  FILE *
17ae0 6f 75 74 2c 0a 20 20 73 74 72 75 63 74 20 73 79  out,.  struct sy
17af0 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20 73 74 72 75  mbol *sp,.  stru
17b00 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a  ct lemon *lemp,.
17b10 20 20 69 6e 74 20 2a 6c 69 6e 65 6e 6f 0a 29 7b    int *lineno.){
17b20 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30 3b 0a  . char *cp = 0;.
17b30 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d  . if( sp->type==
17b40 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 63  TERMINAL ){.   c
17b50 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64  p = lemp->tokend
17b60 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d  est;.   if( cp==
17b70 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 66  0 ) return;.   f
17b80 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22  printf(out,"{\n"
17b90 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
17ba0 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 64   }else if( sp->d
17bb0 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
17bc0 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75 63  cp = sp->destruc
17bd0 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66 28  tor;.   fprintf(
17be0 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69  out,"{\n"); (*li
17bf0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20 28  neno)++;.   if (
17c00 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  !lemp->nolinenos
17c10 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f  flag) { (*lineno
17c20 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69  )++; tplt_linedi
17c30 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 4c 69  r(out,sp->destLi
17c40 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  neno,lemp->filen
17c50 61 6d 65 29 3b 20 7d 0a 20 7d 65 6c 73 65 20 69  ame); }. }else i
17c60 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74  f( lemp->vardest
17c70 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70   ){.   cp = lemp
17c80 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66  ->vardest;.   if
17c90 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( cp==0 ) return
17ca0 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  ;.   fprintf(out
17cb0 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  ,"{\n"); (*linen
17cc0 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20  o)++;. }else{.  
17cd0 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f   assert( 0 );  /
17ce0 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20  * Cannot happen 
17cf0 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70  */. }. for(; *cp
17d00 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20  ; cp++){.   if( 
17d10 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b 31  *cp=='$' && cp[1
17d20 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 66  ]=='$' ){.     f
17d30 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79 70  printf(out,"(yyp
17d40 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70  minor->yy%d)",sp
17d50 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63  ->dtnum);.     c
17d60 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e  p++;.     contin
17d70 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28 20  ue;.   }.   if( 
17d80 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69  *cp=='\n' ) (*li
17d90 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75 74  neno)++;.   fput
17da0 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20  c(*cp,out);. }. 
17db0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22  fprintf(out,"\n"
17dc0 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
17dd0 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if (!lemp->noli
17de0 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 0a 20 20  nenosflag) { .  
17df0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70   (*lineno)++; tp
17e00 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a  lt_linedir(out,*
17e10 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74  lineno,lemp->out
17e20 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20 66 70 72 69  name); . }. fpri
17e30 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20  ntf(out,"}\n"); 
17e40 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65  (*lineno)++;. re
17e50 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  turn;.}../*.** R
17e60 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
17e70 7a 65 72 6f 29 20 69 66 20 74 68 65 20 67 69 76  zero) if the giv
17e80 65 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20  en symbol has a 
17e90 64 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69  destructor..*/.i
17ea0 6e 74 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f  nt has_destructo
17eb0 72 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  r(struct symbol 
17ec0 2a 73 70 2c 20 73 74 72 75 63 74 20 6c 65 6d 6f  *sp, struct lemo
17ed0 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74  n *lemp).{.  int
17ee0 20 72 65 74 3b 0a 20 20 69 66 28 20 73 70 2d 3e   ret;.  if( sp->
17ef0 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29  type==TERMINAL )
17f00 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70  {.    ret = lemp
17f10 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b 0a  ->tokendest!=0;.
17f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
17f30 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74   = lemp->vardest
17f40 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72  !=0 || sp->destr
17f50 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20  uctor!=0;.  }.  
17f60 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
17f70 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74  *.** Append text
17f80 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   to a dynamicall
17f90 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74 72 69  y allocated stri
17fa0 6e 67 2e 20 20 49 66 20 7a 54 65 78 74 20 69 73  ng.  If zText is
17fb0 20 30 20 74 68 65 6e 0a 2a 2a 20 72 65 73 65 74   0 then.** reset
17fc0 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f 20 62   the string to b
17fd0 65 20 65 6d 70 74 79 20 61 67 61 69 6e 2e 20 20  e empty again.  
17fe0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
17ff0 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 0a  e complete text.
18000 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ** of the string
18010 20 28 77 68 69 63 68 20 69 73 20 6f 76 65 72 77   (which is overw
18020 72 69 74 74 65 6e 20 77 69 74 68 20 65 61 63 68  ritten with each
18030 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20   call)..**.** n 
18040 62 79 74 65 73 20 6f 66 20 7a 54 65 78 74 20 61  bytes of zText a
18050 72 65 20 73 74 6f 72 65 64 2e 20 20 49 66 20 6e  re stored.  If n
18060 3d 3d 30 20 74 68 65 6e 20 61 6c 6c 20 6f 66 20  ==0 then all of 
18070 7a 54 65 78 74 20 75 70 20 74 6f 20 74 68 65 20  zText up to the 
18080 66 69 72 73 74 0a 2a 2a 20 5c 30 30 30 20 74 65  first.** \000 te
18090 72 6d 69 6e 61 74 6f 72 20 69 73 20 73 74 6f 72  rminator is stor
180a0 65 64 2e 20 20 7a 54 65 78 74 20 63 61 6e 20 63  ed.  zText can c
180b0 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20 74 77 6f  ontain up to two
180c0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 0a 2a 2a   instances of.**
180d0 20 25 64 2e 20 20 54 68 65 20 76 61 6c 75 65 73   %d.  The values
180e0 20 6f 66 20 70 31 20 61 6e 64 20 70 32 20 61 72   of p1 and p2 ar
180f0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
18100 68 65 20 66 69 72 73 74 20 61 6e 64 20 73 65 63  he first and sec
18110 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a  ond.** %d..**.**
18120 20 49 66 20 6e 3d 3d 2d 31 2c 20 74 68 65 6e 20   If n==-1, then 
18130 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 68 61  the previous cha
18140 72 61 63 74 65 72 20 69 73 20 6f 76 65 72 77 72  racter is overwr
18150 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  itten..*/.PRIVAT
18160 45 20 63 68 61 72 20 2a 61 70 70 65 6e 64 5f 73  E char *append_s
18170 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  tr(const char *z
18180 54 65 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e 74  Text, int n, int
18190 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20   p1, int p2){.  
181a0 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 70 74  static char empt
181b0 79 5b 31 5d 20 3d 20 7b 20 30 20 7d 3b 0a 20 20  y[1] = { 0 };.  
181c0 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 20 3d  static char *z =
181d0 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
181e0 20 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20   alloced = 0;.  
181f0 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 20  static int used 
18200 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  = 0;.  int c;.  
18210 63 68 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a 20  char zInt[40];. 
18220 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b   if( zText==0 ){
18230 0a 20 20 20 20 75 73 65 64 20 3d 20 30 3b 0a 20  .    used = 0;. 
18240 20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20 20 7d     return z;.  }
18250 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b 0a 20  .  if( n<=0 ){. 
18260 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20     if( n<0 ){.  
18270 20 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b 0a 20      used += n;. 
18280 20 20 20 20 20 61 73 73 65 72 74 28 20 75 73 65       assert( use
18290 64 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d>=0 );.    }.  
182a0 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65    n = lemonStrle
182b0 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a 20 20  n(zText);.  }.  
182c0 69 66 28 20 6e 2b 73 69 7a 65 6f 66 28 7a 49 6e  if( n+sizeof(zIn
182d0 74 29 2a 32 2b 75 73 65 64 20 3e 3d 20 61 6c 6c  t)*2+used >= all
182e0 6f 63 65 64 20 29 7b 0a 20 20 20 20 61 6c 6c 6f  oced ){.    allo
182f0 63 65 64 20 3d 20 6e 20 2b 20 73 69 7a 65 6f 66  ced = n + sizeof
18300 28 7a 49 6e 74 29 2a 32 20 2b 20 75 73 65 64 20  (zInt)*2 + used 
18310 2b 20 32 30 30 3b 0a 20 20 20 20 7a 20 3d 20 28  + 200;.    z = (
18320 63 68 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63 28  char *) realloc(
18330 7a 2c 20 20 61 6c 6c 6f 63 65 64 29 3b 0a 20 20  z,  alloced);.  
18340 7d 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  }.  if( z==0 ) r
18350 65 74 75 72 6e 20 65 6d 70 74 79 3b 0a 20 20 77  eturn empty;.  w
18360 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
18370 0a 20 20 20 20 63 20 3d 20 2a 28 7a 54 65 78 74  .    c = *(zText
18380 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ++);.    if( c==
18390 27 25 27 20 26 26 20 6e 3e 30 20 26 26 20 7a 54  '%' && n>0 && zT
183a0 65 78 74 5b 30 5d 3d 3d 27 64 27 20 29 7b 0a 20  ext[0]=='d' ){. 
183b0 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 49 6e       sprintf(zIn
183c0 74 2c 20 22 25 64 22 2c 20 70 31 29 3b 0a 20 20  t, "%d", p1);.  
183d0 20 20 20 20 70 31 20 3d 20 70 32 3b 0a 20 20 20      p1 = p2;.   
183e0 20 20 20 73 74 72 63 70 79 28 26 7a 5b 75 73 65     strcpy(&z[use
183f0 64 5d 2c 20 7a 49 6e 74 29 3b 0a 20 20 20 20 20  d], zInt);.     
18400 20 75 73 65 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74   used += lemonSt
18410 72 6c 65 6e 28 26 7a 5b 75 73 65 64 5d 29 3b 0a  rlen(&z[used]);.
18420 20 20 20 20 20 20 7a 54 65 78 74 2b 2b 3b 0a 20        zText++;. 
18430 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65       n--;.    }e
18440 6c 73 65 7b 0a 20 20 20 20 20 20 7a 5b 75 73 65  lse{.      z[use
18450 64 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  d++] = c;.    }.
18460 20 20 7d 0a 20 20 7a 5b 75 73 65 64 5d 20 3d 20    }.  z[used] = 
18470 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  0;.  return z;.}
18480 0a 0a 2f 2a 0a 2a 2a 20 7a 43 6f 64 65 20 69 73  ../*.** zCode is
18490 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
184a0 73 20 74 68 65 20 61 63 74 69 6f 6e 20 61 73 73  s the action ass
184b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 72  ociated with a r
184c0 75 6c 65 2e 20 20 45 78 70 61 6e 64 0a 2a 2a 20  ule.  Expand.** 
184d0 74 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74  the symbols in t
184e0 68 69 73 20 73 74 72 69 6e 67 20 73 6f 20 74 68  his string so th
184f0 61 74 20 74 68 65 20 72 65 66 65 72 20 74 6f 20  at the refer to 
18500 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
18510 70 61 72 73 65 72 0a 2a 2a 20 73 74 61 63 6b 2e  parser.** stack.
18520 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
18530 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28   translate_code(
18540 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
18550 6d 70 2c 20 73 74 72 75 63 74 20 72 75 6c 65 20  mp, struct rule 
18560 2a 72 70 29 7b 0a 20 20 63 68 61 72 20 2a 63 70  *rp){.  char *cp
18570 2c 20 2a 78 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  , *xp;.  int i;.
18580 20 20 63 68 61 72 20 6c 68 73 75 73 65 64 20 3d    char lhsused =
18590 20 30 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69   0;    /* True i
185a0 66 20 74 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e  f the LHS elemen
185b0 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20  t has been used 
185c0 2a 2f 0a 20 20 63 68 61 72 20 75 73 65 64 5b 4d  */.  char used[M
185d0 41 58 52 48 53 5d 3b 20 20 20 2f 2a 20 54 72 75  AXRHS];   /* Tru
185e0 65 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 65  e for each RHS e
185f0 6c 65 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  lement which is 
18600 75 73 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  used */..  for(i
18610 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
18620 69 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20 30  i++) used[i] = 0
18630 3b 0a 20 20 6c 68 73 75 73 65 64 20 3d 20 30 3b  ;.  lhsused = 0;
18640 0a 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  ..  if( rp->code
18650 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
18660 63 20 63 68 61 72 20 6e 65 77 6c 69 6e 65 73 74  c char newlinest
18670 72 5b 32 5d 20 3d 20 7b 20 27 5c 6e 27 2c 20 27  r[2] = { '\n', '
18680 5c 30 27 20 7d 3b 0a 20 20 20 20 72 70 2d 3e 63  \0' };.    rp->c
18690 6f 64 65 20 3d 20 6e 65 77 6c 69 6e 65 73 74 72  ode = newlinestr
186a0 3b 0a 20 20 20 20 72 70 2d 3e 6c 69 6e 65 20 3d  ;.    rp->line =
186b0 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20   rp->ruleline;. 
186c0 20 7d 0a 0a 20 20 61 70 70 65 6e 64 5f 73 74 72   }..  append_str
186d0 28 30 2c 30 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a  (0,0,0,0);..  /*
186e0 20 54 68 69 73 20 63 6f 6e 73 74 20 63 61 73 74   This const cast
186f0 20 69 73 20 77 72 6f 6e 67 20 62 75 74 20 68 61   is wrong but ha
18700 72 6d 6c 65 73 73 2c 20 69 66 20 77 65 27 72 65  rmless, if we're
18710 20 63 61 72 65 66 75 6c 2e 20 2a 2f 0a 20 20 66   careful. */.  f
18720 6f 72 28 63 70 3d 28 63 68 61 72 20 2a 29 72 70  or(cp=(char *)rp
18730 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b  ->code; *cp; cp+
18740 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 73 61 6c  +){.    if( isal
18750 70 68 61 28 2a 63 70 29 20 26 26 20 28 63 70 3d  pha(*cp) && (cp=
18760 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20 28 21 69  =rp->code || (!i
18770 73 61 6c 6e 75 6d 28 63 70 5b 2d 31 5d 29 20 26  salnum(cp[-1]) &
18780 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27 29 29 20  & cp[-1]!='_')) 
18790 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 73 61  ){.      char sa
187a0 76 65 64 3b 0a 20 20 20 20 20 20 66 6f 72 28 78  ved;.      for(x
187b0 70 3d 20 26 63 70 5b 31 5d 3b 20 69 73 61 6c 6e  p= &cp[1]; isaln
187c0 75 6d 28 2a 78 70 29 20 7c 7c 20 2a 78 70 3d 3d  um(*xp) || *xp==
187d0 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a 20 20 20 20  '_'; xp++);.    
187e0 20 20 73 61 76 65 64 20 3d 20 2a 78 70 3b 0a 20    saved = *xp;. 
187f0 20 20 20 20 20 2a 78 70 20 3d 20 30 3b 0a 20 20       *xp = 0;.  
18800 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
18810 6c 69 61 73 20 26 26 20 73 74 72 63 6d 70 28 63  lias && strcmp(c
18820 70 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3d  p,rp->lhsalias)=
18830 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
18840 70 65 6e 64 5f 73 74 72 28 22 79 79 67 6f 74 6f  pend_str("yygoto
18850 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 72 70  minor.yy%d",0,rp
18860 2d 3e 6c 68 73 2d 3e 64 74 6e 75 6d 2c 30 29 3b  ->lhs->dtnum,0);
18870 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70  .        cp = xp
18880 3b 0a 20 20 20 20 20 20 20 20 6c 68 73 75 73 65  ;.        lhsuse
18890 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  d = 1;.      }el
188a0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
188b0 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
188c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
188d0 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61   if( rp->rhsalia
188e0 73 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 63  s[i] && strcmp(c
188f0 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  p,rp->rhsalias[i
18900 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])==0 ){.       
18910 20 20 20 20 20 69 66 28 20 63 70 21 3d 72 70 2d       if( cp!=rp-
18920 3e 63 6f 64 65 20 26 26 20 63 70 5b 2d 31 5d 3d  >code && cp[-1]=
18930 3d 27 40 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='@' ){.        
18940 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
18950 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 66 20 74  argument is of t
18960 68 65 20 66 6f 72 6d 20 40 58 20 74 68 65 6e 20  he form @X then 
18970 73 75 62 73 74 69 74 75 74 65 64 0a 20 20 20 20  substituted.    
18980 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
18990 20 74 6f 6b 65 6e 20 6e 75 6d 62 65 72 20 6f 66   token number of
189a0 20 58 2c 20 6e 6f 74 20 74 68 65 20 76 61 6c 75   X, not the valu
189b0 65 20 6f 66 20 58 20 2a 2f 0a 20 20 20 20 20 20  e of X */.      
189c0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73          append_s
189d0 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 61  tr("yymsp[%d].ma
189e0 6a 6f 72 22 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72  jor",-1,i-rp->nr
189f0 68 73 2b 31 2c 30 29 3b 0a 20 20 20 20 20 20 20  hs+1,0);.       
18a00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18a10 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
18a20 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70   symbol *sp = rp
18a30 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
18a40 20 20 20 20 20 20 20 20 69 6e 74 20 64 74 6e 75          int dtnu
18a50 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m;.             
18a60 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
18a70 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
18a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a90 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 73 75 62 73  dtnum = sp->subs
18aa0 79 6d 5b 30 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20  ym[0]->dtnum;.  
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
18ac0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
18ad0 20 20 20 64 74 6e 75 6d 20 3d 20 73 70 2d 3e 64     dtnum = sp->d
18ae0 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
18af0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18b00 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
18b10 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e  yymsp[%d].minor.
18b20 79 79 25 64 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72  yy%d",0,i-rp->nr
18b30 68 73 2b 31 2c 20 64 74 6e 75 6d 29 3b 0a 20 20  hs+1, dtnum);.  
18b40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18b50 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b          cp = xp;
18b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65  .            use
18b70 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20  d[i] = 1;.      
18b80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18ba0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
18bb0 20 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a 20 20   *xp = saved;.  
18bc0 20 20 7d 0a 20 20 20 20 61 70 70 65 6e 64 5f 73    }.    append_s
18bd0 74 72 28 63 70 2c 20 31 2c 20 30 2c 20 30 29 3b  tr(cp, 1, 0, 0);
18be0 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70  .  } /* End loop
18bf0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
18c00 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
18c10 20 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75 73   LHS has been us
18c20 65 64 20 2a 2f 0a 20 20 69 66 28 20 72 70 2d 3e  ed */.  if( rp->
18c30 6c 68 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73  lhsalias && !lhs
18c40 75 73 65 64 20 29 7b 0a 20 20 20 20 45 72 72 6f  used ){.    Erro
18c50 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
18c60 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  ame,rp->ruleline
18c70 2c 0a 20 20 20 20 20 20 22 4c 61 62 65 6c 20 5c  ,.      "Label \
18c80 22 25 73 5c 22 20 66 6f 72 20 5c 22 25 73 28 25  "%s\" for \"%s(%
18c90 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73  s)\" is never us
18ca0 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72 70  ed.",.        rp
18cb0 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c  ->lhsalias,rp->l
18cc0 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73  hs->name,rp->lhs
18cd0 61 6c 69 61 73 29 3b 0a 20 20 20 20 6c 65 6d 70  alias);.    lemp
18ce0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
18cf0 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
18d00 20 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65   destructor code
18d10 20 66 6f 72 20 52 48 53 20 73 79 6d 62 6f 6c 73   for RHS symbols
18d20 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75   which are not u
18d30 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  sed in the.  ** 
18d40 72 65 64 75 63 65 20 63 6f 64 65 20 2a 2f 0a 20  reduce code */. 
18d50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
18d60 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
18d70 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
18d80 5b 69 5d 20 26 26 20 21 75 73 65 64 5b 69 5d 20  [i] && !used[i] 
18d90 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73  ){.      ErrorMs
18da0 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
18db0 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20  ,rp->ruleline,. 
18dc0 20 20 20 20 20 20 20 22 4c 61 62 65 6c 20 25 73         "Label %s
18dd0 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20   for \"%s(%s)\" 
18de0 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c  is never used.",
18df0 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73  .        rp->rhs
18e00 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e 72 68 73  alias[i],rp->rhs
18e10 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68  [i]->name,rp->rh
18e20 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20 20 20  salias[i]);.    
18e30 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
18e40 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
18e50 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ( rp->rhsalias[i
18e60 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
18e70 28 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72  ( has_destructor
18e80 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70  (rp->rhs[i],lemp
18e90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  ) ){.        app
18ea0 65 6e 64 5f 73 74 72 28 22 20 20 79 79 5f 64 65  end_str("  yy_de
18eb0 73 74 72 75 63 74 6f 72 28 79 79 70 50 61 72 73  structor(yypPars
18ec0 65 72 2c 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d  er,%d,&yymsp[%d]
18ed0 2e 6d 69 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a  .minor);\n", 0,.
18ee0 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72             rp->r
18ef0 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72  hs[i]->index,i-r
18f00 70 2d 3e 6e 72 68 73 2b 31 29 3b 0a 20 20 20 20  p->nrhs+1);.    
18f10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18f20 20 2f 2a 20 4e 6f 20 64 65 73 74 72 75 63 74 6f   /* No destructo
18f30 72 20 64 65 66 69 6e 65 64 20 66 6f 72 20 74 68  r defined for th
18f40 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20  is term */.     
18f50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
18f60 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20  f( rp->code ){. 
18f70 20 20 20 63 70 20 3d 20 61 70 70 65 6e 64 5f 73     cp = append_s
18f80 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  tr(0,0,0,0);.   
18f90 20 72 70 2d 3e 63 6f 64 65 20 3d 20 53 74 72 73   rp->code = Strs
18fa0 61 66 65 28 63 70 3f 63 70 3a 22 22 29 3b 0a 20  afe(cp?cp:"");. 
18fb0 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e   }.}../* .** Gen
18fc0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
18fd0 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74   executes when t
18fe0 68 65 20 72 75 6c 65 20 22 72 70 22 20 69 73 20  he rule "rp" is 
18ff0 72 65 64 75 63 65 64 2e 20 20 57 72 69 74 65 0a  reduced.  Write.
19000 2a 2a 20 74 68 65 20 63 6f 64 65 20 74 6f 20 22  ** the code to "
19010 6f 75 74 22 2e 20 20 4d 61 6b 65 20 73 75 72 65  out".  Make sure
19020 20 6c 69 6e 65 6e 6f 20 73 74 61 79 73 20 75 70   lineno stays up
19030 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49  -to-date..*/.PRI
19040 56 41 54 45 20 76 6f 69 64 20 65 6d 69 74 5f 63  VATE void emit_c
19050 6f 64 65 28 0a 20 20 46 49 4c 45 20 2a 6f 75 74  ode(.  FILE *out
19060 2c 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ,.  struct rule 
19070 2a 72 70 2c 0a 20 20 73 74 72 75 63 74 20 6c 65  *rp,.  struct le
19080 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74  mon *lemp,.  int
19090 20 2a 6c 69 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e   *lineno.){. con
190a0 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f  st char *cp;.. /
190b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
190c0 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63 65  to do the reduce
190d0 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20   action */. if( 
190e0 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69  rp->code ){.   i
190f0 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65  f (!lemp->noline
19100 6e 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e  nosflag) { (*lin
19110 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e  eno)++; tplt_lin
19120 65 64 69 72 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e  edir(out,rp->lin
19130 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  e,lemp->filename
19140 29 3b 20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28  ); }.   fprintf(
19150 6f 75 74 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f  out,"{%s",rp->co
19160 64 65 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72  de);.   for(cp=r
19170 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70  p->code; *cp; cp
19180 2b 2b 29 7b 0a 20 20 20 20 20 69 66 28 20 2a 63  ++){.     if( *c
19190 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65  p=='\n' ) (*line
191a0 6e 6f 29 2b 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45  no)++;.   } /* E
191b0 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 66 70  nd loop */.   fp
191c0 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29  rintf(out,"}\n")
191d0 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ; (*lineno)++;. 
191e0 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c    if (!lemp->nol
191f0 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 28 2a  inenosflag) { (*
19200 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f  lineno)++; tplt_
19210 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e  linedir(out,*lin
19220 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  eno,lemp->outnam
19230 65 29 3b 20 7d 0a 20 7d 20 2f 2a 20 45 6e 64 20  e); }. } /* End 
19240 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 2a  if( rp->code ) *
19250 2f 0a 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  /.. return;.}../
19260 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 64  *.** Print the d
19270 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65  efinition of the
19280 20 75 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72 20   union used for 
19290 74 68 65 20 70 61 72 73 65 72 27 73 20 64 61 74  the parser's dat
192a0 61 20 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  a stack..** This
192b0 20 75 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20   union contains 
192c0 66 69 65 6c 64 73 20 66 6f 72 20 65 76 65 72 79  fields for every
192d0 20 70 6f 73 73 69 62 6c 65 20 64 61 74 61 20 74   possible data t
192e0 79 70 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a  ype for tokens.*
192f0 2a 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61  * and nontermina
19300 6c 73 2e 20 20 49 6e 20 74 68 65 20 70 72 6f 63  ls.  In the proc
19310 65 73 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67  ess of computing
19320 20 61 6e 64 20 70 72 69 6e 74 69 6e 67 20 74 68   and printing th
19330 69 73 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73  is.** union, als
19340 6f 20 73 65 74 20 74 68 65 20 22 2e 64 74 6e 75  o set the ".dtnu
19350 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  m" field of ever
19360 79 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e  y terminal and n
19370 6f 6e 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79  onterminal.** sy
19380 6d 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72  mbol..*/.void pr
19390 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28  int_stack_union(
193a0 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 20 20  .  FILE *out,   
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
193c0 2a 20 54 68 65 20 6f 75 74 70 75 74 20 73 74 72  * The output str
193d0 65 61 6d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  eam */.  struct 
193e0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 20 20 20  lemon *lemp,    
193f0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
19400 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20   info structure 
19410 66 6f 72 20 74 68 69 73 20 70 61 72 73 65 72 20  for this parser 
19420 2a 2f 0a 20 20 69 6e 74 20 2a 70 6c 69 6e 65 6e  */.  int *plinen
19430 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
19440 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
19450 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  he line number *
19460 2f 0a 20 20 69 6e 74 20 6d 68 66 6c 61 67 20 20  /.  int mhflag  
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19480 2f 2a 20 54 72 75 65 20 69 66 20 67 65 6e 65 72  /* True if gener
19490 61 74 69 6e 67 20 6d 61 6b 65 68 65 61 64 65 72  ating makeheader
194a0 73 20 6f 75 74 70 75 74 20 2a 2f 0a 29 7b 0a 20  s output */.){. 
194b0 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70   int lineno = *p
194c0 6c 69 6e 65 6e 6f 3b 20 20 20 20 2f 2a 20 54 68  lineno;    /* Th
194d0 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66  e line number of
194e0 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20   the output */. 
194f0 20 63 68 61 72 20 2a 2a 74 79 70 65 73 3b 20 20   char **types;  
19500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
19510 68 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61  hash table of da
19520 74 61 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74  tatypes */.  int
19530 20 61 72 72 61 79 73 69 7a 65 3b 20 20 20 20 20   arraysize;     
19540 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
19550 66 20 74 68 65 20 22 74 79 70 65 73 22 20 61 72  f the "types" ar
19560 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  ray */.  int max
19570 64 74 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20  dtlength;       
19580 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65     /* Maximum le
19590 6e 67 74 68 20 6f 66 20 61 6e 79 20 22 2e 64 61  ngth of any ".da
195a0 74 61 74 79 70 65 22 20 66 69 65 6c 64 2e 20 2a  tatype" field. *
195b0 2f 0a 20 20 63 68 61 72 20 2a 73 74 64 64 74 3b  /.  char *stddt;
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
195d0 20 53 74 61 6e 64 61 72 64 69 7a 65 64 20 6e 61   Standardized na
195e0 6d 65 20 66 6f 72 20 61 20 64 61 74 61 74 79 70  me for a datatyp
195f0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b 20  e */.  int i,j; 
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
19620 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 68 3b  s */.  int hash;
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19640 20 2f 2a 20 46 6f 72 20 68 61 73 68 69 6e 67 20   /* For hashing 
19650 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 79  the name of a ty
19660 70 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  pe */.  const ch
19670 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
19680 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
19690 20 70 61 72 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a   parser */..  /*
196a0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
196b0 69 74 69 61 6c 69 7a 65 20 74 79 70 65 73 5b 5d  itialize types[]
196c0 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 74   and allocate st
196d0 64 64 74 5b 5d 20 2a 2f 0a 20 20 61 72 72 61 79  ddt[] */.  array
196e0 73 69 7a 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79  size = lemp->nsy
196f0 6d 62 6f 6c 20 2a 20 32 3b 0a 20 20 74 79 70 65  mbol * 2;.  type
19700 73 20 3d 20 28 63 68 61 72 2a 2a 29 63 61 6c 6c  s = (char**)call
19710 6f 63 28 20 61 72 72 61 79 73 69 7a 65 2c 20 73  oc( arraysize, s
19720 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a  izeof(char*) );.
19730 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
19740 61 79 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70  aysize; i++) typ
19750 65 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78  es[i] = 0;.  max
19760 64 74 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20  dtlength = 0;.  
19770 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70  if( lemp->vartyp
19780 65 20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65  e ){.    maxdtle
19790 6e 67 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  ngth = lemonStrl
197a0 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  en(lemp->vartype
197b0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
197c0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
197d0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
197e0 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74   len;.    struct
197f0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
19800 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
19810 20 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61      if( sp->data
19820 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  type==0 ) contin
19830 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65  ue;.    len = le
19840 6d 6f 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61  monStrlen(sp->da
19850 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  tatype);.    if(
19860 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68   len>maxdtlength
19870 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d   ) maxdtlength =
19880 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64   len;.  }.  stdd
19890 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  t = (char*)mallo
198a0 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32  c( maxdtlength*2
198b0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 74 79   + 1 );.  if( ty
198c0 70 65 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d  pes==0 || stddt=
198d0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
198e0 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66  f(stderr,"Out of
198f0 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20   memory.\n");.  
19900 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a    exit(1);.  }..
19910 20 20 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73    /* Build a has
19920 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74  h table of datat
19930 79 70 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75  ypes. The ".dtnu
19940 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68  m" field of each
19950 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20   symbol.  ** is 
19960 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74  filled in with t
19970 68 65 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c  he hash index pl
19980 75 73 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d  us 1.  A ".dtnum
19990 22 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a  " value of 0 is.
199a0 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65    ** used for te
199b0 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20  rminal symbols. 
199c0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
199d0 25 64 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65  %default_type de
199e0 66 69 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20  fined then.  ** 
199f0 30 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61  0 is also used a
19a00 73 20 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c  s the .dtnum val
19a10 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e  ue for nontermin
19a20 61 6c 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74  als which do not
19a30 20 73 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20   specify.  ** a 
19a40 64 61 74 61 74 79 70 65 20 75 73 69 6e 67 20 74  datatype using t
19a50 68 65 20 25 74 79 70 65 20 64 69 72 65 63 74 69  he %type directi
19a60 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ve..  */.  for(i
19a70 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
19a80 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
19a90 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
19aa0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
19ab0 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  [i];.    char *c
19ac0 70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c  p;.    if( sp==l
19ad0 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20  emp->errsym ){. 
19ae0 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
19af0 20 61 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20   arraysize+1;.  
19b00 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
19b10 20 20 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e    }.    if( sp->
19b20 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type!=NONTERMINA
19b30 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79  L || (sp->dataty
19b40 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76  pe==0 && lemp->v
19b50 61 72 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20  artype==0) ){.  
19b60 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
19b70 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
19b80 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20  e;.    }.    cp 
19b90 3d 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a  = sp->datatype;.
19ba0 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20      if( cp==0 ) 
19bb0 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79  cp = lemp->varty
19bc0 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20  pe;.    j = 0;. 
19bd0 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
19be0 65 28 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20  e(*cp) ) cp++;. 
19bf0 20 20 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20     while( *cp ) 
19c00 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70  stddt[j++] = *cp
19c10 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a  ++;.    while( j
19c20 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 73 74  >0 && isspace(st
19c30 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b  ddt[j-1]) ) j--;
19c40 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20  .    stddt[j] = 
19c50 30 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  0;.    if( lemp-
19c60 3e 74 6f 6b 65 6e 74 79 70 65 20 26 26 20 73 74  >tokentype && st
19c70 72 63 6d 70 28 73 74 64 64 74 2c 20 6c 65 6d 70  rcmp(stddt, lemp
19c80 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3d 3d 30 20  ->tokentype)==0 
19c90 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e  ){.      sp->dtn
19ca0 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  um = 0;.      co
19cb0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
19cc0 20 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20    hash = 0;.    
19cd0 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b 6a  for(j=0; stddt[j
19ce0 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 68  ]; j++){.      h
19cf0 61 73 68 20 3d 20 68 61 73 68 2a 35 33 20 2b 20  ash = hash*53 + 
19d00 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a  stddt[j];.    }.
19d10 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
19d20 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 61   & 0x7fffffff)%a
19d30 72 72 61 79 73 69 7a 65 3b 0a 20 20 20 20 77 68  rraysize;.    wh
19d40 69 6c 65 28 20 74 79 70 65 73 5b 68 61 73 68 5d  ile( types[hash]
19d50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
19d60 72 63 6d 70 28 74 79 70 65 73 5b 68 61 73 68 5d  rcmp(types[hash]
19d70 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20 20  ,stddt)==0 ){.  
19d80 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
19d90 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20  = hash + 1;.    
19da0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19db0 20 7d 0a 20 20 20 20 20 20 68 61 73 68 2b 2b 3b   }.      hash++;
19dc0 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 68 3e  .      if( hash>
19dd0 3d 61 72 72 61 79 73 69 7a 65 20 29 20 68 61 73  =arraysize ) has
19de0 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  h = 0;.    }.   
19df0 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d   if( types[hash]
19e00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d  ==0 ){.      sp-
19e10 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20  >dtnum = hash + 
19e20 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73 5b 68  1;.      types[h
19e30 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61  ash] = (char*)ma
19e40 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65  lloc( lemonStrle
19e50 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20  n(stddt)+1 );.  
19e60 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61      if( types[ha
19e70 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sh]==0 ){.      
19e80 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
19e90 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
19ea0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78  \n");.        ex
19eb0 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  it(1);.      }. 
19ec0 20 20 20 20 20 73 74 72 63 70 79 28 74 79 70 65       strcpy(type
19ed0 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a  s[hash],stddt);.
19ee0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19ef0 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20 64 65  Print out the de
19f00 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f  finition of YYTO
19f10 4b 45 4e 54 59 50 45 20 61 6e 64 20 59 59 4d 49  KENTYPE and YYMI
19f20 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d  NORTYPE */.  nam
19f30 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f  e = lemp->name ?
19f40 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50   lemp->name : "P
19f50 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20  arse";.  lineno 
19f60 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66  = *plineno;.  if
19f70 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69  ( mhflag ){ fpri
19f80 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54  ntf(out,"#if INT
19f90 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65  ERFACE\n"); line
19fa0 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74  no++; }.  fprint
19fb0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
19fc0 73 54 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22  sTOKENTYPE %s\n"
19fd0 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d  ,name,.    lemp-
19fe0 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d  >tokentype?lemp-
19ff0 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64  >tokentype:"void
1a000 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  *");  lineno++;.
1a010 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20    if( mhflag ){ 
1a020 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
1a030 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
1a040 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  +; }.  fprintf(o
1a050 75 74 2c 22 74 79 70 65 64 65 66 20 75 6e 69 6f  ut,"typedef unio
1a060 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  n {\n"); lineno+
1a070 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1a080 2c 22 20 20 69 6e 74 20 79 79 69 6e 69 74 3b 5c  ,"  int yyinit;\
1a090 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1a0a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1a0b0 25 73 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b  %sTOKENTYPE yy0;
1a0c0 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
1a0d0 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  o++;.  for(i=0; 
1a0e0 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b  i<arraysize; i++
1a0f0 29 7b 0a 20 20 20 20 69 66 28 20 74 79 70 65 73  ){.    if( types
1a100 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
1a110 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e;.    fprintf(o
1a120 75 74 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e  ut,"  %s yy%d;\n
1a130 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b  ",types[i],i+1);
1a140 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1a150 72 65 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20  ree(types[i]);. 
1a160 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65   }.  if( lemp->e
1a170 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b  rrsym->useCnt ){
1a180 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a190 2c 22 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22  ,"  int yy%d;\n"
1a1a0 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64  ,lemp->errsym->d
1a1b0 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  tnum); lineno++;
1a1c0 0a 20 20 7d 0a 20 20 66 72 65 65 28 73 74 64 64  .  }.  free(stdd
1a1d0 74 29 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73  t);.  free(types
1a1e0 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
1a1f0 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b  ,"} YYMINORTYPE;
1a200 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1a210 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e    *plineno = lin
1a220 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eno;.}../*.** Re
1a230 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
1a240 20 61 20 43 20 64 61 74 61 74 79 70 65 20 61 62   a C datatype ab
1a250 6c 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  le to represent 
1a260 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 0a 2a  values between.*
1a270 2a 20 6c 77 72 20 61 6e 64 20 75 70 72 2c 20 69  * lwr and upr, i
1a280 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61  nclusive..*/.sta
1a290 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1a2a0 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1a2b0 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75  e(int lwr, int u
1a2c0 70 72 29 7b 0a 20 20 69 66 28 20 6c 77 72 3e 3d  pr){.  if( lwr>=
1a2d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75 70 72  0 ){.    if( upr
1a2e0 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20 20 20 72  <=255 ){.      r
1a2f0 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20  eturn "unsigned 
1a300 63 68 61 72 22 3b 0a 20 20 20 20 7d 65 6c 73 65  char";.    }else
1a310 20 69 66 28 20 75 70 72 3c 36 35 35 33 35 20 29   if( upr<65535 )
1a320 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  {.      return "
1a330 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69  unsigned short i
1a340 6e 74 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nt";.    }else{.
1a350 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e        return "un
1a360 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20  signed int";.   
1a370 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c   }.  }else if( l
1a380 77 72 3e 3d 2d 31 32 37 20 26 26 20 75 70 72 3c  wr>=-127 && upr<
1a390 3d 31 32 37 20 29 7b 0a 20 20 20 20 72 65 74 75  =127 ){.    retu
1a3a0 72 6e 20 22 73 69 67 6e 65 64 20 63 68 61 72 22  rn "signed char"
1a3b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77  ;.  }else if( lw
1a3c0 72 3e 3d 2d 33 32 37 36 37 20 26 26 20 75 70 72  r>=-32767 && upr
1a3d0 3c 33 32 37 36 37 20 29 7b 0a 20 20 20 20 72 65  <32767 ){.    re
1a3e0 74 75 72 6e 20 22 73 68 6f 72 74 22 3b 0a 20 20  turn "short";.  
1a3f0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
1a400 6e 20 22 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a  n "int";.  }.}..
1a410 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61 74 65  /*.** Each state
1a420 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 74 20   contains a set 
1a430 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63  of token transac
1a440 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 74 20 6f  tion and a set o
1a450 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  f.** nonterminal
1a460 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20   transactions.  
1a470 45 61 63 68 20 6f 66 20 74 68 65 73 65 20 73 65  Each of these se
1a480 74 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74  ts makes an inst
1a490 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ance.** of the f
1a4a0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1a4b0 72 65 2e 20 20 41 6e 20 61 72 72 61 79 20 6f 66  re.  An array of
1a4c0 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
1a4d0 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20  s is used.** to 
1a4e0 6f 72 64 65 72 20 74 68 65 20 63 72 65 61 74 69  order the creati
1a4f0 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  on of entries in
1a500 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
1a510 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
1a520 74 20 61 78 73 65 74 20 7b 0a 20 20 73 74 72 75  t axset {.  stru
1a530 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
1a540 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f   /* A pointer to
1a550 20 61 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e   a state */.  in
1a560 74 20 69 73 54 6b 6e 3b 20 20 20 20 20 20 20 20  t isTkn;        
1a570 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
1a580 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65  e tokens.  False
1a590 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61   for non-termina
1a5a0 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74  ls */.  int nAct
1a5b0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ion;         /* 
1a5c0 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e  Number of action
1a5d0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 72 64 65  s */.  int iOrde
1a5e0 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  r;          /* O
1a5f0 72 69 67 69 6e 61 6c 20 6f 72 64 65 72 20 6f 66  riginal order of
1a600 20 61 63 74 69 6f 6e 20 73 65 74 73 20 2a 2f 0a   action sets */.
1a610 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  };../*.** Compar
1a620 65 20 74 6f 20 61 78 73 65 74 20 73 74 72 75 63  e to axset struc
1a630 74 75 72 65 73 20 66 6f 72 20 73 6f 72 74 69 6e  tures for sortin
1a640 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
1a650 61 74 69 63 20 69 6e 74 20 61 78 73 65 74 5f 63  atic int axset_c
1a660 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69  ompare(const voi
1a670 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64  d *a, const void
1a680 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 74 20 61   *b){.  struct a
1a690 78 73 65 74 20 2a 70 31 20 3d 20 28 73 74 72 75  xset *p1 = (stru
1a6a0 63 74 20 61 78 73 65 74 2a 29 61 3b 0a 20 20 73  ct axset*)a;.  s
1a6b0 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 32 20  truct axset *p2 
1a6c0 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a  = (struct axset*
1a6d0 29 62 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63  )b;.  int c;.  c
1a6e0 20 3d 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d   = p2->nAction -
1a6f0 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 20 20   p1->nAction;.  
1a700 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
1a710 63 20 3d 20 70 32 2d 3e 69 4f 72 64 65 72 20 2d  c = p2->iOrder -
1a720 20 70 31 2d 3e 69 4f 72 64 65 72 3b 0a 20 20 7d   p1->iOrder;.  }
1a730 0a 20 20 61 73 73 65 72 74 28 20 63 21 3d 30 20  .  assert( c!=0 
1a740 7c 7c 20 70 31 3d 3d 70 32 20 29 3b 0a 20 20 72  || p1==p2 );.  r
1a750 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
1a760 2a 20 57 72 69 74 65 20 74 65 78 74 20 6f 6e 20  * Write text on 
1a770 22 6f 75 74 22 20 74 68 61 74 20 64 65 73 63 72  "out" that descr
1a780 69 62 65 73 20 74 68 65 20 72 75 6c 65 20 22 72  ibes the rule "r
1a790 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  p"..*/.static vo
1a7a0 69 64 20 77 72 69 74 65 52 75 6c 65 54 65 78 74  id writeRuleText
1a7b0 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75  (FILE *out, stru
1a7c0 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20  ct rule *rp){.  
1a7d0 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66  int j;.  fprintf
1a7e0 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22 2c 20 72  (out,"%s ::=", r
1a7f0 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
1a800 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e   for(j=0; j<rp->
1a810 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nrhs; j++){.    
1a820 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1a830 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a  p = rp->rhs[j];.
1a840 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a850 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29  " %s", sp->name)
1a860 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
1a870 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
1a880 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  L ){.      int k
1a890 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b  ;.      for(k=1;
1a8a0 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   k<sp->nsubsym; 
1a8b0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  k++){.        fp
1a8c0 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73 22 2c  rintf(out,"|%s",
1a8d0 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e  sp->subsym[k]->n
1a8e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1a8f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47    }.  }.}.../* G
1a900 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63 65  enerate C source
1a910 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61   code for the pa
1a920 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70  rser */.void Rep
1a930 6f 72 74 54 61 62 6c 65 28 0a 20 20 73 74 72 75  ortTable(.  stru
1a940 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a  ct lemon *lemp,.
1a950 20 20 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20    int mhflag    
1a960 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d 61   /* Output in ma
1a970 6b 65 68 65 61 64 65 72 73 20 66 6f 72 6d 61 74  keheaders format
1a980 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
1a990 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b   FILE *out, *in;
1a9a0 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e  .  char line[LIN
1a9b0 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c  ESIZE];.  int  l
1a9c0 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20  ineno;.  struct 
1a9d0 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
1a9e0 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
1a9f0 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
1aa00 72 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  rp;.  struct act
1aa10 74 61 62 20 2a 70 41 63 74 74 61 62 3b 0a 20 20  tab *pActtab;.  
1aa20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63  int i, j, n;.  c
1aa30 6f 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b  onst char *name;
1aa40 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74  .  int mnTknOfst
1aa50 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20 20 69  , mxTknOfst;.  i
1aa60 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e  nt mnNtOfst, mxN
1aa70 74 4f 66 73 74 3b 0a 20 20 73 74 72 75 63 74 20  tOfst;.  struct 
1aa80 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20 20 69 6e  axset *ax;..  in
1aa90 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d   = tplt_open(lem
1aaa0 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  p);.  if( in==0 
1aab0 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20  ) return;.  out 
1aac0 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
1aad0 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a 20 20 69  ,".c","wb");.  i
1aae0 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  f( out==0 ){.   
1aaf0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
1ab00 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c   return;.  }.  l
1ab10 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c  ineno = 1;.  tpl
1ab20 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1ab30 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1ab40 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1ab50 65 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63 6f  e the include co
1ab60 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  de, if any */.  
1ab70 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1ab80 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64  emp,lemp->includ
1ab90 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66  e,&lineno);.  if
1aba0 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
1abb0 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 66 69 6c  char *name = fil
1abc0 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
1abd0 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72 69   ".h");.    fpri
1abe0 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75 64  ntf(out,"#includ
1abf0 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 6e 61 6d  e \"%s\"\n", nam
1ac00 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1ac10 20 20 66 72 65 65 28 6e 61 6d 65 29 3b 0a 20 20    free(name);.  
1ac20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1ac30 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1ac40 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1ac50 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e 65  Generate #define
1ac60 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73  s for all tokens
1ac70 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61 67   */.  if( mhflag
1ac80 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1ac90 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20  ar *prefix;.    
1aca0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66  fprintf(out,"#if
1acb0 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20   INTERFACE\n"); 
1acc0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66  lineno++;.    if
1acd0 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  ( lemp->tokenpre
1ace0 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c  fix ) prefix = l
1acf0 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
1ad00 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20  ;.    else      
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
1ad20 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66  efix = "";.    f
1ad30 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=1; i<lemp->
1ad40 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b  nterminal; i++){
1ad50 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1ad60 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  ut,"#define %s%-
1ad70 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69  30s %2d\n",prefi
1ad80 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
1ad90 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
1ada0 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
1adb0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
1adc0 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
1add0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1ade0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1adf0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1ae00 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1ae10 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73  rate the defines
1ae20 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1ae30 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44  t,"#define YYCOD
1ae40 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20  ETYPE %s\n",.   
1ae50 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
1ae60 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d  pe(0, lemp->nsym
1ae70 62 6f 6c 2b 31 29 29 3b 20 6c 69 6e 65 6e 6f 2b  bol+1)); lineno+
1ae80 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1ae90 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f  ,"#define YYNOCO
1aea0 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e  DE %d\n",lemp->n
1aeb0 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65  symbol+1);  line
1aec0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1aed0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41  out,"#define YYA
1aee0 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c  CTIONTYPE %s\n",
1aef0 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a  .    minimum_siz
1af00 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e  e_type(0, lemp->
1af10 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75  nstate+lemp->nru
1af20 6c 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b  le+5));  lineno+
1af30 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77  +;.  if( lemp->w
1af40 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 66  ildcard ){.    f
1af50 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1af60 69 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20 25  ine YYWILDCARD %
1af70 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d  d\n",.       lem
1af80 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64  p->wildcard->ind
1af90 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ex); lineno++;. 
1afa0 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b   }.  print_stack
1afb0 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c  _union(out,lemp,
1afc0 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b  &lineno,mhflag);
1afd0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1afe0 22 23 69 66 6e 64 65 66 20 59 59 53 54 41 43 4b  "#ifndef YYSTACK
1aff0 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e  DEPTH\n"); linen
1b000 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  o++;.  if( lemp-
1b010 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20  >stacksize ){.  
1b020 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1b030 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45  define YYSTACKDE
1b040 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e  PTH %s\n",lemp->
1b050 73 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e  stacksize);  lin
1b060 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eno++;.  }else{.
1b070 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b080 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b  "#define YYSTACK
1b090 44 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20  DEPTH 100\n");  
1b0a0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1b0b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 65  fprintf(out, "#e
1b0c0 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
1b0d0 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67  ++;.  if( mhflag
1b0e0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1b0f0 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41  out,"#if INTERFA
1b100 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  CE\n"); lineno++
1b110 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c  ;.  }.  name = l
1b120 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
1b130 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
1b140 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72  ;.  if( lemp->ar
1b150 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30  g && lemp->arg[0
1b160 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ] ){.    int i;.
1b170 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74 72      i = lemonStr
1b180 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a  len(lemp->arg);.
1b190 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20      while( i>=1 
1b1a0 26 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70 2d  && isspace(lemp-
1b1b0 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d  >arg[i-1]) ) i--
1b1c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d  ;.    while( i>=
1b1d0 31 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c 65  1 && (isalnum(le
1b1e0 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c  mp->arg[i-1]) ||
1b1f0 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d   lemp->arg[i-1]=
1b200 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20  ='_') ) i--;.   
1b210 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1b220 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43  efine %sARG_SDEC
1b230 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65  L %s;\n",name,le
1b240 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e  mp->arg);  linen
1b250 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1b260 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1b270 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22  ARG_PDECL ,%s\n"
1b280 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29  ,name,lemp->arg)
1b290 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1b2a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1b2b0 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
1b2c0 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65 72  H %s = yypParser
1b2d0 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ->%s\n",.       
1b2e0 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c            name,l
1b2f0 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e  emp->arg,&lemp->
1b300 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f  arg[i]);  lineno
1b310 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1b320 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1b330 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72 73  RG_STORE yypPars
1b340 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a  er->%s = %s\n",.
1b350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b360 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67   name,&lemp->arg
1b370 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69  [i],&lemp->arg[i
1b380 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ]);  lineno++;. 
1b390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
1b3a0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b3b0 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c   %sARG_SDECL\n",
1b3c0 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  name);  lineno++
1b3d0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1b3e0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1b3f0 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b  _PDECL\n",name);
1b400 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1b410 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1b420 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48  fine %sARG_FETCH
1b430 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
1b440 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1b450 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1b460 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d  ARG_STORE\n",nam
1b470 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1b480 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  }.  if( mhflag )
1b490 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1b4a0 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
1b4b0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
1b4c0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1b4d0 69 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64 5c  ine YYNSTATE %d\
1b4e0 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29  n",lemp->nstate)
1b4f0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ;  lineno++;.  f
1b500 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1b510 69 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c 6e  ine YYNRULE %d\n
1b520 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20  ",lemp->nrule); 
1b530 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
1b540 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75   lemp->errsym->u
1b550 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72  seCnt ){.    fpr
1b560 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1b570 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20  e YYERRORSYMBOL 
1b580 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  %d\n",lemp->errs
1b590 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69 6e  ym->index);  lin
1b5a0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1b5b0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1b5c0 59 59 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c  YYERRSYMDT yy%d\
1b5d0 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  n",lemp->errsym-
1b5e0 3e 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f  >dtnum);  lineno
1b5f0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  ++;.  }.  if( le
1b600 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b  mp->has_fallback
1b610 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1b620 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46  out,"#define YYF
1b630 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20  ALLBACK 1\n");  
1b640 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1b650 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1b660 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1b670 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1b680 72 61 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20  rate the action 
1b690 74 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73  table and its as
1b6a0 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20  sociates:.  **. 
1b6b0 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   **  yy_action[]
1b6c0 20 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65          A single
1b6d0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1b6e0 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20  g all actions.. 
1b6f0 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61   **  yy_lookahea
1b700 64 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20  d[]     A table 
1b710 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
1b720 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63  ookahead for eac
1b730 68 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20  h entry in.  ** 
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b750 20 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20      yy_action.  
1b760 55 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 68  Used to detect h
1b770 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a  ash collisions..
1b780 20 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f    **  yy_shift_o
1b790 66 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63  fst[]    For eac
1b7a0 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66  h state, the off
1b7b0 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69  set into yy_acti
1b7c0 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20  on for.  **     
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 73 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61  shifting termina
1b7f0 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64  ls..  **  yy_red
1b800 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72  uce_ofst[]   For
1b810 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65   each state, the
1b820 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f   offset into yy_
1b830 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20  action for.  ** 
1b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b850 20 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e      shifting non
1b860 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72  -terminals after
1b870 20 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20   a reduce..  ** 
1b880 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20   yy_default[]   
1b890 20 20 20 20 44 65 66 61 75 6c 74 20 61 63 74 69      Default acti
1b8a0 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61 74  on for each stat
1b8b0 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  e..  */..  /* Co
1b8c0 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
1b8d0 73 20 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73 20  s on all states 
1b8e0 61 6e 64 20 63 6f 75 6e 74 20 74 68 65 6d 20 75  and count them u
1b8f0 70 20 2a 2f 0a 20 20 61 78 20 3d 20 28 73 74 72  p */.  ax = (str
1b900 75 63 74 20 61 78 73 65 74 20 2a 29 20 63 61 6c  uct axset *) cal
1b910 6c 6f 63 28 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  loc(lemp->nstate
1b920 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d  *2, sizeof(ax[0]
1b930 29 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20  ));.  if( ax==0 
1b940 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
1b950 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61  tderr,"malloc fa
1b960 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78  iled\n");.    ex
1b970 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  it(1);.  }.  for
1b980 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1b990 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
1b9a0 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
1b9b0 65 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a  ed[i];.    ax[i*
1b9c0 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20  2].stp = stp;.  
1b9d0 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20    ax[i*2].isTkn 
1b9e0 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  = 1;.    ax[i*2]
1b9f0 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e  .nAction = stp->
1ba00 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b  nTknAct;.    ax[
1ba10 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70  i*2+1].stp = stp
1ba20 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
1ba30 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61  isTkn = 0;.    a
1ba40 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e  x[i*2+1].nAction
1ba50 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a   = stp->nNtAct;.
1ba60 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20    }.  mxTknOfst 
1ba70 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b  = mnTknOfst = 0;
1ba80 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e  .  mxNtOfst = mn
1ba90 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20 2f  NtOfst = 0;..  /
1baa0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63  * Compute the ac
1bab0 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20  tion table.  In 
1bac0 6f 72 64 65 72 20 74 6f 20 74 72 79 20 74 6f 20  order to try to 
1bad0 6b 65 65 70 20 74 68 65 20 73 69 7a 65 20 6f 66  keep the size of
1bae0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f 6e   the.  ** action
1baf0 20 74 61 62 6c 65 20 74 6f 20 61 20 6d 69 6e 69   table to a mini
1bb00 6d 75 6d 2c 20 74 68 65 20 68 65 75 72 69 73 74  mum, the heurist
1bb10 69 63 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68  ic of placing th
1bb20 65 20 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e  e largest action
1bb30 0a 20 20 2a 2a 20 73 65 74 73 20 66 69 72 73 74  .  ** sets first
1bb40 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2f 0a 20   is used..  */. 
1bb50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1bb60 2d 3e 6e 73 74 61 74 65 2a 32 3b 20 69 2b 2b 29  ->nstate*2; i++)
1bb70 20 61 78 5b 69 5d 2e 69 4f 72 64 65 72 20 3d 20   ax[i].iOrder = 
1bb80 69 3b 0a 20 20 71 73 6f 72 74 28 61 78 2c 20 6c  i;.  qsort(ax, l
1bb90 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73  emp->nstate*2, s
1bba0 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78  izeof(ax[0]), ax
1bbb0 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20  set_compare);.  
1bbc0 70 41 63 74 74 61 62 20 3d 20 61 63 74 74 61 62  pActtab = acttab
1bbd0 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28  _alloc();.  for(
1bbe0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1bbf0 61 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e  ate*2 && ax[i].n
1bc00 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a  Action>0; i++){.
1bc10 20 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e      stp = ax[i].
1bc20 73 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78 5b  stp;.    if( ax[
1bc30 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20  i].isTkn ){.    
1bc40 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1bc50 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1bc60 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
1bc70 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  action;.        
1bc80 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1bc90 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  x>=lemp->ntermin
1bca0 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  al ) continue;. 
1bcb0 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20         action = 
1bcc0 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
1bcd0 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20  emp, ap);.      
1bce0 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29    if( action<0 )
1bcf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1bd00 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e     acttab_action
1bd10 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70  (pActtab, ap->sp
1bd20 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29  ->index, action)
1bd30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bd40 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20  stp->iTknOfst = 
1bd50 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41  acttab_insert(pA
1bd60 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66  cttab);.      if
1bd70 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c  ( stp->iTknOfst<
1bd80 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b  mnTknOfst ) mnTk
1bd90 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b  nOfst = stp->iTk
1bda0 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28  nOfst;.      if(
1bdb0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d   stp->iTknOfst>m
1bdc0 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e  xTknOfst ) mxTkn
1bdd0 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  Ofst = stp->iTkn
1bde0 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Ofst;.    }else{
1bdf0 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74  .      for(ap=st
1be00 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
1be10 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
1be20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20   int action;.   
1be30 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
1be40 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65  >index<lemp->nte
1be50 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75  rminal ) continu
1be60 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  e;.        if( a
1be70 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65  p->sp->index==le
1be80 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f  mp->nsymbol ) co
1be90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1bea0 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65  action = compute
1beb0 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70  _action(lemp, ap
1bec0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1bed0 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e  ction<0 ) contin
1bee0 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74  ue;.        actt
1bef0 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61  ab_action(pActta
1bf00 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  b, ap->sp->index
1bf10 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  , action);.     
1bf20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e   }.      stp->iN
1bf30 74 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69  tOfst = acttab_i
1bf40 6e 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a  nsert(pActtab);.
1bf50 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69        if( stp->i
1bf60 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20  NtOfst<mnNtOfst 
1bf70 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70  ) mnNtOfst = stp
1bf80 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20  ->iNtOfst;.     
1bf90 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73   if( stp->iNtOfs
1bfa0 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e  t>mxNtOfst ) mxN
1bfb0 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74  tOfst = stp->iNt
1bfc0 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Ofst;.    }.  }.
1bfd0 20 20 66 72 65 65 28 61 78 29 3b 0a 0a 20 20 2f    free(ax);..  /
1bfe0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f  * Output the yy_
1bff0 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a  action table */.
1c000 20 20 6e 20 3d 20 61 63 74 74 61 62 5f 73 69 7a    n = acttab_siz
1c010 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20 66 70  e(pActtab);.  fp
1c020 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1c030 6e 65 20 59 59 5f 41 43 54 54 41 42 5f 43 4f 55  ne YY_ACTTAB_COU
1c040 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e 29 3b 20  NT (%d)\n", n); 
1c050 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1c060 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20  ntf(out,"static 
1c070 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59  const YYACTIONTY
1c080 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d  PE yy_action[] =
1c090 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   {\n"); lineno++
1c0a0 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
1c0b0 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
1c0c0 74 20 61 63 74 69 6f 6e 20 3d 20 61 63 74 74 61  t action = actta
1c0d0 62 5f 79 79 61 63 74 69 6f 6e 28 70 41 63 74 74  b_yyaction(pActt
1c0e0 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ab, i);.    if( 
1c0f0 61 63 74 69 6f 6e 3c 30 20 29 20 61 63 74 69 6f  action<0 ) actio
1c100 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  n = lemp->nstate
1c110 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b   + lemp->nrule +
1c120 20 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30   2;.    if( j==0
1c130 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1c140 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
1c150 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1c160 74 2c 20 22 20 25 34 64 2c 22 2c 20 61 63 74 69  t, " %4d,", acti
1c170 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  on);.    if( j==
1c180 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1c190 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1c1a0 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1c1b0 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1c1c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c1d0 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1c1e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c1f0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1c200 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1c210 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20  he yy_lookahead 
1c220 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e  table */.  fprin
1c230 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63  tf(out,"static c
1c240 6f 6e 73 74 20 59 59 43 4f 44 45 54 59 50 45 20  onst YYCODETYPE 
1c250 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d  yy_lookahead[] =
1c260 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   {\n"); lineno++
1c270 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  ;.  for(i=j=0; i
1c280 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  <n; i++){.    in
1c290 74 20 6c 61 20 3d 20 61 63 74 74 61 62 5f 79 79  t la = acttab_yy
1c2a0 6c 6f 6f 6b 61 68 65 61 64 28 70 41 63 74 74 61  lookahead(pActta
1c2b0 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 6c  b, i);.    if( l
1c2c0 61 3c 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70 2d  a<0 ) la = lemp-
1c2d0 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 69 66  >nsymbol;.    if
1c2e0 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
1c2f0 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
1c300 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
1c310 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
1c320 2c 20 6c 61 29 3b 0a 20 20 20 20 69 66 28 20 6a  , la);.    if( j
1c330 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1c340 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1c350 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1c360 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1c370 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c380 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1c390 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1c3a0 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1c3b0 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
1c3c0 20 74 68 65 20 79 79 5f 73 68 69 66 74 5f 6f 66   the yy_shift_of
1c3d0 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  st[] table */.  
1c3e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1c3f0 65 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 55  efine YY_SHIFT_U
1c400 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c  SE_DFLT (%d)\n",
1c410 20 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c   mnTknOfst-1); l
1c420 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c  ineno++;.  n = l
1c430 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77  emp->nstate;.  w
1c440 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d  hile( n>0 && lem
1c450 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e  p->sorted[n-1]->
1c460 69 54 6b 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46  iTknOfst==NO_OFF
1c470 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72  SET ) n--;.  fpr
1c480 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1c490 6e 65 20 59 59 5f 53 48 49 46 54 5f 43 4f 55 4e  ne YY_SHIFT_COUN
1c4a0 54 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b  T (%d)\n", n-1);
1c4b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1c4c0 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1c4d0 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 49 4e 20  ne YY_SHIFT_MIN 
1c4e0 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e    (%d)\n", mnTkn
1c4f0 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Ofst); lineno++;
1c500 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1c510 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46  "#define YY_SHIF
1c520 54 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c  T_MAX   (%d)\n",
1c530 20 6d 78 54 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e   mxTknOfst); lin
1c540 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1c550 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
1c560 6e 73 74 20 25 73 20 79 79 5f 73 68 69 66 74 5f  nst %s yy_shift_
1c570 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a  ofst[] = {\n", .
1c580 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75            minimu
1c590 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54 6b  m_size_type(mnTk
1c5a0 6e 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66  nOfst-1, mxTknOf
1c5b0 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  st)); lineno++;.
1c5c0 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
1c5d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1c5e0 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20  ofst;.    stp = 
1c5f0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
1c600 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d  .    ofst = stp-
1c610 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 69  >iTknOfst;.    i
1c620 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  f( ofst==NO_OFFS
1c630 45 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 54 6b  ET ) ofst = mnTk
1c640 6e 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20 69  nOfst - 1;.    i
1c650 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
1c660 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
1c670 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
1c680 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
1c690 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66  ", ofst);.    if
1c6a0 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
1c6b0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
1c6c0 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
1c6d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
1c6e0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1c6f0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
1c700 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
1c710 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
1c720 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74  eno++;..  /* Out
1c730 70 75 74 20 74 68 65 20 79 79 5f 72 65 64 75 63  put the yy_reduc
1c740 65 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a  e_ofst[] table *
1c750 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
1c760 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44   "#define YY_RED
1c770 55 43 45 5f 55 53 45 5f 44 46 4c 54 20 28 25 64  UCE_USE_DFLT (%d
1c780 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31  )\n", mnNtOfst-1
1c790 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e  ); lineno++;.  n
1c7a0 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   = lemp->nstate;
1c7b0 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26  .  while( n>0 &&
1c7c0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d   lemp->sorted[n-
1c7d0 31 5d 2d 3e 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f  1]->iNtOfst==NO_
1c7e0 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20  OFFSET ) n--;.  
1c7f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1c800 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
1c810 43 4f 55 4e 54 20 28 25 64 29 5c 6e 22 2c 20 6e  COUNT (%d)\n", n
1c820 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  -1); lineno++;. 
1c830 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1c840 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45  define YY_REDUCE
1c850 5f 4d 49 4e 20 20 20 28 25 64 29 5c 6e 22 2c 20  _MIN   (%d)\n", 
1c860 6d 6e 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e  mnNtOfst); linen
1c870 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1c880 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f  ut, "#define YY_
1c890 52 45 44 55 43 45 5f 4d 41 58 20 20 20 28 25 64  REDUCE_MAX   (%d
1c8a0 29 5c 6e 22 2c 20 6d 78 4e 74 4f 66 73 74 29 3b  )\n", mxNtOfst);
1c8b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1c8c0 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69  intf(out, "stati
1c8d0 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f 72 65  c const %s yy_re
1c8e0 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c  duce_ofst[] = {\
1c8f0 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6d  n", .          m
1c900 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
1c910 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d 78 4e  (mnNtOfst-1, mxN
1c920 74 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b  tOfst)); lineno+
1c930 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
1c940 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
1c950 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70  nt ofst;.    stp
1c960 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
1c970 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73  i];.    ofst = s
1c980 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20  tp->iNtOfst;.   
1c990 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46   if( ofst==NO_OF
1c9a0 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e  FSET ) ofst = mn
1c9b0 4e 74 4f 66 73 74 20 2d 20 31 3b 0a 20 20 20 20  NtOfst - 1;.    
1c9c0 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e  if( j==0 ) fprin
1c9d0 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20  tf(out," /* %5d 
1c9e0 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70  */ ", i);.    fp
1c9f0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64  rintf(out, " %4d
1ca00 2c 22 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69  ,", ofst);.    i
1ca10 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
1ca20 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
1ca30 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
1ca40 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
1ca50 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1ca60 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
1ca70 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
1ca80 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
1ca90 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
1caa0 74 70 75 74 20 74 68 65 20 64 65 66 61 75 6c 74  tput the default
1cab0 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f   action table */
1cac0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1cad0 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59  "static const YY
1cae0 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 64 65  ACTIONTYPE yy_de
1caf0 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b  fault[] = {\n");
1cb00 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d   lineno++;.  n =
1cb10 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20   lemp->nstate;. 
1cb20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1cb30 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1cb40 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1cb50 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29  ;.    if( j==0 )
1cb60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1cb70 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a  * %5d */ ", i);.
1cb80 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1cb90 20 22 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e 69   " %4d,", stp->i
1cba0 44 66 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 6a  Dflt);.    if( j
1cbb0 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1cbc0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1cbd0 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1cbe0 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1cbf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cc00 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1cc10 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1cc20 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1cc30 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  ++;.  tplt_xfer(
1cc40 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1cc50 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1cc60 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
1cc70 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b  able of fallback
1cc80 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20   tokens..  */.  
1cc90 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61  if( lemp->has_fa
1cca0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 69 6e  llback ){.    in
1ccb0 74 20 6d 78 20 3d 20 6c 65 6d 70 2d 3e 6e 74 65  t mx = lemp->nte
1ccc0 72 6d 69 6e 61 6c 20 2d 20 31 3b 0a 20 20 20 20  rminal - 1;.    
1ccd0 77 68 69 6c 65 28 20 6d 78 3e 30 20 26 26 20 6c  while( mx>0 && l
1cce0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6d 78 5d  emp->symbols[mx]
1ccf0 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b  ->fallback==0 ){
1cd00 20 6d 78 2d 2d 3b 20 7d 0a 20 20 20 20 66 6f 72   mx--; }.    for
1cd10 28 69 3d 30 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b  (i=0; i<=mx; i++
1cd20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1cd30 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70  symbol *p = lemp
1cd40 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
1cd50 20 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62      if( p->fallb
1cd60 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ack==0 ){.      
1cd70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1cd80 20 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73 20      0,  /* %10s 
1cd90 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22  => nothing */\n"
1cda0 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  , p->name);.    
1cdb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cdc0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1cdd0 20 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d   %3d,  /* %10s =
1cde0 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66  > %s */\n", p->f
1cdf0 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a  allback->index,.
1ce00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d            p->nam
1ce10 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e  e, p->fallback->
1ce20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  name);.      }. 
1ce30 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
1ce40 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f     }.  }.  tplt_
1ce50 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1ce60 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e   in, out, &linen
1ce70 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1ce80 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  te a table conta
1ce90 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c  ining the symbol
1cea0 69 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72 79  ic name of every
1ceb0 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66   symbol.  */.  f
1cec0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1ced0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1cee0 20 20 20 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c     sprintf(line,
1cef0 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e  "\"%s\",",lemp->
1cf00 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
1cf10 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1cf20 75 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69 6e  ut,"  %-15s",lin
1cf30 65 29 3b 0a 20 20 20 20 69 66 28 20 28 69 26 33  e);.    if( (i&3
1cf40 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74 66 28  )==3 ){ fprintf(
1cf50 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  out,"\n"); linen
1cf60 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28  o++; }.  }.  if(
1cf70 20 28 69 26 33 29 21 3d 30 20 29 7b 20 66 70 72   (i&3)!=0 ){ fpr
1cf80 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20  intf(out,"\n"); 
1cf90 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70  lineno++; }.  tp
1cfa0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1cfb0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
1cfc0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
1cfd0 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  te a table conta
1cfe0 69 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74 72  ining a text str
1cff0 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
1d000 65 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75  es every.  ** ru
1d010 6c 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73  le in the rule s
1d020 65 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  et of the gramma
1d030 72 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  r.  This informa
1d040 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a  tion is used.  *
1d050 2a 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52  * when tracing R
1d060 45 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20  EDUCE actions.. 
1d070 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72   */.  for(i=0, r
1d080 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
1d090 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69  ; rp=rp->next, i
1d0a0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
1d0b0 20 72 70 2d 3e 69 6e 64 65 78 3d 3d 69 20 29 3b   rp->index==i );
1d0c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1d0d0 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 22  ," /* %3d */ \""
1d0e0 2c 20 69 29 3b 0a 20 20 20 20 77 72 69 74 65 52  , i);.    writeR
1d0f0 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29  uleText(out, rp)
1d100 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1d110 74 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65  t,"\",\n"); line
1d120 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
1d130 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1d140 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1d150 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1d160 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
1d170 75 74 65 73 20 65 76 65 72 79 20 74 69 6d 65 20  utes every time 
1d180 61 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70  a symbol is popp
1d190 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  ed from.  ** the
1d1a0 20 73 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f   stack while pro
1d1b0 63 65 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f  cessing errors o
1d1c0 72 20 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69  r while destroyi
1d1d0 6e 67 20 74 68 65 20 70 61 72 73 65 72 2e 20 0a  ng the parser. .
1d1e0 20 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20 77    ** (In other w
1d1f0 6f 72 64 73 2c 20 67 65 6e 65 72 61 74 65 20 74  ords, generate t
1d200 68 65 20 25 64 65 73 74 72 75 63 74 6f 72 20 61  he %destructor a
1d210 63 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69  ctions).  */.  i
1d220 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65  f( lemp->tokende
1d230 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6e  st ){.    int on
1d240 63 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28  ce = 1;.    for(
1d250 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
1d260 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
1d270 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1d280 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
1d290 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ols[i];.      if
1d2a0 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74  ( sp==0 || sp->t
1d2b0 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20  ype!=TERMINAL ) 
1d2c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1d2d0 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20  if( once ){.    
1d2e0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1d2f0 20 22 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 49   "      /* TERMI
1d300 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a  NAL Destructor *
1d310 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  /\n"); lineno++;
1d320 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20  .        once = 
1d330 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1d340 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1d350 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73    case %d: /* %s
1d360 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65   */\n", sp->inde
1d370 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69  x, sp->name); li
1d380 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
1d390 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1d3a0 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c 65  p->nsymbol && le
1d3b0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1d3c0 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b 20  type!=TERMINAL; 
1d3d0 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 69 3c  i++);.    if( i<
1d3e0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b  lemp->nsymbol ){
1d3f0 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74  .      emit_dest
1d400 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c  ructor_code(out,
1d410 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1d420 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
1d430 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1d440 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
1d450 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1d460 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6c     }.  }.  if( l
1d470 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a  emp->vardest ){.
1d480 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1d490 6c 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b 0a  l *dflt_sp = 0;.
1d4a0 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
1d4b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1d4c0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
1d4d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
1d4e0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1d4f0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1d500 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d  ;.      if( sp==
1d510 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54  0 || sp->type==T
1d520 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20 20  ERMINAL ||.     
1d530 20 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c 3d       sp->index<=
1d540 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63  0 || sp->destruc
1d550 74 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  tor!=0 ) continu
1d560 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  e;.      if( onc
1d570 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  e ){.        fpr
1d580 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20  intf(out, "     
1d590 20 2f 2a 20 44 65 66 61 75 6c 74 20 4e 4f 4e 2d   /* Default NON-
1d5a0 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75 63  TERMINAL Destruc
1d5b0 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65  tor */\n"); line
1d5c0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e  no++;.        on
1d5d0 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ce = 0;.      }.
1d5e0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1d5f0 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20  t,"    case %d: 
1d600 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d  /* %s */\n", sp-
1d610 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65  >index, sp->name
1d620 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1d630 20 20 20 64 66 6c 74 5f 73 70 20 3d 20 73 70 3b     dflt_sp = sp;
1d640 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
1d650 66 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20 20  flt_sp!=0 ){.   
1d660 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74     emit_destruct
1d670 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c 74  or_code(out,dflt
1d680 5f 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  _sp,lemp,&lineno
1d690 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
1d6a0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1d6b0 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
1d6c0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  no++;.  }.  for(
1d6d0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
1d6e0 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
1d6f0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1d700 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
1d710 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  s[i];.    if( sp
1d720 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d  ==0 || sp->type=
1d730 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d  =TERMINAL || sp-
1d740 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20 29  >destructor==0 )
1d750 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
1d760 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1d770 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a  case %d: /* %s *
1d780 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c  /\n", sp->index,
1d790 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65   sp->name); line
1d7a0 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  no++;..    /* Co
1d7b0 6d 62 69 6e 65 20 64 75 70 6c 69 63 61 74 65 20  mbine duplicate 
1d7c0 64 65 73 74 72 75 63 74 6f 72 73 20 69 6e 74 6f  destructors into
1d7d0 20 61 20 73 69 6e 67 6c 65 20 63 61 73 65 20 2a   a single case *
1d7e0 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  /.    for(j=i+1;
1d7f0 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   j<lemp->nsymbol
1d800 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; j++){.      st
1d810 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 32  ruct symbol *sp2
1d820 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
1d830 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  [j];.      if( s
1d840 70 32 20 26 26 20 73 70 32 2d 3e 74 79 70 65 21  p2 && sp2->type!
1d850 3d 54 45 52 4d 49 4e 41 4c 20 26 26 20 73 70 32  =TERMINAL && sp2
1d860 2d 3e 64 65 73 74 72 75 63 74 6f 72 0a 20 20 20  ->destructor.   
1d870 20 20 20 20 20 20 20 26 26 20 73 70 32 2d 3e 64         && sp2->d
1d880 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e 75 6d 0a  tnum==sp->dtnum.
1d890 20 20 20 20 20 20 20 20 20 20 26 26 20 73 74 72            && str
1d8a0 63 6d 70 28 73 70 2d 3e 64 65 73 74 72 75 63 74  cmp(sp->destruct
1d8b0 6f 72 2c 73 70 32 2d 3e 64 65 73 74 72 75 63 74  or,sp2->destruct
1d8c0 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  or)==0 ){.      
1d8d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1d8e0 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20      case %d: /* 
1d8f0 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20  %s */\n",.      
1d900 20 20 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e             sp2->
1d910 69 6e 64 65 78 2c 20 73 70 32 2d 3e 6e 61 6d 65  index, sp2->name
1d920 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1d930 20 20 20 20 20 20 73 70 32 2d 3e 64 65 73 74 72        sp2->destr
1d940 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  uctor = 0;.     
1d950 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6d   }.    }..    em
1d960 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
1d970 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d  de(out,lemp->sym
1d980 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69  bols[i],lemp,&li
1d990 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e  neno);.    fprin
1d9a0 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72  tf(out,"      br
1d9b0 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
1d9c0 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
1d9d0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1d9e0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1d9f0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1da00 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1da10 65 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  es whenever the 
1da20 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65  parser stack ove
1da30 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74  rflows */.  tplt
1da40 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1da50 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 26  lemp->overflow,&
1da60 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
1da70 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1da80 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1da90 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1daa0 74 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c  the table of rul
1dab0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20  e information . 
1dac0 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54   **.  ** Note: T
1dad0 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
1dae0 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
1daf0 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62  t rules are numb
1db00 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75  er.  ** sequentu
1db10 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77  ally beginning w
1db20 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ith 0..  */.  fo
1db30 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
1db40 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
1db50 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1db60 75 74 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d  ut,"  { %d, %d }
1db70 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e  ,\n",rp->lhs->in
1db80 64 65 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c  dex,rp->nrhs); l
1db90 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1dba0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1dbb0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1dbc0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1dbd0 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1dbe0 78 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20  xecution during 
1dbf0 65 61 63 68 20 52 45 44 55 43 45 20 61 63 74 69  each REDUCE acti
1dc00 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  on */.  for(rp=l
1dc10 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
1dc20 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
1dc30 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28   translate_code(
1dc40 6c 65 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20  lemp, rp);.  }. 
1dc50 20 2f 2a 20 46 69 72 73 74 20 6f 75 74 70 75 74   /* First output
1dc60 20 72 75 6c 65 73 20 6f 74 68 65 72 20 74 68 61   rules other tha
1dc70 6e 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 72  n the default: r
1dc80 75 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ule */.  for(rp=
1dc90 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
1dca0 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
1dcb0 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1dcc0 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
1dcd0 20 20 2f 2a 20 4f 74 68 65 72 20 72 75 6c 65 73    /* Other rules
1dce0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 61   with the same a
1dcf0 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28  ction */.    if(
1dd00 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63   rp->code==0 ) c
1dd10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
1dd20 20 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d 3d 27 5c   rp->code[0]=='\
1dd30 6e 27 20 26 26 20 72 70 2d 3e 63 6f 64 65 5b 31  n' && rp->code[1
1dd40 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
1dd50 20 2f 2a 20 57 69 6c 6c 20 62 65 20 64 65 66 61   /* Will be defa
1dd60 75 6c 74 3a 20 2a 2f 0a 20 20 20 20 66 70 72 69  ult: */.    fpri
1dd70 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63  ntf(out,"      c
1dd80 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70  ase %d: /* ", rp
1dd90 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72  ->index);.    wr
1dda0 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c  iteRuleText(out,
1ddb0 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74   rp);.    fprint
1ddc0 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22 29 3b  f(out, " */\n");
1ddd0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1dde0 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74 3b  or(rp2=rp->next;
1ddf0 20 72 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e 6e   rp2; rp2=rp2->n
1de00 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1de10 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63  rp2->code==rp->c
1de20 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ode ){.        f
1de30 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1de40 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c    case %d: /* ",
1de50 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20   rp2->index);.  
1de60 20 20 20 20 20 20 77 72 69 74 65 52 75 6c 65 54        writeRuleT
1de70 65 78 74 28 6f 75 74 2c 20 72 70 32 29 3b 0a 20  ext(out, rp2);. 
1de80 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1de90 75 74 2c 22 20 2a 2f 20 79 79 74 65 73 74 63 61  ut," */ yytestca
1dea0 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64 29  se(yyruleno==%d)
1deb0 3b 5c 6e 22 2c 20 72 70 32 2d 3e 69 6e 64 65 78  ;\n", rp2->index
1dec0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1ded0 20 20 20 20 20 72 70 32 2d 3e 63 6f 64 65 20 3d       rp2->code =
1dee0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1def0 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65 28  }.    emit_code(
1df00 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e  out,rp,lemp,&lin
1df10 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  eno);.    fprint
1df20 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62  f(out,"        b
1df30 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
1df40 6f 2b 2b 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64  o++;.    rp->cod
1df50 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20  e = 0;.  }.  /* 
1df60 46 69 6e 61 6c 6c 79 2c 20 6f 75 74 70 75 74 20  Finally, output 
1df70 74 68 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c  the default: rul
1df80 65 2e 20 20 57 65 20 63 68 6f 6f 73 65 20 61 73  e.  We choose as
1df90 20 74 68 65 20 64 65 66 61 75 6c 74 3a 20 61 6c   the default: al
1dfa0 6c 0a 20 20 2a 2a 20 65 6d 70 74 79 20 61 63 74  l.  ** empty act
1dfb0 69 6f 6e 73 2e 20 2a 2f 0a 20 20 66 70 72 69 6e  ions. */.  fprin
1dfc0 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 64 65  tf(out,"      de
1dfd0 66 61 75 6c 74 3a 5c 6e 22 29 3b 20 6c 69 6e 65  fault:\n"); line
1dfe0 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 72 70 3d 6c  no++;.  for(rp=l
1dff0 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
1e000 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
1e010 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30   if( rp->code==0
1e020 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e030 20 61 73 73 65 72 74 28 20 72 70 2d 3e 63 6f 64   assert( rp->cod
1e040 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26 20 72 70  e[0]=='\n' && rp
1e050 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20 29 3b 0a  ->code[1]==0 );.
1e060 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1e070 22 20 20 20 20 20 20 2f 2a 20 28 25 64 29 20 22  "      /* (%d) "
1e080 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  , rp->index);.  
1e090 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28    writeRuleText(
1e0a0 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70  out, rp);.    fp
1e0b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 20  rintf(out, " */ 
1e0c0 79 79 74 65 73 74 63 61 73 65 28 79 79 72 75 6c  yytestcase(yyrul
1e0d0 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72 70  eno==%d);\n", rp
1e0e0 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f  ->index); lineno
1e0f0 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  ++;.  }.  fprint
1e100 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62  f(out,"        b
1e110 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
1e120 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  o++;.  tplt_xfer
1e130 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1e140 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1e150 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1e160 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
1e170 69 66 20 61 20 70 61 72 73 65 20 66 61 69 6c 73  if a parse fails
1e180 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1e190 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1e1a0 66 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f 29  failure,&lineno)
1e1b0 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1e1c0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1e1d0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1e1e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
1e1f0 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
1e200 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72  n a syntax error
1e210 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c   occurs */.  tpl
1e220 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1e230 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c 69  ,lemp->error,&li
1e240 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1e250 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1e260 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1e270 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1e280 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1e290 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65  s when the parse
1e2a0 72 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e  r accepts its in
1e2b0 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  put */.  tplt_pr
1e2c0 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1e2d0 70 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65 6e  p->accept,&linen
1e2e0 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
1e2f0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1e300 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1e310 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64  * Append any add
1e320 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75  ition code the u
1e330 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20  ser desires */. 
1e340 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1e350 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61  lemp,lemp->extra
1e360 63 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  code,&lineno);..
1e370 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1e380 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72  fclose(out);.  r
1e390 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  eturn;.}../* Gen
1e3a0 65 72 61 74 65 20 61 20 68 65 61 64 65 72 20 66  erate a header f
1e3b0 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ile for the pars
1e3c0 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72  er */.void Repor
1e3d0 74 48 65 61 64 65 72 28 73 74 72 75 63 74 20 6c  tHeader(struct l
1e3e0 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20  emon *lemp).{.  
1e3f0 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a  FILE *out, *in;.
1e400 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72    const char *pr
1e410 65 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e  efix;.  char lin
1e420 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63  e[LINESIZE];.  c
1e430 68 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45  har pattern[LINE
1e440 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  SIZE];.  int i;.
1e450 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b  .  if( lemp->tok
1e460 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69  enprefix ) prefi
1e470 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70  x = lemp->tokenp
1e480 72 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20 20  refix;.  else   
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4a0 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20   prefix = "";.  
1e4b0 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  in = file_open(l
1e4c0 65 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29 3b 0a  emp,".h","rb");.
1e4d0 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20    if( in ){.    
1e4e0 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1e4f0 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66 67  >nterminal && fg
1e500 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a  ets(line,LINESIZ
1e510 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  E,in); i++){.   
1e520 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 74 65     sprintf(patte
1e530 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  rn,"#define %s%-
1e540 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69  30s %2d\n",prefi
1e550 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
1e560 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
1e570 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6c 69     if( strcmp(li
1e580 6e 65 2c 70 61 74 74 65 72 6e 29 20 29 20 62 72  ne,pattern) ) br
1e590 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  eak;.    }.    f
1e5a0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69  close(in);.    i
1e5b0 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72  f( i==lemp->nter
1e5c0 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f  minal ){.      /
1e5d0 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74  * No change in t
1e5e0 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20  he file.  Don't 
1e5f0 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20  rewrite it. */. 
1e600 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1e610 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66   }.  }.  out = f
1e620 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e  ile_open(lemp,".
1e630 68 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20  h","wb");.  if( 
1e640 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  out ){.    for(i
1e650 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
1e660 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
1e670 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1e680 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
1e690 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
1e6a0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1e6b0 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20  name,i);.    }. 
1e6c0 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20     fclose(out); 
1e6d0 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a   .  }.  return;.
1e6e0 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65  }../* Reduce the
1e6f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74   size of the act
1e700 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70  ion tables, if p
1e710 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69  ossible, by maki
1e720 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66  ng use.** of def
1e730 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  aults..**.** In 
1e740 74 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65  this version, we
1e750 20 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66   take the most f
1e760 72 65 71 75 65 6e 74 20 52 45 44 55 43 45 20 61  requent REDUCE a
1e770 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a  ction and make.*
1e780 2a 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74  * it the default
1e790 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 72 65  .  Except, there
1e7a0 20 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 69   is no default i
1e7b0 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74  f the wildcard t
1e7c0 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73  oken.** is a pos
1e7d0 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64  sible look-ahead
1e7e0 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65  ..*/.void Compre
1e7f0 73 73 54 61 62 6c 65 73 28 73 74 72 75 63 74 20  ssTables(struct 
1e800 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
1e810 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
1e820 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  tp;.  struct act
1e830 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 3b 0a 20  ion *ap, *ap2;. 
1e840 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
1e850 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b 0a  , *rp2, *rbest;.
1e860 20 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b 0a    int nbest, n;.
1e870 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 75    int i;.  int u
1e880 73 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20 20  sesWildcard;..  
1e890 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1e8a0 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
1e8b0 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1e8c0 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e 62  orted[i];.    nb
1e8d0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 65  est = 0;.    rbe
1e8e0 73 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65 73  st = 0;.    uses
1e8f0 57 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a 20  Wildcard = 0;.. 
1e900 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1e910 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1e920 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  xt){.      if( a
1e930 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26  p->type==SHIFT &
1e940 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e  & ap->sp==lemp->
1e950 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20  wildcard ){.    
1e960 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64      usesWildcard
1e970 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1e980 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
1e990 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69  !=REDUCE ) conti
1e9a0 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d 20  nue;.      rp = 
1e9b0 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20  ap->x.rp;.      
1e9c0 69 66 28 20 72 70 2d 3e 6c 68 73 53 74 61 72 74  if( rp->lhsStart
1e9d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e9e0 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73 74     if( rp==rbest
1e9f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ea00 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20     n = 1;.      
1ea10 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78 74  for(ap2=ap->next
1ea20 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d 3e  ; ap2; ap2=ap2->
1ea30 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
1ea40 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52 45  f( ap2->type!=RE
1ea50 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DUCE ) continue;
1ea60 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d 20 61  .        rp2 = a
1ea70 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20  p2->x.rp;.      
1ea80 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73 74    if( rp2==rbest
1ea90 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1eaa0 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 70       if( rp2==rp
1eab0 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) n++;.      }.
1eac0 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65 73        if( n>nbes
1ead0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62 65  t ){.        nbe
1eae0 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  st = n;.        
1eaf0 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20 20  rbest = rp;.    
1eb00 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20    }.    }. .    
1eb10 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20 61  /* Do not make a
1eb20 20 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20   default if the 
1eb30 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20  number of rules 
1eb40 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  to default.    *
1eb50 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73  * is not at leas
1eb60 74 20 31 20 6f 72 20 69 66 20 74 68 65 20 77 69  t 1 or if the wi
1eb70 6c 64 63 61 72 64 20 74 6f 6b 65 6e 20 69 73 20  ldcard token is 
1eb80 61 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a  a possible.    *
1eb90 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20  * lookahead..   
1eba0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62 65 73   */.    if( nbes
1ebb0 74 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c 64 63  t<1 || usesWildc
1ebc0 61 72 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ard ) continue;.
1ebd0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65  ..    /* Combine
1ebe0 20 6d 61 74 63 68 69 6e 67 20 52 45 44 55 43 45   matching REDUCE
1ebf0 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20   actions into a 
1ec00 73 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20 2a  single default *
1ec10 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  /.    for(ap=stp
1ec20 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
1ec30 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
1ec40 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55  ( ap->type==REDU
1ec50 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d  CE && ap->x.rp==
1ec60 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a 20  rbest ) break;. 
1ec70 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1ec80 20 61 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e 73   ap );.    ap->s
1ec90 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22  p = Symbol_new("
1eca0 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 20  {default}");.   
1ecb0 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78 74   for(ap=ap->next
1ecc0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1ecd0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
1ece0 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26  ->type==REDUCE &
1ecf0 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73  & ap->x.rp==rbes
1ed00 74 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20 4e  t ) ap->type = N
1ed10 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  OT_USED;.    }. 
1ed20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74     stp->ap = Act
1ed30 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70  ion_sort(stp->ap
1ed40 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1ed50 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61   Compare two sta
1ed60 74 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20  tes for sorting 
1ed70 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 73  purposes.  The s
1ed80 6d 61 6c 6c 65 72 20 73 74 61 74 65 20 69 73 20  maller state is 
1ed90 74 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74 68 20  the.** one with 
1eda0 74 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72  the most non-ter
1edb0 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e 20 20  minal actions.  
1edc0 49 66 20 74 68 65 79 20 68 61 76 65 20 74 68 65  If they have the
1edd0 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20   same number.** 
1ede0 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  of non-terminal 
1edf0 61 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20 74 68  actions, then th
1ee00 65 20 73 6d 61 6c 6c 65 72 20 69 73 20 74 68 65  e smaller is the
1ee10 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f   one with the mo
1ee20 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63 74 69  st.** token acti
1ee30 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
1ee40 6e 74 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f  nt stateResortCo
1ee50 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64  mpare(const void
1ee60 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   *a, const void 
1ee70 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72  *b){.  const str
1ee80 75 63 74 20 73 74 61 74 65 20 2a 70 41 20 3d 20  uct state *pA = 
1ee90 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73  *(const struct s
1eea0 74 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73  tate**)a;.  cons
1eeb0 74 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  t struct state *
1eec0 70 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72  pB = *(const str
1eed0 75 63 74 20 73 74 61 74 65 2a 2a 29 62 3b 0a 20  uct state**)b;. 
1eee0 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70   int n;..  n = p
1eef0 42 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41 2d 3e  B->nNtAct - pA->
1ef00 6e 4e 74 41 63 74 3b 0a 20 20 69 66 28 20 6e 3d  nNtAct;.  if( n=
1ef10 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 42  =0 ){.    n = pB
1ef20 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41 2d 3e  ->nTknAct - pA->
1ef30 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 69 66 28  nTknAct;.    if(
1ef40 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e   n==0 ){.      n
1ef50 20 3d 20 70 42 2d 3e 73 74 61 74 65 6e 75 6d 20   = pB->statenum 
1ef60 2d 20 70 41 2d 3e 73 74 61 74 65 6e 75 6d 3b 0a  - pA->statenum;.
1ef70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
1ef80 72 74 28 20 6e 21 3d 30 20 29 3b 0a 20 20 72 65  rt( n!=0 );.  re
1ef90 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
1efa0 2a 20 52 65 6e 75 6d 62 65 72 20 61 6e 64 20 72  * Renumber and r
1efb0 65 73 6f 72 74 20 73 74 61 74 65 73 20 73 6f 20  esort states so 
1efc0 74 68 61 74 20 73 74 61 74 65 73 20 77 69 74 68  that states with
1efd0 20 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a 2a   fewer choices.*
1efe0 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  * occur at the e
1eff0 6e 64 2e 20 20 45 78 63 65 70 74 2c 20 6b 65 65  nd.  Except, kee
1f000 70 20 73 74 61 74 65 20 30 20 61 73 20 74 68 65  p state 0 as the
1f010 20 66 69 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f   first state..*/
1f020 0a 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74  .void ResortStat
1f030 65 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  es(struct lemon 
1f040 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69  *lemp).{.  int i
1f050 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
1f060 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
1f070 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66  action *ap;..  f
1f080 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1f090 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
1f0a0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
1f0b0 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70  rted[i];.    stp
1f0c0 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d  ->nTknAct = stp-
1f0d0 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20 20  >nNtAct = 0;.   
1f0e0 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 6c 65   stp->iDflt = le
1f0f0 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d  mp->nstate + lem
1f100 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 73 74  p->nrule;.    st
1f110 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f  p->iTknOfst = NO
1f120 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70  _OFFSET;.    stp
1f130 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f  ->iNtOfst = NO_O
1f140 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61  FFSET;.    for(a
1f150 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
1f160 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
1f170 20 20 20 69 66 28 20 63 6f 6d 70 75 74 65 5f 61     if( compute_a
1f180 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d  ction(lemp,ap)>=
1f190 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1f1a0 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c   ap->sp->index<l
1f1b0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
1f1c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d  {.          stp-
1f1d0 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20 20  >nTknAct++;.    
1f1e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70      }else if( ap
1f1f0 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70  ->sp->index<lemp
1f200 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20  ->nsymbol ){.   
1f210 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74 41         stp->nNtA
1f220 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  ct++;.        }e
1f230 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1f240 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f 6d 70  tp->iDflt = comp
1f250 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
1f260 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ap);.        }.
1f270 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f280 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70 2d  }.  qsort(&lemp-
1f290 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d 70  >sorted[1], lemp
1f2a0 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a 65  ->nstate-1, size
1f2b0 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  of(lemp->sorted[
1f2c0 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74 61  0]),.        sta
1f2d0 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 29  teResortCompare)
1f2e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
1f2f0 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
1f300 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f 72  ){.    lemp->sor
1f310 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75 6d  ted[i]->statenum
1f320 20 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   = i;.  }.}.../*
1f330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f340 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
1f350 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  set.c" *********
1f360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
1f380 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61 74  ** Set manipulat
1f390 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  ion routines for
1f3a0 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
1f3b0 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
1f3c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a 65  .static int size
1f3d0 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68   = 0;../* Set th
1f3e0 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76 6f  e set size */.vo
1f3f0 69 64 20 53 65 74 53 69 7a 65 28 69 6e 74 20 6e  id SetSize(int n
1f400 29 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b 31  ).{.  size = n+1
1f410 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;.}../* Allocate
1f420 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63 68   a new set */.ch
1f430 61 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20 20  ar *SetNew(){.  
1f440 63 68 61 72 20 2a 73 3b 0a 20 20 73 20 3d 20 28  char *s;.  s = (
1f450 63 68 61 72 2a 29 63 61 6c 6c 6f 63 28 20 73 69  char*)calloc( si
1f460 7a 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 3d  ze, 1);.  if( s=
1f470 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  =0 ){.    extern
1f480 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72   void memory_err
1f490 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  or();.    memory
1f4a0 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20  _error();.  }.  
1f4b0 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20  return s;.}../* 
1f4c0 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74  Deallocate a set
1f4d0 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65 65   */.void SetFree
1f4e0 28 63 68 61 72 20 2a 73 29 0a 7b 0a 20 20 66 72  (char *s).{.  fr
1f4f0 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  ee(s);.}../* Add
1f500 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
1f510 6f 20 74 68 65 20 73 65 74 2e 20 20 52 65 74 75  o the set.  Retu
1f520 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 65  rn TRUE if the e
1f530 6c 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64  lement was added
1f540 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66  .** and FALSE if
1f550 20 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20   it was already 
1f560 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65  there. */.int Se
1f570 74 41 64 64 28 63 68 61 72 20 2a 73 2c 20 69 6e  tAdd(char *s, in
1f580 74 20 65 29 0a 7b 0a 20 20 69 6e 74 20 72 76 3b  t e).{.  int rv;
1f590 0a 20 20 61 73 73 65 72 74 28 20 65 3e 3d 30 20  .  assert( e>=0 
1f5a0 26 26 20 65 3c 73 69 7a 65 20 29 3b 0a 20 20 72  && e<size );.  r
1f5b0 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d  v = s[e];.  s[e]
1f5c0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 21   = 1;.  return !
1f5d0 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76  rv;.}../* Add ev
1f5e0 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73  ery element of s
1f5f0 32 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72 6e  2 to s1.  Return
1f600 20 54 52 55 45 20 69 66 20 73 31 20 63 68 61 6e   TRUE if s1 chan
1f610 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55  ges. */.int SetU
1f620 6e 69 6f 6e 28 63 68 61 72 20 2a 73 31 2c 20 63  nion(char *s1, c
1f630 68 61 72 20 2a 73 32 29 0a 7b 0a 20 20 69 6e 74  har *s2).{.  int
1f640 20 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20   i, progress;.  
1f650 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
1f660 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1f670 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1f680 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  2[i]==0 ) contin
1f690 75 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69  ue;.    if( s1[i
1f6a0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  ]==0 ){.      pr
1f6b0 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20  ogress = 1;.    
1f6c0 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20    s1[i] = 1;.   
1f6d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f6e0 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a  progress;.}./***
1f6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f700 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1f710 65 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a  e "table.c" ****
1f720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f730 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
1f740 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73  All code in this
1f750 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61   file has been a
1f760 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
1f770 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  erated.** from a
1f780 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69   specification i
1f790 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  n the file.**   
1f7a0 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c             "tabl
1f7b0 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61  e.q".** by the a
1f7c0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1f7d0 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70   code building p
1f7e0 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a  rogram "aagen"..
1f7f0 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74  ** Do not edit t
1f800 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65  his file!  Inste
1f810 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65  ad, edit the spe
1f820 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69  cification.** fi
1f830 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61  le, then rerun a
1f840 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43  agen..*/./*.** C
1f850 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ode for processi
1f860 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ng tables in the
1f870 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
1f880 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49  nerator..*/..PRI
1f890 56 41 54 45 20 69 6e 74 20 73 74 72 68 61 73 68  VATE int strhash
1f8a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 78 29 0a  (const char *x).
1f8b0 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20  {.  int h = 0;. 
1f8c0 20 77 68 69 6c 65 28 20 2a 78 29 20 68 20 3d 20   while( *x) h = 
1f8d0 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20  h*13 + *(x++);. 
1f8e0 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
1f8f0 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64   Works like strd
1f900 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61  up, sort of.  Sa
1f910 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  ve a string in m
1f920 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20  alloced memory, 
1f930 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69  but.** keep stri
1f940 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73  ngs in a table s
1f950 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  o that the same 
1f960 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e  string is not in
1f970 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e   more.** than on
1f980 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 6f 6e 73  e place..*/.cons
1f990 74 20 63 68 61 72 20 2a 53 74 72 73 61 66 65 28  t char *Strsafe(
1f9a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 79 29 0a 7b  const char *y).{
1f9b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f9c0 3b 0a 20 20 63 68 61 72 20 2a 63 70 79 3b 0a 0a  ;.  char *cpy;..
1f9d0 20 20 69 66 28 20 79 3d 3d 30 20 29 20 72 65 74    if( y==0 ) ret
1f9e0 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53 74 72  urn 0;.  z = Str
1f9f0 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20  safe_find(y);.  
1fa00 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 63 70 79  if( z==0 && (cpy
1fa10 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28  =(char *)malloc(
1fa20 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79 29 2b   lemonStrlen(y)+
1fa30 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  1 ))!=0 ){.    s
1fa40 74 72 63 70 79 28 63 70 79 2c 79 29 3b 0a 20 20  trcpy(cpy,y);.  
1fa50 20 20 7a 20 3d 20 63 70 79 3b 0a 20 20 20 20 53    z = cpy;.    S
1fa60 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29  trsafe_insert(z)
1fa70 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68  ;.  }.  MemoryCh
1fa80 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  eck(z);.  return
1fa90 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20   z;.}../* There 
1faa0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
1fab0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1fac0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
1fad0 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
1fae0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
1faf0 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x1"..*/.struct
1fb00 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69   s_x1 {.  int si
1fb10 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1fb20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1fb30 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
1fb40 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
1fb70 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
1fb80 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fba0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
1fbb0 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
1fbc0 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
1fbd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fbe0 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
1fbf0 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
1fc00 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74  ruct s_x1node *t
1fc10 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
1fc20 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
1fc30 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64    struct s_x1nod
1fc40 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
1fc50 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
1fc60 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
1fc70 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1fc80 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
1fc90 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
1fca0 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
1fcb0 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
1fcc0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
1fcd0 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x1"..*/.typedef 
1fce0 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
1fcf0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1fd00 64 61 74 61 3b 20 20 20 20 20 20 20 20 2f 2a 20  data;        /* 
1fd10 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
1fd20 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e  ruct s_x1node *n
1fd30 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
1fd40 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
1fd50 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
1fd60 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66  uct s_x1node **f
1fd70 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
1fd80 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f  s link */.} x1no
1fd90 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
1fda0 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
1fdb0 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
1fdc0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
1fdd0 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
1fde0 63 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78  c struct s_x1 *x
1fdf0 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  1a;../* Allocate
1fe00 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
1fe10 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
1fe20 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 7b   Strsafe_init(){
1fe30 0a 20 20 69 66 28 20 78 31 61 20 29 20 72 65 74  .  if( x1a ) ret
1fe40 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73 74  urn;.  x1a = (st
1fe50 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f  ruct s_x1*)mallo
1fe60 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
1fe70 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28 20   s_x1) );.  if( 
1fe80 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e  x1a ){.    x1a->
1fe90 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
1fea0 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x1a->count = 0;
1feb0 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20  .    x1a->tbl = 
1fec0 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x1node*)malloc(
1fed0 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28   .      (sizeof(
1fee0 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x1node) + sizeof
1fef0 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30 32 34 20  (x1node*))*1024 
1ff00 29 3b 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e  );.    if( x1a->
1ff10 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
1ff20 66 72 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20  free(x1a);.     
1ff30 20 78 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x1a = 0;.    }e
1ff40 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1ff50 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20  ;.      x1a->ht 
1ff60 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31  = (x1node**)&(x1
1ff70 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20  a->tbl[1024]);. 
1ff80 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1ff90 31 30 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e  1024; i++) x1a->
1ffa0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
1ffb0 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
1ffc0 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
1ffd0 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
1ffe0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
1fff0 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
20000 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
20010 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
20020 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
20030 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
20040 72 74 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  rt(const char *d
20050 61 74 61 29 0a 7b 0a 20 20 78 31 6e 6f 64 65 20  ata).{.  x1node 
20060 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
20070 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
20080 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  1a==0 ) return 0
20090 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68  ;.  ph = strhash
200a0 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68  (data);.  h = ph
200b0 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29   & (x1a->size-1)
200c0 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74  ;.  np = x1a->ht
200d0 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
200e0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
200f0 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61  mp(np->data,data
20100 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
20110 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
20120 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
20130 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
20140 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
20150 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
20160 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
20170 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
20180 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
20190 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
201a0 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e  .  if( x1a->coun
201b0 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x1a->size ){.
201c0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
201d0 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
201e0 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
201f0 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20   int i,size;.   
20200 20 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72   struct s_x1 arr
20210 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
20220 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d  ze = size = x1a-
20230 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
20240 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e  ay.count = x1a->
20250 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
20260 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29  .tbl = (x1node*)
20270 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73  malloc(.      (s
20280 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20  izeof(x1node) + 
20290 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29  sizeof(x1node*))
202a0 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  *size );.    if(
202b0 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
202c0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
202d0 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
202e0 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
202f0 61 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f  array.ht = (x1no
20300 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
20310 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  [size]);.    for
20320 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
20330 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
20340 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
20350 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x1a->count; i
20360 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64  ++){.      x1nod
20370 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
20380 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
20390 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x1a->tbl[i]);.
203a0 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73        h = strhas
203b0 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26  h(oldnp->data) &
203c0 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
203d0 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
203e0 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
203f0 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
20400 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
20410 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
20420 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
20430 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
20440 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
20450 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70  np->data = oldnp
20460 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65  ->data;.      ne
20470 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72  wnp->from = &(ar
20480 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20  ray.ht[h]);.    
20490 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20    array.ht[h] = 
204a0 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20  newnp;.    }.   
204b0 20 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b   free(x1a->tbl);
204c0 0a 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72 61  .    *x1a = arra
204d0 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65  y;.  }.  /* Inse
204e0 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20  rt the new data 
204f0 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  */.  h = ph & (x
20500 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  1a->size-1);.  n
20510 70 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78  p = &(x1a->tbl[x
20520 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20  1a->count++]);. 
20530 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
20540 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b  ;.  if( x1a->ht[
20550 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d  h] ) x1a->ht[h]-
20560 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
20570 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
20580 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x1a->ht[h];.  
20590 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x1a->ht[h] = np;
205a0 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
205b0 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x1a->ht[h]);.  r
205c0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
205d0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
205e0 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
205f0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
20600 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
20610 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
20620 79 2e 20 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  y. */.const char
20630 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28 63   *Strsafe_find(c
20640 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a  onst char *key).
20650 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 31 6e  {.  int h;.  x1n
20660 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
20670 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x1a==0 ) return 
20680 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68  0;.  h = strhash
20690 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69  (key) & (x1a->si
206a0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31  ze-1);.  np = x1
206b0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
206c0 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
206d0 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61   strcmp(np->data
206e0 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
206f0 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
20700 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
20710 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
20720 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
20730 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
20740 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20  he (terminal or 
20750 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d  nonterminal) sym
20760 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61  bol "x"..** Crea
20770 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20  te a new symbol 
20780 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
20790 69 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61  irst time "x" ha
207a0 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a  s been seen..*/.
207b0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
207c0 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73 74 20  ymbol_new(const 
207d0 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73 74 72  char *x).{.  str
207e0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
207f0 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66  .  sp = Symbol_f
20800 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70  ind(x);.  if( sp
20810 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  ==0 ){.    sp = 
20820 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
20830 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f  )calloc(1, sizeo
20840 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 29  f(struct symbol)
20850 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68   );.    MemoryCh
20860 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70 2d  eck(sp);.    sp-
20870 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65 28  >name = Strsafe(
20880 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70 65  x);.    sp->type
20890 20 3d 20 69 73 75 70 70 65 72 28 2a 78 29 20 3f   = isupper(*x) ?
208a0 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54   TERMINAL : NONT
208b0 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d  ERMINAL;.    sp-
208c0 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73  >rule = 0;.    s
208d0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
208e0 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20  .    sp->prec = 
208f0 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f  -1;.    sp->asso
20900 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d  c = UNK;.    sp-
20910 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a 20  >firstset = 0;. 
20920 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20     sp->lambda = 
20930 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 20  LEMON_FALSE;.   
20940 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20   sp->destructor 
20950 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73  = 0;.    sp->des
20960 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 20  tLineno = 0;.   
20970 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d 20   sp->datatype = 
20980 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65 43 6e  0;.    sp->useCn
20990 74 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f  t = 0;.    Symbo
209a0 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e  l_insert(sp,sp->
209b0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 70 2d  name);.  }.  sp-
209c0 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72 65 74  >useCnt++;.  ret
209d0 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f  urn sp;.}../* Co
209e0 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c  mpare two symbol
209f0 73 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 70 75  s for working pu
20a00 72 70 6f 73 65 73 0a 2a 2a 0a 2a 2a 20 53 79 6d  rposes.**.** Sym
20a10 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20  bols that begin 
20a20 77 69 74 68 20 75 70 70 65 72 20 63 61 73 65 20  with upper case 
20a30 6c 65 74 74 65 72 73 20 28 74 65 72 6d 69 6e 61  letters (termina
20a40 6c 73 20 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a  ls or tokens).**
20a50 20 6d 75 73 74 20 73 6f 72 74 20 62 65 66 6f 72   must sort befor
20a60 65 20 73 79 6d 62 6f 6c 73 20 74 68 61 74 20 62  e symbols that b
20a70 65 67 69 6e 20 77 69 74 68 20 6c 6f 77 65 72 20  egin with lower 
20a80 63 61 73 65 20 6c 65 74 74 65 72 73 0a 2a 2a 20  case letters.** 
20a90 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 29 2e  (non-terminals).
20aa0 20 20 4f 74 68 65 72 20 74 68 61 6e 20 74 68 61    Other than tha
20ab0 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65  t, the order doe
20ac0 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a 2a  s not matter..**
20ad0 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78 70 65  .** We find expe
20ae0 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74 20  rimentally that 
20af0 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79 6d 62  leaving the symb
20b00 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f 72 69  ols in their ori
20b10 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20 28  ginal.** order (
20b20 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20 61  the order they a
20b30 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20 67  ppeared in the g
20b40 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67 69 76  rammar file) giv
20b50 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65  es the.** smalle
20b60 73 74 20 70 61 72 73 65 72 20 74 61 62 6c 65 73  st parser tables
20b70 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69   in SQLite..*/.i
20b80 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f  nt Symbolcmpp(co
20b90 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c 20 63 6f  nst void *_a, co
20ba0 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29 0a 7b 0a  nst void *_b).{.
20bb0 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
20bc0 79 6d 62 6f 6c 20 2a 2a 61 20 3d 20 28 63 6f 6e  ymbol **a = (con
20bd0 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  st struct symbol
20be0 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74   **) _a;.  const
20bf0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
20c00 2a 62 20 3d 20 28 63 6f 6e 73 74 20 73 74 72 75  *b = (const stru
20c10 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 5f 62  ct symbol **) _b
20c20 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20 28 2a 2a  ;.  int i1 = (**
20c30 61 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30  a).index + 10000
20c40 30 30 30 2a 28 28 2a 2a 61 29 2e 6e 61 6d 65 5b  000*((**a).name[
20c50 30 5d 3e 27 5a 27 29 3b 0a 20 20 69 6e 74 20 69  0]>'Z');.  int i
20c60 32 20 3d 20 28 2a 2a 62 29 2e 69 6e 64 65 78 20  2 = (**b).index 
20c70 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a 62  + 10000000*((**b
20c80 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a  ).name[0]>'Z');.
20c90 20 20 61 73 73 65 72 74 28 20 69 31 21 3d 69 32    assert( i1!=i2
20ca0 20 7c 7c 20 73 74 72 63 6d 70 28 28 2a 2a 61 29   || strcmp((**a)
20cb0 2e 6e 61 6d 65 2c 28 2a 2a 62 29 2e 6e 61 6d 65  .name,(**b).name
20cc0 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
20cd0 20 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68   i1-i2;.}../* Th
20ce0 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
20cf0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
20d00 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
20d10 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
20d20 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
20d30 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74  type "x2"..*/.st
20d40 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e  ruct s_x2 {.  in
20d50 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
20d60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
20d70 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
20d80 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20da0 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
20db0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
20dc0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
20dd0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
20de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
20df0 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
20e00 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
20e10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20e20 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
20e30 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
20e40 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
20e50 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
20e60 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
20e70 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
20e80 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  2node **ht;  /* 
20e90 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
20ea0 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
20eb0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
20ec0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
20ed0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
20ee0 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
20ef0 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
20f00 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
20f10 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x2"..*/.type
20f20 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e  def struct s_x2n
20f30 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
20f40 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20  ymbol *data;    
20f50 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
20f60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65    const char *ke
20f70 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y;         /* Th
20f80 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
20f90 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74  t s_x2node *next
20fa0 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
20fb0 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
20fc0 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
20fd0 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x2node **from
20fe0 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
20ff0 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b  ink */.} x2node;
21000 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
21010 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
21020 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
21030 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
21040 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
21050 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61 3b  truct s_x2 *x2a;
21060 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
21070 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
21080 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79  array */.void Sy
21090 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69  mbol_init(){.  i
210a0 66 28 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b  f( x2a ) return;
210b0 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75 63 74  .  x2a = (struct
210c0 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x2*)malloc( s
210d0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
210e0 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20  2) );.  if( x2a 
210f0 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65  ){.    x2a->size
21100 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d   = 128;.    x2a-
21110 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
21120 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f  x2a->tbl = (x2no
21130 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20  de*)malloc( .   
21140 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64     (sizeof(x2nod
21150 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f  e) + sizeof(x2no
21160 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20 20  de*))*128 );.   
21170 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30   if( x2a->tbl==0
21180 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
21190 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d  2a);.      x2a =
211a0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
211b0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
211c0 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e    x2a->ht = (x2n
211d0 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c  ode**)&(x2a->tbl
211e0 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f  [128]);.      fo
211f0 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b  r(i=0; i<128; i+
21200 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x2a->ht[i] = 
21210 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
21220 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
21230 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
21240 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
21250 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
21260 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
21270 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
21280 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
21290 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  tten */.int Symb
212a0 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74  ol_insert(struct
212b0 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 2c 20 63   symbol *data, c
212c0 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79 29 0a  onst char *key).
212d0 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x2node *np;.
212e0 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70    int h;.  int p
212f0 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  h;..  if( x2a==0
21300 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
21310 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
21320 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  ;.  h = ph & (x2
21330 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
21340 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
21350 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
21360 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
21370 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a  >key,key)==0 ){.
21380 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
21390 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
213a0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
213b0 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
213c0 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
213d0 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
213e0 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
213f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
21400 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
21410 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
21420 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e  2a->count>=x2a->
21430 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
21440 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
21450 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
21460 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73  r */.    int i,s
21470 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ize;.    struct 
21480 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20 20  s_x2 array;.    
21490 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a  array.size = siz
214a0 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b  e = x2a->size*2;
214b0 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
214c0 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x2a->count;. 
214d0 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
214e0 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a  x2node*)malloc(.
214f0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32        (sizeof(x2
21500 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
21510 32 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b  2node*))*size );
21520 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
21530 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
21540 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
21550 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
21560 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
21570 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61   = (x2node**)&(a
21580 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b  rray.tbl[size]);
21590 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
215a0 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
215b0 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
215c0 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e  for(i=0; i<x2a->
215d0 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
215e0 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x2node *oldnp
215f0 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
21600 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74  oldnp = &(x2a->t
21610 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
21620 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d  = strhash(oldnp-
21630 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29  >key) & (size-1)
21640 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
21650 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
21660 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
21670 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
21680 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
21690 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
216a0 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
216b0 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
216c0 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d      newnp->key =
216d0 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20   oldnp->key;.   
216e0 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
216f0 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
21700 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
21710 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
21720 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
21730 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
21740 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61 2d   }.    free(x2a-
21750 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20  >tbl);.    *x2a 
21760 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
21770 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
21780 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
21790 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  h & (x2a->size-1
217a0 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61 2d  );.  np = &(x2a-
217b0 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x2a->count+
217c0 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d  +]);.  np->key =
217d0 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61   key;.  np->data
217e0 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
217f0 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d  2a->ht[h] ) x2a-
21800 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
21810 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
21820 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68 74  ->next = x2a->ht
21830 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68  [h];.  x2a->ht[h
21840 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
21850 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68  om = &(x2a->ht[h
21860 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
21870 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
21880 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
21890 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
218a0 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
218b0 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
218c0 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
218d0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
218e0 6f 6c 5f 66 69 6e 64 28 63 6f 6e 73 74 20 63 68  ol_find(const ch
218f0 61 72 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74  ar *key).{.  int
21900 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70   h;.  x2node *np
21910 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20  ;..  if( x2a==0 
21920 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
21930 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26  = strhash(key) &
21940 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
21950 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68    np = x2a->ht[h
21960 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
21970 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
21980 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
21990 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
219a0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
219b0 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
219c0 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
219d0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d  /* Return the n-
219e0 74 68 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e  th data.  Return
219f0 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75   NULL if n is ou
21a00 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73  t of range. */.s
21a10 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
21a20 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 20 6e 29 0a  mbol_Nth(int n).
21a30 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
21a40 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78  l *data;.  if( x
21a50 32 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d  2a && n>0 && n<=
21a60 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20  x2a->count ){.  
21a70 20 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62    data = x2a->tb
21a80 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d  l[n-1].data;.  }
21a90 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d  else{.    data =
21aa0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
21ab0 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74   data;.}../* Ret
21ac0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
21ad0 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74  the array */.int
21ae0 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a   Symbol_count().
21af0 7b 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f  {.  return x2a ?
21b00 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b   x2a->count : 0;
21b10 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e  .}../* Return an
21b20 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
21b30 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69  rs to all data i
21b40 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
21b50 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  The array is obt
21b60 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
21b70 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  c.  Return NULL 
21b80 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  if memory alloca
21b90 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73  tion.** problems
21ba0 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61  , or if the arra
21bb0 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73  y is empty. */.s
21bc0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53  truct symbol **S
21bd0 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a  ymbol_arrayof().
21be0 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
21bf0 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74  l **array;.  int
21c00 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78   i,size;.  if( x
21c10 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  2a==0 ) return 0
21c20 3b 0a 20 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e  ;.  size = x2a->
21c30 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d  count;.  array =
21c40 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
21c50 2a 2a 29 63 61 6c 6c 6f 63 28 73 69 7a 65 2c 20  **)calloc(size, 
21c60 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
21c70 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66 28 20  mbol *));.  if( 
21c80 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72  array ){.    for
21c90 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
21ca0 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 32  +) array[i] = x2
21cb0 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a  a->tbl[i].data;.
21cc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72    }.  return arr
21cd0 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72  ay;.}../* Compar
21ce0 65 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61 74  e two configurat
21cf0 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66  ions */.int Conf
21d00 69 67 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72  igcmp(const char
21d10 20 2a 5f 61 2c 63 6f 6e 73 74 20 63 68 61 72 20   *_a,const char 
21d20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 73  *_b).{.  const s
21d30 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 20  truct config *a 
21d40 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
21d50 20 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74 20   *) _a;.  const 
21d60 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
21d70 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
21d80 67 20 2a 29 20 5f 62 3b 0a 20 20 69 6e 74 20 78  g *) _b;.  int x
21d90 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69  ;.  x = a->rp->i
21da0 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e  ndex - b->rp->in
21db0 64 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20  dex;.  if( x==0 
21dc0 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62  ) x = a->dot - b
21dd0 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20  ->dot;.  return 
21de0 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  x;.}../* Compare
21df0 20 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50   two states */.P
21e00 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74 65  RIVATE int state
21e10 63 6d 70 28 73 74 72 75 63 74 20 63 6f 6e 66 69  cmp(struct confi
21e20 67 20 2a 61 2c 20 73 74 72 75 63 74 20 63 6f 6e  g *a, struct con
21e30 66 69 67 20 2a 62 29 0a 7b 0a 20 20 69 6e 74 20  fig *b).{.  int 
21e40 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20  rc;.  for(rc=0; 
21e50 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62 3b  rc==0 && a && b;
21e60 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e    a=a->bp, b=b->
21e70 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d  bp){.    rc = a-
21e80 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e  >rp->index - b->
21e90 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69  rp->index;.    i
21ea0 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
21eb0 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b  a->dot - b->dot;
21ec0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
21ed0 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29 20   ){.    if( a ) 
21ee0 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  rc = 1;.    if( 
21ef0 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d  b ) rc = -1;.  }
21f00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21f10 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74 65  ./* Hash a state
21f20 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20   */.PRIVATE int 
21f30 73 74 61 74 65 68 61 73 68 28 73 74 72 75 63 74  statehash(struct
21f40 20 63 6f 6e 66 69 67 20 2a 61 29 0a 7b 0a 20 20   config *a).{.  
21f50 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65  int h=0;.  while
21f60 28 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68  ( a ){.    h = h
21f70 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e  *571 + a->rp->in
21f80 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b  dex*37 + a->dot;
21f90 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a  .    a = a->bp;.
21fa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a    }.  return h;.
21fb0 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  }../* Allocate a
21fc0 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63   new state struc
21fd0 74 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73  ture */.struct s
21fe0 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28  tate *State_new(
21ff0 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ).{.  struct sta
22000 74 65 20 2a 6e 65 77 73 74 61 74 65 3b 0a 20 20  te *newstate;.  
22010 6e 65 77 73 74 61 74 65 20 3d 20 28 73 74 72 75  newstate = (stru
22020 63 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f  ct state *)callo
22030 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  c(1, sizeof(stru
22040 63 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d  ct state) );.  M
22050 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 73 74  emoryCheck(newst
22060 61 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  ate);.  return n
22070 65 77 73 74 61 74 65 3b 0a 7d 0a 0a 2f 2a 20 54  ewstate;.}../* T
22080 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
22090 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
220a0 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
220b0 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f  for each.** asso
220c0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
220d0 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73   type "x3"..*/.s
220e0 74 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69  truct s_x3 {.  i
220f0 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
22100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
22110 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
22120 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20  e slots. */.    
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22140 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20        /*   Must 
22150 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
22160 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
22170 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22190 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a    equal to 1 */.
221a0 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20    int count;    
221b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
221c0 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79  ber of currently
221d0 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f   slots filled */
221e0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
221f0 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65  de *tbl;  /* The
22200 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72   data stored her
22210 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  e */.  struct s_
22220 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a  x3node **ht;  /*
22230 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   Hash table for 
22240 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f  lookups */.};../
22250 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
22260 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
22270 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76  structure for ev
22280 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ery data element
22290 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69  .** in an associ
222a0 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
222b0 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70  ype "x3"..*/.typ
222c0 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 33  edef struct s_x3
222d0 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20  node {.  struct 
222e0 73 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20  state *data;    
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22300 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
22310 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
22320 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
22330 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
22340 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
22350 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
22360 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
22370 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
22380 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
22390 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
223a0 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
223b0 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x3node;../* T
223c0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
223d0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
223e0 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
223f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
22400 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
22410 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41  s_x3 *x3a;../* A
22420 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
22430 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
22440 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e  */.void State_in
22450 69 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61 20  it(){.  if( x3a 
22460 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20  ) return;.  x3a 
22470 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29  = (struct s_x3*)
22480 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
22490 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20  truct s_x3) );. 
224a0 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20   if( x3a ){.    
224b0 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x3a->size = 128;
224c0 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20  .    x3a->count 
224d0 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62  = 0;.    x3a->tb
224e0 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c  l = (x3node*)mal
224f0 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a  loc( .      (siz
22500 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69  eof(x3node) + si
22510 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 31  zeof(x3node*))*1
22520 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 33  28 );.    if( x3
22530 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
22540 20 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20 20     free(x3a);.  
22550 20 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20 20      x3a = 0;.   
22560 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
22570 74 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e  t i;.      x3a->
22580 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26  ht = (x3node**)&
22590 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b  (x3a->tbl[128]);
225a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
225b0 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d  i<128; i++) x3a-
225c0 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
225d0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
225e0 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
225f0 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
22600 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
22610 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
22620 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
22630 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
22640 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
22650 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72  .int State_inser
22660 74 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  t(struct state *
22670 64 61 74 61 2c 20 73 74 72 75 63 74 20 63 6f 6e  data, struct con
22680 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 78 33  fig *key).{.  x3
22690 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20  node *np;.  int 
226a0 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20  h;.  int ph;..  
226b0 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
226c0 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74  urn 0;.  ph = st
226d0 61 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20 20  atehash(key);.  
226e0 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73  h = ph & (x3a->s
226f0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
22700 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  3a->ht[h];.  whi
22710 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
22720 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b  ( statecmp(np->k
22730 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  ey,key)==0 ){.  
22740 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
22750 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
22760 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
22770 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
22780 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
22790 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
227a0 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
227b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
227c0 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
227d0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33 61  t;.  }.  if( x3a
227e0 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69  ->count>=x3a->si
227f0 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
22800 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
22810 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
22820 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a  */.    int i,siz
22830 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f  e;.    struct s_
22840 78 33 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72  x3 array;.    ar
22850 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20  ray.size = size 
22860 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x3a->size*2;. 
22870 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
22880 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x3a->count;.   
22890 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 33   array.tbl = (x3
228a0 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20  node*)malloc(.  
228b0 20 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f      (sizeof(x3no
228c0 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e  de) + sizeof(x3n
228d0 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20  ode*))*size );. 
228e0 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
228f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
22900 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
22910 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
22920 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
22930 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x3node**)&(arr
22940 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20  ay.tbl[size]);. 
22950 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
22960 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68  ze; i++) array.h
22970 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t[i] = 0;.    fo
22980 72 28 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f  r(i=0; i<x3a->co
22990 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unt; i++){.     
229a0 20 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20   x3node *oldnp, 
229b0 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c  *newnp;.      ol
229c0 64 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c  dnp = &(x3a->tbl
229d0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  [i]);.      h = 
229e0 73 74 61 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d  statehash(oldnp-
229f0 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29  >key) & (size-1)
22a00 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
22a10 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
22a20 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
22a30 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
22a40 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
22a50 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
22a60 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
22a70 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
22a80 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d      newnp->key =
22a90 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20   oldnp->key;.   
22aa0 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
22ab0 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
22ac0 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
22ad0 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
22ae0 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
22af0 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
22b00 20 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61 2d   }.    free(x3a-
22b10 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20  >tbl);.    *x3a 
22b20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
22b30 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
22b40 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
22b50 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  h & (x3a->size-1
22b60 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61 2d  );.  np = &(x3a-
22b70 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x3a->count+
22b80 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d  +]);.  np->key =
22b90 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61   key;.  np->data
22ba0 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
22bb0 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d  3a->ht[h] ) x3a-
22bc0 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
22bd0 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
22be0 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68 74  ->next = x3a->ht
22bf0 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68  [h];.  x3a->ht[h
22c00 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
22c10 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68  om = &(x3a->ht[h
22c20 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
22c30 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
22c40 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
22c50 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
22c60 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
22c70 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
22c80 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
22c90 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65  uct state *State
22ca0 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63 6f 6e  _find(struct con
22cb0 66 69 67 20 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e  fig *key).{.  in
22cc0 74 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  t h;.  x3node *n
22cd0 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30  p;..  if( x3a==0
22ce0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
22cf0 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79   = statehash(key
22d00 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  ) & (x3a->size-1
22d10 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68  );.  np = x3a->h
22d20 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
22d30 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  p ){.    if( sta
22d40 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  tecmp(np->key,ke
22d50 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  y)==0 ) break;. 
22d60 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
22d70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
22d80 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30  p ? np->data : 0
22d90 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
22da0 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
22db0 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20  ers to all data 
22dc0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
22dd0 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62   The array is ob
22de0 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
22df0 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  oc.  Return NULL
22e00 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   if memory alloc
22e10 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d  ation.** problem
22e20 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72  s, or if the arr
22e30 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  ay is empty. */.
22e40 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53  struct state **S
22e50 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b  tate_arrayof().{
22e60 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
22e70 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69  **array;.  int i
22e80 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61  ,size;.  if( x3a
22e90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
22ea0 20 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f    size = x3a->co
22eb0 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28  unt;.  array = (
22ec0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29  struct state **)
22ed0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
22ee0 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 2a 73  truct state *)*s
22ef0 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 61 72 72  ize );.  if( arr
22f00 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ay ){.    for(i=
22f10 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
22f20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e  array[i] = x3a->
22f30 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d  tbl[i].data;.  }
22f40 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b  .  return array;
22f50 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f  .}../* Hash a co
22f60 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50  nfiguration */.P
22f70 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6e 66 69  RIVATE int confi
22f80 67 68 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e  ghash(struct con
22f90 66 69 67 20 2a 61 29 0a 7b 0a 20 20 69 6e 74 20  fig *a).{.  int 
22fa0 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31  h=0;.  h = h*571
22fb0 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a   + a->rp->index*
22fc0 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72  37 + a->dot;.  r
22fd0 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54  eturn h;.}../* T
22fe0 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
22ff0 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
23000 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
23010 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f  for each.** asso
23020 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
23030 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73   type "x4"..*/.s
23040 74 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20 69  truct s_x4 {.  i
23050 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
23060 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
23070 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
23080 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20  e slots. */.    
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20        /*   Must 
230b0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
230c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
230d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
230f0 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a    equal to 1 */.
23100 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20    int count;    
23110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23120 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79  ber of currently
23130 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f   slots filled */
23140 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
23150 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65  de *tbl;  /* The
23160 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72   data stored her
23170 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  e */.  struct s_
23180 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a  x4node **ht;  /*
23190 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   Hash table for 
231a0 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f  lookups */.};../
231b0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
231c0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
231d0 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76  structure for ev
231e0 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ery data element
231f0 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69  .** in an associ
23200 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
23210 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70  ype "x4"..*/.typ
23220 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 34  edef struct s_x4
23230 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20  node {.  struct 
23240 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20 20  config *data;   
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23260 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
23270 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
23280 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
23290 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
232a0 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
232b0 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
232c0 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
232d0 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34  ous link */.} x4
232e0 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
232f0 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
23300 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
23310 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
23320 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
23330 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 34 20  tic struct s_x4 
23340 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x4a;../* Alloca
23350 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
23360 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
23370 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  id Configtable_i
23380 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 34 61  nit(){.  if( x4a
23390 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 34 61   ) return;.  x4a
233a0 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 34 2a   = (struct s_x4*
233b0 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
233c0 73 74 72 75 63 74 20 73 5f 78 34 29 20 29 3b 0a  struct s_x4) );.
233d0 20 20 69 66 28 20 78 34 61 20 29 7b 0a 20 20 20    if( x4a ){.   
233e0 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b   x4a->size = 64;
233f0 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20  .    x4a->count 
23400 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62  = 0;.    x4a->tb
23410 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c  l = (x4node*)mal
23420 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a  loc( .      (siz
23430 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69  eof(x4node) + si
23440 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 36  zeof(x4node*))*6
23450 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 34 61  4 );.    if( x4a
23460 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
23470 20 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20 20    free(x4a);.   
23480 20 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20 20     x4a = 0;.    
23490 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
234a0 20 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e 68   i;.      x4a->h
234b0 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28  t = (x4node**)&(
234c0 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20  x4a->tbl[64]);. 
234d0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
234e0 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74  64; i++) x4a->ht
234f0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
23500 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
23510 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
23520 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
23530 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
23540 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
23550 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
23560 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
23570 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
23580 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  t Configtable_in
23590 73 65 72 74 28 73 74 72 75 63 74 20 63 6f 6e 66  sert(struct conf
235a0 69 67 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78 34  ig *data).{.  x4
235b0 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20  node *np;.  int 
235c0 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20  h;.  int ph;..  
235d0 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74  if( x4a==0 ) ret
235e0 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f  urn 0;.  ph = co
235f0 6e 66 69 67 68 61 73 68 28 64 61 74 61 29 3b 0a  nfighash(data);.
23600 20 20 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d    h = ph & (x4a-
23610 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
23620 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x4a->ht[h];.  w
23630 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
23640 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 28 63  if( Configcmp((c
23650 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 6e 70 2d  onst char *) np-
23660 3e 64 61 74 61 2c 28 63 6f 6e 73 74 20 63 68 61  >data,(const cha
23670 72 20 2a 29 20 64 61 74 61 29 3d 3d 30 20 29 7b  r *) data)==0 ){
23680 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
23690 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
236a0 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
236b0 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
236c0 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
236d0 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
236e0 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
236f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
23700 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
23710 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
23720 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d  x4a->count>=x4a-
23730 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
23740 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
23750 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
23760 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
23770 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
23780 20 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20 20   s_x4 array;.   
23790 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
237a0 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32  ze = x4a->size*2
237b0 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
237c0 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x4a->count;.
237d0 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
237e0 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x4node*)malloc(
237f0 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
23800 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  4node) + sizeof(
23810 78 34 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x4node*))*size )
23820 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
23830 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
23840 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
23850 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
23860 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
23870 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28  t = (x4node**)&(
23880 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
23890 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
238a0 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
238b0 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
238c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d   for(i=0; i<x4a-
238d0 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
238e0 20 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e      x4node *oldn
238f0 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
23900 20 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e   oldnp = &(x4a->
23910 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
23920 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c   = confighash(ol
23930 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69  dnp->data) & (si
23940 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
23950 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
23960 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
23970 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
23980 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
23990 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
239a0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
239b0 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
239c0 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
239d0 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61  data = oldnp->da
239e0 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ta;.      newnp-
239f0 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e  >from = &(array.
23a00 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72  ht[h]);.      ar
23a10 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e  ray.ht[h] = newn
23a20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65  p;.    }.    fre
23a30 65 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20  e(x4a->tbl);.   
23a40 20 2a 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20   *x4a = array;. 
23a50 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74   }.  /* Insert t
23a60 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20  he new data */. 
23a70 20 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e   h = ph & (x4a->
23a80 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
23a90 26 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e  &(x4a->tbl[x4a->
23aa0 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d  count++]);.  np-
23ab0 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
23ac0 69 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29  if( x4a->ht[h] )
23ad0 20 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x4a->ht[h]->fro
23ae0 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
23af0 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34  .  np->next = x4
23b00 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d  a->ht[h];.  x4a-
23b10 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
23b20 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d  p->from = &(x4a-
23b30 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
23b40 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
23b50 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
23b60 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
23b70 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
23b80 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
23b90 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
23ba0 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
23bb0 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e  *Configtable_fin
23bc0 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  d(struct config 
23bd0 2a 6b 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b  *key).{.  int h;
23be0 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x4node *np;..
23bf0 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72    if( x4a==0 ) r
23c00 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63  eturn 0;.  h = c
23c10 6f 6e 66 69 67 68 61 73 68 28 6b 65 79 29 20 26  onfighash(key) &
23c20 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
23c30 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68    np = x4a->ht[h
23c40 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
23c50 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67  {.    if( Config
23c60 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20  cmp((const char 
23c70 2a 29 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e  *) np->data,(con
23c80 73 74 20 63 68 61 72 20 2a 29 20 6b 65 79 29 3d  st char *) key)=
23c90 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
23ca0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
23cb0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f   }.  return np ?
23cc0 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d   np->data : 0;.}
23cd0 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  ../* Remove all 
23ce0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61  data from the ta
23cf0 62 6c 65 2e 20 20 50 61 73 73 20 65 61 63 68 20  ble.  Pass each 
23d00 64 61 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63  data to the func
23d10 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69  tion "f".** as i
23d20 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28  t is removed.  (
23d30 22 66 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20  "f" may be null 
23d40 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 73 74  to avoid this st
23d50 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  ep.) */.void Con
23d60 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69  figtable_clear(i
23d70 6e 74 28 2a 66 29 28 73 74 72 75 63 74 20 63 6f  nt(*f)(struct co
23d80 6e 66 69 67 20 2a 29 29 0a 7b 0a 20 20 69 6e 74  nfig *)).{.  int
23d90 20 69 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30   i;.  if( x4a==0
23da0 20 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d   || x4a->count==
23db0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
23dc0 28 20 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  ( f ) for(i=0; i
23dd0 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x4a->count; i++
23de0 29 20 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b  ) (*f)(x4a->tbl[
23df0 69 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28  i].data);.  for(
23e00 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65  i=0; i<x4a->size
23e10 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69  ; i++) x4a->ht[i
23e20 5d 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f  ] = 0;.  x4a->co
23e30 75 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  unt = 0;.  retur
23e40 6e 3b 0a 7d 0a                                   n;.}.