/ Hex Artifact Content
Login

Artifact 1f0e96515c12e9e413f5b8fdebc79ddcf18ddc9d:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 31 2c 20 31 39 39 34 2c 20  (c) 1991, 1994, 
0020: 31 39 39 37 2c 20 31 39 39 38 20 44 2e 20 52 69  1997, 1998 D. Ri
0030: 63 68 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a  chard Hipp.**.**
0040: 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61   This file conta
0050: 69 6e 73 20 61 6c 6c 20 73 6f 75 72 63 65 73 20  ins all sources 
0060: 28 69 6e 63 6c 75 64 69 6e 67 20 68 65 61 64 65  (including heade
0070: 72 73 29 20 74 6f 20 74 68 65 20 4c 45 4d 4f 4e  rs) to the LEMON
0080: 0a 2a 2a 20 4c 41 4c 52 28 31 29 20 70 61 72 73  .** LALR(1) pars
0090: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 20 20 54  er generator.  T
00a0: 68 65 20 73 6f 75 72 63 65 73 20 68 61 76 65 20  he sources have 
00b0: 62 65 65 6e 20 63 6f 6d 62 69 6e 65 64 20 69 6e  been combined in
00c0: 74 6f 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 66  to a.** single f
00d0: 69 6c 65 20 74 6f 20 6d 61 6b 65 20 69 74 20 65  ile to make it e
00e0: 61 73 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 4c  asy to include L
00f0: 45 4d 4f 4e 20 61 73 20 70 61 72 74 20 6f 66 20  EMON as part of 
0100: 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 67 72  another.** progr
0110: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  am..**.** This p
0120: 72 6f 67 72 61 6d 20 69 73 20 66 72 65 65 20 73  rogram is free s
0130: 6f 66 74 77 61 72 65 3b 20 79 6f 75 20 63 61 6e  oftware; you can
0140: 20 72 65 64 69 73 74 72 69 62 75 74 65 20 69 74   redistribute it
0150: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 6d 6f 64 69 66   and/or.** modif
0160: 79 20 69 74 20 75 6e 64 65 72 20 74 68 65 20 74  y it under the t
0170: 65 72 6d 73 20 6f 66 20 74 68 65 20 47 4e 55 20  erms of the GNU 
0180: 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 0a 2a  General Public.*
0190: 2a 20 4c 69 63 65 6e 73 65 20 61 73 20 70 75 62  * License as pub
01a0: 6c 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72  lished by the Fr
01b0: 65 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e  ee Software Foun
01c0: 64 61 74 69 6f 6e 3b 20 65 69 74 68 65 72 0a 2a  dation; either.*
01d0: 2a 20 76 65 72 73 69 6f 6e 20 32 20 6f 66 20 74  * version 2 of t
01e0: 68 65 20 4c 69 63 65 6e 73 65 2c 20 6f 72 20 28  he License, or (
01f0: 61 74 20 79 6f 75 72 20 6f 70 74 69 6f 6e 29 20  at your option) 
0200: 61 6e 79 20 6c 61 74 65 72 20 76 65 72 73 69 6f  any later versio
0210: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 72  n..**.** This pr
0220: 6f 67 72 61 6d 20 69 73 20 64 69 73 74 72 69 62  ogram is distrib
0230: 75 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70 65  uted in the hope
0240: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
0250: 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62 75 74 20   useful,.** but 
0260: 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41 52 52  WITHOUT ANY WARR
0270: 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20 65 76  ANTY; without ev
0280: 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 64 20 77  en the implied w
0290: 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a 20 4d 45  arranty of.** ME
02a0: 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20 6f 72  RCHANTABILITY or
02b0: 20 46 49 54 4e 45 53 53 20 46 4f 52 20 41 20 50   FITNESS FOR A P
02c0: 41 52 54 49 43 55 4c 41 52 20 50 55 52 50 4f 53  ARTICULAR PURPOS
02d0: 45 2e 20 20 53 65 65 20 74 68 65 20 47 4e 55 0a  E.  See the GNU.
02e0: 2a 2a 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69  ** General Publi
02f0: 63 20 4c 69 63 65 6e 73 65 20 66 6f 72 20 6d 6f  c License for mo
0300: 72 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 20 0a  re details..** .
0310: 2a 2a 20 59 6f 75 20 73 68 6f 75 6c 64 20 68 61  ** You should ha
0320: 76 65 20 72 65 63 65 69 76 65 64 20 61 20 63 6f  ve received a co
0330: 70 79 20 6f 66 20 74 68 65 20 47 4e 55 20 47 65  py of the GNU Ge
0340: 6e 65 72 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20  neral Public.** 
0350: 4c 69 63 65 6e 73 65 20 61 6c 6f 6e 67 20 77 69  License along wi
0360: 74 68 20 74 68 69 73 20 6c 69 62 72 61 72 79 3b  th this library;
0370: 20 69 66 20 6e 6f 74 2c 20 77 72 69 74 65 20 74   if not, write t
0380: 6f 20 74 68 65 0a 2a 2a 20 46 72 65 65 20 53 6f  o the.** Free So
0390: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
03a0: 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 54 65 6d 70  n, Inc., 59 Temp
03b0: 6c 65 20 50 6c 61 63 65 20 2d 20 53 75 69 74 65  le Place - Suite
03c0: 20 33 33 30 2c 0a 2a 2a 20 42 6f 73 74 6f 6e 2c   330,.** Boston,
03d0: 20 4d 41 20 20 30 32 31 31 31 2d 31 33 30 37 2c   MA  02111-1307,
03e0: 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68   USA..**.** Auth
03f0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72  or contact infor
0400: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68  mation:.**   drh
0410: 40 61 63 6d 2e 6f 72 67 0a 2a 2a 20 20 20 68 74  @acm.org.**   ht
0420: 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63  tp://www.hwaci.c
0430: 6f 6d 2f 64 72 68 2f 0a 2a 2f 0a 23 69 6e 63 6c  om/drh/.*/.#incl
0440: 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69  ude <stdio.h>.#i
0450: 6e 63 6c 75 64 65 20 3c 76 61 72 61 72 67 73 2e  nclude <varargs.
0460: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
0470: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
0480: 3c 63 74 79 70 65 2e 68 3e 0a 0a 65 78 74 65 72  <ctype.h>..exter
0490: 6e 20 76 6f 69 64 20 71 73 6f 72 74 28 29 3b 0a  n void qsort();.
04a0: 65 78 74 65 72 6e 20 64 6f 75 62 6c 65 20 73 74  extern double st
04b0: 72 74 6f 64 28 29 3b 0a 65 78 74 65 72 6e 20 6c  rtod();.extern l
04c0: 6f 6e 67 20 73 74 72 74 6f 6c 28 29 3b 0a 65 78  ong strtol();.ex
04d0: 74 65 72 6e 20 76 6f 69 64 20 66 72 65 65 28 29  tern void free()
04e0: 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63  ;.extern int acc
04f0: 65 73 73 28 29 3b 0a 65 78 74 65 72 6e 20 69 6e  ess();.extern in
0500: 74 20 61 74 6f 69 28 29 3b 0a 0a 23 69 66 6e 64  t atoi();..#ifnd
0510: 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23 20 20  ef __WIN32__.#  
0520: 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e   if defined(_WIN
0530: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
0540: 49 4e 33 32 29 0a 23 09 64 65 66 69 6e 65 20 5f  IN32).#.define _
0550: 5f 57 49 4e 33 32 5f 5f 0a 23 20 20 20 65 6e 64  _WIN32__.#   end
0560: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64  if.#endif../* #d
0570: 65 66 69 6e 65 20 50 52 49 56 41 54 45 20 73 74  efine PRIVATE st
0580: 61 74 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20  atic */.#define 
0590: 50 52 49 56 41 54 45 0a 0a 23 69 66 64 65 66 20  PRIVATE..#ifdef 
05a0: 54 45 53 54 0a 23 64 65 66 69 6e 65 20 4d 41 58  TEST.#define MAX
05b0: 52 48 53 20 35 20 20 20 20 20 20 20 2f 2a 20 53  RHS 5       /* S
05c0: 65 74 20 6c 6f 77 20 74 6f 20 65 78 65 72 63 69  et low to exerci
05d0: 73 65 20 65 78 63 65 70 74 69 6f 6e 20 63 6f 64  se exception cod
05e0: 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69  e */.#else.#defi
05f0: 6e 65 20 4d 41 58 52 48 53 20 31 30 30 30 0a 23  ne MAXRHS 1000.#
0600: 65 6e 64 69 66 0a 0a 63 68 61 72 20 2a 6d 73 6f  endif..char *mso
0610: 72 74 28 29 3b 0a 65 78 74 65 72 6e 20 76 6f 69  rt();.extern voi
0620: 64 20 2a 6d 61 6c 6c 6f 63 28 29 3b 0a 0a 2f 2a  d *malloc();../*
0630: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
0640: 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e 68 22   file "action.h"
0650: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
0660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0670: 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 61  ******/.struct a
0680: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
0690: 77 28 29 3b 0a 73 74 72 75 63 74 20 61 63 74 69  w();.struct acti
06a0: 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28  on *Action_sort(
06b0: 29 3b 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61  );.void Action_a
06c0: 64 64 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  dd();../********
06d0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
06e0: 22 61 73 73 65 72 74 2e 68 22 20 2a 2a 2a 2a 2a  "assert.h" *****
06f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
0710: 0a 76 6f 69 64 20 6d 79 61 73 73 65 72 74 28 29  .void myassert()
0720: 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
0730: 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
0740: 74 28 58 29 20 69 66 28 21 28 58 29 29 6d 79 61  t(X) if(!(X))mya
0750: 73 73 65 72 74 28 5f 5f 46 49 4c 45 5f 5f 2c 5f  ssert(__FILE__,_
0760: 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65 0a 23  _LINE__).#else.#
0770: 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 28    define assert(
0780: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a 2a 2a  X).#endif../****
0790: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
07a0: 66 69 6c 65 20 22 62 75 69 6c 64 2e 68 22 20 2a  file "build.h" *
07b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07d0: 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75  ***/.void FindRu
07e0: 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28 29 3b  lePrecedences();
07f0: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
0800: 65 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64  ets();.void Find
0810: 53 74 61 74 65 73 28 29 3b 0a 76 6f 69 64 20 46  States();.void F
0820: 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a 76 6f 69 64  indLinks();.void
0830: 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28   FindFollowSets(
0840: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69  );.void FindActi
0850: 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ons();../*******
0860: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0870: 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68 22 20   "configlist.h" 
0880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08a0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
08b0: 73 74 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20  st_init(/* void 
08c0: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  */);.struct conf
08d0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
08e0: 64 64 28 2f 2a 20 73 74 72 75 63 74 20 72 75 6c  dd(/* struct rul
08f0: 65 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a 73 74  e *, int */);.st
0900: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
0910: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
0920: 28 2f 2a 20 73 74 72 75 63 74 20 72 75 6c 65 20  (/* struct rule 
0930: 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64  *, int */);.void
0940: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73   Configlist_clos
0950: 75 72 65 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b  ure(/* void */);
0960: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
0970: 5f 73 6f 72 74 28 2f 2a 20 76 6f 69 64 20 2a 2f  _sort(/* void */
0980: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  );.void Configli
0990: 73 74 5f 73 6f 72 74 62 61 73 69 73 28 2f 2a 20  st_sortbasis(/* 
09a0: 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74  void */);.struct
09b0: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
09c0: 69 73 74 5f 72 65 74 75 72 6e 28 2f 2a 20 76 6f  ist_return(/* vo
09d0: 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63  id */);.struct c
09e0: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
09f0: 74 5f 62 61 73 69 73 28 2f 2a 20 76 6f 69 64 20  t_basis(/* void 
0a00: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0a10: 6c 69 73 74 5f 65 61 74 28 2f 2a 20 73 74 72 75  list_eat(/* stru
0a20: 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b  ct config * */);
0a30: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
0a40: 5f 72 65 73 65 74 28 2f 2a 20 76 6f 69 64 20 2a  _reset(/* void *
0a50: 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  /);../********* 
0a60: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 65  From the file "e
0a70: 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  rror.h" ********
0a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
0aa0: 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 20  .void ErrorMsg( 
0ab0: 2f 2a 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20  /* char *, int, 
0ac0: 63 68 61 72 20 2a 2c 20 2e 2e 2e 20 2a 2f 20 29  char *, ... */ )
0ad0: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ;../****** From 
0ae0: 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e  the file "option
0af0: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
0b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0b20: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
0b30: 20 7b 0a 20 20 65 6e 75 6d 20 7b 20 4f 50 54 5f   {.  enum { OPT_
0b40: 46 4c 41 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54  FLAG=1,  OPT_INT
0b50: 2c 20 20 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54  ,  OPT_DBL,  OPT
0b60: 5f 53 54 52 2c 0a 20 20 20 20 20 20 20 20 20 4f  _STR,.         O
0b70: 50 54 5f 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49  PT_FFLAG, OPT_FI
0b80: 4e 54 2c 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50  NT, OPT_FDBL, OP
0b90: 54 5f 46 53 54 52 7d 20 74 79 70 65 3b 0a 20 20  T_FSTR} type;.  
0ba0: 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 20 20 63  char *label;.  c
0bb0: 68 61 72 20 2a 61 72 67 3b 0a 20 20 63 68 61 72  har *arg;.  char
0bc0: 20 2a 6d 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e   *message;.};.in
0bd0: 74 20 20 20 20 4f 70 74 49 6e 69 74 28 2f 2a 20  t    OptInit(/* 
0be0: 63 68 61 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f  char**,struct s_
0bf0: 6f 70 74 69 6f 6e 73 2a 2c 46 49 4c 45 2a 20 2a  options*,FILE* *
0c00: 2f 29 3b 0a 69 6e 74 20 20 20 20 4f 70 74 4e 41  /);.int    OptNA
0c10: 72 67 73 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b  rgs(/* void */);
0c20: 0a 63 68 61 72 20 20 2a 4f 70 74 41 72 67 28 2f  .char  *OptArg(/
0c30: 2a 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64 20  * int */);.void 
0c40: 20 20 4f 70 74 45 72 72 28 2f 2a 20 69 6e 74 20    OptErr(/* int 
0c50: 2a 2f 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 50  */);.void   OptP
0c60: 72 69 6e 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  rint(/* void */)
0c70: 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ;../******** Fro
0c80: 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73  m the file "pars
0c90: 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.h" ***********
0ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0cc0: 76 6f 69 64 20 50 61 72 73 65 28 2f 2a 20 73 74  void Parse(/* st
0cd0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
0ce0: 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   */);../********
0cf0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0d00: 22 70 6c 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a  "plink.h" ******
0d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d30: 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  */.struct plink 
0d40: 2a 50 6c 69 6e 6b 5f 6e 65 77 28 2f 2a 20 76 6f  *Plink_new(/* vo
0d50: 69 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69  id */);.void Pli
0d60: 6e 6b 5f 61 64 64 28 2f 2a 20 73 74 72 75 63 74  nk_add(/* struct
0d70: 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63   plink **, struc
0d80: 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a  t config * */);.
0d90: 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28  void Plink_copy(
0da0: 2f 2a 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  /* struct plink 
0db0: 2a 2a 2c 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  **, struct plink
0dc0: 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69   * */);.void Pli
0dd0: 6e 6b 5f 64 65 6c 65 74 65 28 2f 2a 20 73 74 72  nk_delete(/* str
0de0: 75 63 74 20 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b  uct plink * */);
0df0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
0e00: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
0e10: 6f 72 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.h" *********
0e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f  ************/.vo
0e40: 69 64 20 52 65 70 72 69 6e 74 28 2f 2a 20 73 74  id Reprint(/* st
0e50: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29  ruct lemon * */)
0e60: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74  ;.void ReportOut
0e70: 70 75 74 28 2f 2a 20 73 74 72 75 63 74 20 6c 65  put(/* struct le
0e80: 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20  mon * */);.void 
0e90: 52 65 70 6f 72 74 54 61 62 6c 65 28 2f 2a 20 73  ReportTable(/* s
0ea0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f  truct lemon * */
0eb0: 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65  );.void ReportHe
0ec0: 61 64 65 72 28 2f 2a 20 73 74 72 75 63 74 20 6c  ader(/* struct l
0ed0: 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64  emon * */);.void
0ee0: 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28   CompressTables(
0ef0: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
0f00: 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  * */);../*******
0f10: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0f20: 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  e "set.h" ******
0f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f50: 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a  **/.void  SetSiz
0f60: 65 28 2f 2a 20 69 6e 74 20 4e 20 2a 2f 29 3b 20  e(/* int N */); 
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0f80: 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62 65 20  ll sets will be 
0f90: 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63 68 61  of size N */.cha
0fa0: 72 20 2a 53 65 74 4e 65 77 28 2f 2a 20 76 6f 69  r *SetNew(/* voi
0fb0: 64 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20  d */);          
0fc0: 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65       /* A new se
0fd0: 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e  t for element 0.
0fe0: 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46  .N */.void  SetF
0ff0: 72 65 65 28 2f 2a 20 63 68 61 72 2a 20 2a 2f 29  ree(/* char* */)
1000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1010: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65   Deallocate a se
1020: 74 20 2a 2f 0a 0a 69 6e 74 20 53 65 74 41 64 64  t */..int SetAdd
1030: 28 2f 2a 20 63 68 61 72 2a 2c 69 6e 74 20 2a 2f  (/* char*,int */
1040: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
1050: 20 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20   Add element to 
1060: 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74  a set */.int Set
1070: 55 6e 69 6f 6e 28 2f 2a 20 63 68 61 72 20 2a 41  Union(/* char *A
1080: 2c 63 68 61 72 20 2a 42 20 2a 2f 29 3b 20 20 20  ,char *B */);   
1090: 20 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20   /* A <- A U B, 
10a0: 74 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a  thru element N *
10b0: 2f 0a 0a 23 64 65 66 69 6e 65 20 53 65 74 46 69  /..#define SetFi
10c0: 6e 64 28 58 2c 59 29 20 28 58 5b 59 5d 29 20 20  nd(X,Y) (X[Y])  
10d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
10e0: 59 20 69 73 20 69 6e 20 73 65 74 20 58 20 2a 2f  Y is in set X */
10f0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
1100: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 74 72  om the file "str
1110: 75 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  uct.h" *********
1120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
1140: 0a 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20 64 61  .** Principal da
1150: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  ta structures fo
1160: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
1170: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
1180: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
1190: 46 41 4c 53 45 3d 30 2c 20 54 52 55 45 7d 20 42  FALSE=0, TRUE} B
11a0: 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62  oolean;../* Symb
11b0: 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 61  ols (terminals a
11c0: 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 29  nd nonterminals)
11d0: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
11e0: 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
11f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20   the following: 
1200: 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
1210: 20 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b   {.  char *name;
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1230: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d   Name of the sym
1240: 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64  bol */.  int ind
1250: 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
1260: 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d 62 65    /* Index numbe
1270: 72 20 66 6f 72 20 74 68 69 73 20 73 79 6d 62 6f  r for this symbo
1280: 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 7b 0a 20 20  l */.  enum {.  
1290: 20 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20 20 20    TERMINAL,.    
12a0: 4e 4f 4e 54 45 52 4d 49 4e 41 4c 0a 20 20 7d 20  NONTERMINAL.  } 
12b0: 74 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20  type;           
12c0: 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c         /* Symbol
12d0: 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72  s are all either
12e0: 20 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20 4e 54   TERMINALS or NT
12f0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  s */.  struct ru
1300: 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20  le *rule;       
1310: 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  /* Linked list o
1320: 66 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20  f rules of this 
1330: 28 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a 20 20  (if an NT) */.  
1340: 69 6e 74 20 70 72 65 63 3b 20 20 20 20 20 20 20  int prec;       
1350: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63           /* Prec
1360: 65 64 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65  edence if define
1370: 64 20 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29  d (-1 otherwise)
1380: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73   */.  enum e_ass
1390: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
13a0: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
13b0: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 20 20 7d 20  NE,.    UNK.  } 
13c0: 61 73 73 6f 63 3b 20 20 20 20 20 20 20 20 20 20  assoc;          
13d0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
13e0: 61 74 69 76 69 74 79 20 69 66 20 70 72 65 64 65  ativity if prede
13f0: 63 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64  cence is defined
1400: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73   */.  char *firs
1410: 74 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  tset;          /
1420: 2a 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20  * First-set for 
1430: 61 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69  all rules of thi
1440: 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f  s symbol */.  Bo
1450: 6f 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20  olean lambda;   
1460: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1470: 66 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e  f NT and can gen
1480: 65 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73  erate an empty s
1490: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
14a0: 2a 64 65 73 74 72 75 63 74 6f 72 3b 20 20 20 20  *destructor;    
14b0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 77 68 69 63      /* Code whic
14c0: 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65  h executes whene
14d0: 76 65 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20  ver this symbol 
14e0: 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  is.             
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1500: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
1510: 20 73 74 61 63 6b 20 64 75 72 69 6e 67 20 65 72   stack during er
1520: 72 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  ror processing *
1530: 2f 0a 20 20 69 6e 74 20 64 65 73 74 72 75 63 74  /.  int destruct
1540: 6f 72 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  orln;        /* 
1550: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 64  Line number of d
1560: 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20 2a  estructor code *
1570: 2f 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74 79  /.  char *dataty
1580: 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pe;          /* 
1590: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6f 66  The data type of
15a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65 6c   information hel
15b0: 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 20 20  d by this.      
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
15e0: 4f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79 70  Only used if typ
15f0: 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 2a  e==NONTERMINAL *
1600: 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20 20  /.  int dtnum;  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1620: 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6e 75  The data type nu
1630: 6d 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70 61  mber.  In the pa
1640: 72 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65 0a  rser, the value.
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 74             ** st
1670: 61 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e 20  ack is a union. 
1680: 20 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d 65   The .yy%d eleme
1690: 6e 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20  nt of this.     
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20 69        ** union i
16c0: 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 64 61  s the correct da
16d0: 74 61 20 74 79 70 65 20 66 6f 72 20 74 68 69 73  ta type for this
16e0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f   object */.};../
16f0: 2a 20 45 61 63 68 20 70 72 6f 64 75 63 74 69 6f  * Each productio
1700: 6e 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72  n rule in the gr
1710: 61 6d 6d 61 72 20 69 73 20 73 74 6f 72 65 64 20  ammar is stored 
1720: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
1730: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
1740: 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c 65 20 7b  */.struct rule {
1750: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1760: 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f 2a 20 4c   *lhs;      /* L
1770: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  eft-hand side of
1780: 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 63   the rule */.  c
1790: 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20  har *lhsalias;  
17a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73          /* Alias
17b0: 20 66 6f 72 20 74 68 65 20 4c 48 53 20 28 4e 55   for the LHS (NU
17c0: 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20  LL if none) */. 
17d0: 20 69 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20   int ruleline;  
17e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
17f0: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
1800: 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   rule */.  int n
1810: 72 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  rhs;            
1820: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1830: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a   RHS symbols */.
1840: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1850: 2a 2a 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68  **rhs;     /* Th
1860: 65 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f  e RHS symbols */
1870: 0a 20 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69  .  char **rhsali
1880: 61 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  as;         /* A
1890: 6e 20 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68  n alias for each
18a0: 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c   RHS symbol (NUL
18b0: 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20  L if none) */.  
18c0: 69 6e 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20  int line;       
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
18e0: 20 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68   number at which
18f0: 20 63 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a   code begins */.
1900: 20 20 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20    char *code;   
1910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1920: 65 20 63 6f 64 65 20 65 78 65 63 75 74 65 64 20  e code executed 
1930: 77 68 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69  when this rule i
1940: 73 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 73  s reduced */.  s
1950: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72  truct symbol *pr
1960: 65 63 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65  ecsym;  /* Prece
1970: 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72  dence symbol for
1980: 20 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20   this rule */.  
1990: 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20  int index;      
19a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
19b0: 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20  ndex number for 
19c0: 74 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 42  this rule */.  B
19d0: 6f 6f 6c 65 61 6e 20 63 61 6e 52 65 64 75 63 65  oolean canReduce
19e0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
19f0: 69 66 20 74 68 69 73 20 72 75 6c 65 20 69 73 20  if this rule is 
1a00: 65 76 65 72 20 72 65 64 75 63 65 64 20 2a 2f 0a  ever reduced */.
1a10: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e    struct rule *n
1a20: 65 78 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65  extlhs;    /* Ne
1a30: 78 74 20 72 75 6c 65 20 77 69 74 68 20 74 68 65  xt rule with the
1a40: 20 73 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73   same LHS */.  s
1a50: 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74  truct rule *next
1a60: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20  ;       /* Next 
1a70: 72 75 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62  rule in the glob
1a80: 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f  al list */.};../
1a90: 2a 20 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  * A configuratio
1aa0: 6e 20 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f  n is a productio
1ab0: 6e 20 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72  n rule of the gr
1ac0: 61 6d 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77  ammar together w
1ad0: 69 74 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64  ith.** a mark (d
1ae0: 6f 74 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20  ot) showing how 
1af0: 6d 75 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c  much of that rul
1b00: 65 20 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65  e has been proce
1b10: 73 73 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20  ssed so far..** 
1b20: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61  Configurations a
1b30: 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f  lso contain a fo
1b40: 6c 6c 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69  llow-set which i
1b50: 73 20 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d  s a list of term
1b60: 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20  inal.** symbols 
1b70: 77 68 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65  which are allowe
1b80: 64 20 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79  d to immediately
1b90: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20   follow the end 
1ba0: 6f 66 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20  of the rule..** 
1bb0: 45 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74  Every configurat
1bc0: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
1bd0: 61 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  as an instance o
1be0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
1bf0: 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69   */.struct confi
1c00: 67 20 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  g {.  struct rul
1c10: 65 20 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f  e *rp;         /
1c20: 2a 20 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20  * The rule upon 
1c30: 77 68 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67  which the config
1c40: 75 72 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64  uration is based
1c50: 20 2a 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20   */.  int dot;  
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c70: 2a 20 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e  * The parse poin
1c80: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73  t */.  char *fws
1c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ca0: 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f  /* Follow-set fo
1cb0: 72 20 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61  r this configura
1cc0: 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73  tion only */.  s
1cd0: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c  truct plink *fpl
1ce0: 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f  p;      /* Follo
1cf0: 77 2d 73 65 74 20 66 6f 72 77 61 72 64 20 70 72  w-set forward pr
1d00: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20  opagation links 
1d10: 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  */.  struct plin
1d20: 6b 20 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a  k *bplp;      /*
1d30: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b   Follow-set back
1d40: 77 61 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f  wards propagatio
1d50: 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72  n links */.  str
1d60: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
1d70: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1d80: 20 74 6f 20 73 74 61 74 65 20 77 68 69 63 68 20   to state which 
1d90: 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f  contains this */
1da0: 0a 20 20 65 6e 75 6d 20 7b 0a 20 20 20 20 43 4f  .  enum {.    CO
1db0: 4d 50 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20  MPLETE,         
1dc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74       /* The stat
1dd0: 75 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  us is used durin
1de0: 67 20 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20  g followset and 
1df0: 2a 2f 0a 20 20 20 20 49 4e 43 4f 4d 50 4c 45 54  */.    INCOMPLET
1e00: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E             /*
1e10: 20 20 20 20 73 68 69 66 74 20 63 6f 6d 70 75 74      shift comput
1e20: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 7d 20 73 74  ations */.  } st
1e30: 61 74 75 73 3b 0a 20 20 73 74 72 75 63 74 20 63  atus;.  struct c
1e40: 6f 6e 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20  onfig *next;    
1e50: 20 2f 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75   /* Next configu
1e60: 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74  ration in the st
1e70: 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
1e80: 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20  config *bp;     
1e90: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61    /* The next ba
1ea0: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
1eb0: 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72  n */.};../* Ever
1ec0: 79 20 73 68 69 66 74 20 6f 72 20 72 65 64 75 63  y shift or reduc
1ed0: 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73  e operation is s
1ee0: 74 6f 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20  tored as one of 
1ef0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
1f00: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b  .struct action {
1f10: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1f20: 20 2a 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *sp;       /* T
1f30: 68 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79  he look-ahead sy
1f40: 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65  mbol */.  enum e
1f50: 5f 61 63 74 69 6f 6e 20 7b 0a 20 20 20 20 53 48  _action {.    SH
1f60: 49 46 54 2c 0a 20 20 20 20 41 43 43 45 50 54 2c  IFT,.    ACCEPT,
1f70: 0a 20 20 20 20 52 45 44 55 43 45 2c 0a 20 20 20  .    REDUCE,.   
1f80: 20 45 52 52 4f 52 2c 0a 20 20 20 20 43 4f 4e 46   ERROR,.    CONF
1f90: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
1fa0: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65       /* Was a re
1fb0: 64 75 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f  duce, but part o
1fc0: 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  f a conflict */.
1fd0: 20 20 20 20 53 48 5f 52 45 53 4f 4c 56 45 44 2c      SH_RESOLVED,
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff0: 57 61 73 20 61 20 73 68 69 66 74 2e 20 20 50 72  Was a shift.  Pr
2000: 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65  ecedence resolve
2010: 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  d conflict */.  
2020: 20 20 52 44 5f 52 45 53 4f 4c 56 45 44 2c 20 20    RD_RESOLVED,  
2030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
2040: 73 20 72 65 64 75 63 65 2e 20 20 50 72 65 63 65  s reduce.  Prece
2050: 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63  dence resolved c
2060: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 4e  onflict */.    N
2070: 4f 54 5f 55 53 45 44 20 20 20 20 20 20 20 20 20  OT_USED         
2080: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
2090: 65 64 20 62 79 20 63 6f 6d 70 72 65 73 73 69 6f  ed by compressio
20a0: 6e 20 2a 2f 0a 20 20 7d 20 74 79 70 65 3b 0a 20  n */.  } type;. 
20b0: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72   union {.    str
20c0: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
20d0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 73      /* The new s
20e0: 74 61 74 65 2c 20 69 66 20 61 20 73 68 69 66 74  tate, if a shift
20f0: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 72   */.    struct r
2100: 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 2f  ule *rp;       /
2110: 2a 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20 61  * The rule, if a
2120: 20 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78   reduce */.  } x
2130: 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
2140: 6e 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20  n *next;     /* 
2150: 4e 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  Next action for 
2160: 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20  this state */.  
2170: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 63  struct action *c
2180: 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78 74  ollide;  /* Next
2190: 20 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65   action with the
21a0: 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d 3b   same hash */.};
21b0: 0a 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65 20  ../* Each state 
21c0: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
21d0: 20 70 61 72 73 65 72 27 73 20 66 69 6e 69 74 65   parser's finite
21e0: 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 2a   state machine.*
21f0: 2a 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20  * is encoded as 
2200: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2210: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2220: 75 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75 63  ucture. */.struc
2230: 74 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72 75  t state {.  stru
2240: 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20  ct config *bp;  
2250: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73 69       /* The basi
2260: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  s configurations
2270: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20   for this state 
2280: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
2290: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
22a0: 20 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   All configurati
22b0: 6f 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74 20  ons in this set 
22c0: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e0: 20 53 65 71 75 65 6e 63 69 61 6c 20 6e 75 6d 62   Sequencial numb
22f0: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
2300: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63  e */.  struct ac
2310: 74 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20 20  tion *ap;       
2320: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
2330: 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74 61  ons for this sta
2340: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 61 63 74  te */.  int nact
2350: 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
2360: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63   /* Number of ac
2370: 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73  tions for this s
2380: 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 74 61  tate */.  int ta
2390: 62 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20  bstart;         
23a0: 20 20 20 2f 2a 20 46 69 72 73 74 20 69 6e 64 65     /* First inde
23b0: 78 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20  x of the action 
23c0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74  table */.  int t
23d0: 61 62 64 66 6c 74 61 63 74 3b 20 20 20 20 20 20  abdfltact;      
23e0: 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 61      /* Default a
23f0: 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  ction */.};../* 
2400: 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70  A followset prop
2410: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64  agation link ind
2420: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
2430: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a  contents of one.
2440: 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** configuration
2450: 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c   followset shoul
2460: 64 20 62 65 20 70 72 6f 70 61 67 61 74 65 64 20  d be propagated 
2470: 74 6f 20 61 6e 6f 74 68 65 72 20 77 68 65 6e 65  to another whene
2480: 76 65 72 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ver.** the first
2490: 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72   changes. */.str
24a0: 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74  uct plink {.  st
24b0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
24c0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;      /* The co
24d0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 77  nfiguration to w
24e0: 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20  hich linked */. 
24f0: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
2500: 65 78 74 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  ext;      /* The
2510: 20 6e 65 78 74 20 70 72 6f 70 61 67 61 74 65 20   next propagate 
2520: 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  link */.};../* T
2530: 68 65 20 73 74 61 74 65 20 76 65 63 74 6f 72 20  he state vector 
2540: 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 70  for the entire p
2550: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20  arser generator 
2560: 69 73 20 72 65 63 6f 72 64 65 64 20 61 73 0a 2a  is recorded as.*
2570: 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d  * follows.  (LEM
2580: 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61  ON uses no globa
2590: 6c 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  l variables and 
25a0: 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20 75 73 65  makes little use
25b0: 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63 20 76 61   of.** static va
25c0: 72 69 61 62 6c 65 73 2e 20 20 46 69 65 6c 64 73  riables.  Fields
25d0: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
25e0: 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  g structure can 
25f0: 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66  be thought.** of
2600: 20 61 73 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c   as begin global
2610: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
2620: 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73  e program.) */.s
2630: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20  truct lemon {.  
2640: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 73  struct state **s
2650: 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c  orted;   /* Tabl
2660: 65 20 6f 66 20 73 74 61 74 65 73 20 73 6f 72 74  e of states sort
2670: 65 64 20 62 79 20 73 74 61 74 65 20 6e 75 6d 62  ed by state numb
2680: 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  er */.  struct r
2690: 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20  ule *rule;      
26a0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
26b0: 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rules */.  int n
26c0: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
26d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26e0: 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74   states */.  int
26f0: 20 6e 72 75 6c 65 3b 20 20 20 20 20 20 20 20 20   nrule;         
2700: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2710: 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e  of rules */.  in
2720: 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20  t nsymbol;      
2730: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2740: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64   of terminal and
2750: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d   nonterminal sym
2760: 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74  bols */.  int nt
2770: 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20 20 20 20  erminal;        
2780: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2790: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
27a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
27b0: 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f  bol **symbols; /
27c0: 2a 20 53 6f 72 74 65 64 20 61 72 72 61 79 20 6f  * Sorted array o
27d0: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 79  f pointers to sy
27e0: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65  mbols */.  int e
27f0: 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20  rrorcnt;        
2800: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2810: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72   errors */.  str
2820: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73  uct symbol *errs
2830: 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65 72 72  ym;   /* The err
2840: 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 63  or symbol */.  c
2850: 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
2860: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2870: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2880: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61   parser */.  cha
2890: 72 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20  r *arg;         
28a0: 20 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61        /* Declara
28b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20  tion of the 3th 
28c0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73  argument to pars
28d0: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  er */.  char *to
28e0: 6b 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20  kentype;        
28f0: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d   /* Type of term
2900: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20  inal symbols in 
2910: 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b  the parser stack
2920: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 72   */.  char *star
2930: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
2940: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 74  * Name of the st
2950: 61 72 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74  art symbol for t
2960: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20  he grammar */.  
2970: 63 68 61 72 20 2a 73 74 61 63 6b 73 69 7a 65 3b  char *stacksize;
2980: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2990: 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 73   of the parser s
29a0: 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tack */.  char *
29b0: 69 6e 63 6c 75 64 65 3b 20 20 20 20 20 20 20 20  include;        
29c0: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 75     /* Code to pu
29d0: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
29e0: 66 20 74 68 65 20 43 20 66 69 6c 65 20 2a 2f 0a  f the C file */.
29f0: 20 20 69 6e 74 20 20 69 6e 63 6c 75 64 65 6c 6e    int  includeln
2a00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  ;          /* Li
2a10: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74  ne number for st
2a20: 61 72 74 20 6f 66 20 69 6e 63 6c 75 64 65 20 63  art of include c
2a30: 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65  ode */.  char *e
2a40: 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
2a50: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
2a60: 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65 72 72  cute when an err
2a70: 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20  or is seen */.  
2a80: 69 6e 74 20 20 65 72 72 6f 72 6c 6e 3b 20 20 20  int  errorln;   
2a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
2aa0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72   number for star
2ab0: 74 20 6f 66 20 65 72 72 6f 72 20 63 6f 64 65 20  t of error code 
2ac0: 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66  */.  char *overf
2ad0: 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  low;          /*
2ae0: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
2af0: 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72   on a stack over
2b00: 66 6c 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 20 6f  flow */.  int  o
2b10: 76 65 72 66 6c 6f 77 6c 6e 3b 20 20 20 20 20 20  verflowln;      
2b20: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
2b30: 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 6f  r for start of o
2b40: 76 65 72 66 6c 6f 77 20 63 6f 64 65 20 2a 2f 0a  verflow code */.
2b50: 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b    char *failure;
2b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2b70: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
2b80: 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65 20   parser failure 
2b90: 2a 2f 0a 20 20 69 6e 74 20 20 66 61 69 6c 75 72  */.  int  failur
2ba0: 65 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  eln;          /*
2bb0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
2bc0: 20 73 74 61 72 74 20 6f 66 20 66 61 69 6c 75 72   start of failur
2bd0: 65 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  e code */.  char
2be0: 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20 20   *accept;       
2bf0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
2c00: 65 78 65 63 75 74 65 20 77 68 65 6e 20 74 68 65  execute when the
2c10: 20 70 61 72 73 65 72 20 65 78 63 65 70 74 73 20   parser excepts 
2c20: 2a 2f 0a 20 20 69 6e 74 20 20 61 63 63 65 70 74  */.  int  accept
2c30: 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ln;           /*
2c40: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
2c50: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 63   the start of ac
2c60: 63 65 70 74 20 63 6f 64 65 20 2a 2f 0a 20 20 63  cept code */.  c
2c70: 68 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20  har *extracode; 
2c80: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2c90: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
2ca0: 67 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a  generated file *
2cb0: 2f 0a 20 20 69 6e 74 20 20 65 78 74 72 61 63 6f  /.  int  extraco
2cc0: 64 65 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  deln;        /* 
2cd0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
2ce0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2cf0: 20 65 78 74 72 61 20 63 6f 64 65 20 2a 2f 0a 20   extra code */. 
2d00: 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65 73 74   char *tokendest
2d10: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64  ;         /* Cod
2d20: 65 20 74 6f 20 65 78 65 63 75 74 65 20 74 6f 20  e to execute to 
2d30: 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20 64 61  destroy token da
2d40: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 20 74 6f 6b  ta */.  int  tok
2d50: 65 6e 64 65 73 74 6c 6e 3b 20 20 20 20 20 20 20  endestln;       
2d60: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
2d70: 66 6f 72 20 74 6f 6b 65 6e 20 64 65 73 74 72 6f  for token destro
2d80: 79 65 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  yer code */.  ch
2d90: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
2da0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2db0: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
2dc0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e   */.  char *outn
2dd0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
2de0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  * Name of the cu
2df0: 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c  rrent output fil
2e00: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
2e10: 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20  enprefix;       
2e20: 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65  /* A prefix adde
2e30: 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73  d to token names
2e40: 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20   in the .h file 
2e50: 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69  */.  int nconfli
2e60: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct;           /*
2e70: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69   Number of parsi
2e80: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ng conflicts */.
2e90: 20 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b    int tablesize;
2ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2eb0: 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 20  ze of the parse 
2ec0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  tables */.  int 
2ed0: 62 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20  basisflag;      
2ee0: 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e       /* Print on
2ef0: 6c 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  ly basis configu
2f00: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  rations */.  cha
2f10: 72 20 2a 61 72 67 76 30 3b 20 20 20 20 20 20 20  r *argv0;       
2f20: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2f30: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a   the program */.
2f40: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f  };..#define Memo
2f50: 72 79 43 68 65 63 6b 28 58 29 20 69 66 28 28 58  ryCheck(X) if((X
2f60: 29 3d 3d 30 29 7b 20 5c 0a 20 20 65 78 74 65 72  )==0){ \.  exter
2f70: 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72  n void memory_er
2f80: 72 6f 72 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72  ror(); \.  memor
2f90: 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a  y_error(); \.}..
2fa0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
2fb0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
2fc0: 22 74 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a  "table.h" ******
2fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
2ff0: 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74  ** All code in t
3000: 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65 65  his file has bee
3010: 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  n automatically 
3020: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f  generated.** fro
3030: 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69 6f  m a specificatio
3040: 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  n in the file.**
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
3060: 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68  able.q".** by th
3070: 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  e associative ar
3080: 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e  ray code buildin
3090: 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e  g program "aagen
30a0: 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69  "..** Do not edi
30b0: 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e  t this file!  In
30c0: 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65 20  stead, edit the 
30d0: 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a  specification.**
30e0: 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75   file, then reru
30f0: 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a  n aagen..*/./*.*
3100: 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65  * Code for proce
3110: 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20  ssing tables in 
3120: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
3130: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
3140: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20  /* Routines for 
3150: 68 61 6e 64 6c 69 6e 67 20 61 20 73 74 72 69 6e  handling a strin
3160: 67 73 20 2a 2f 0a 0a 63 68 61 72 20 2a 53 74 72  gs */..char *Str
3170: 73 61 66 65 28 29 3b 0a 0a 76 6f 69 64 20 53 74  safe();..void St
3180: 72 73 61 66 65 5f 69 6e 69 74 28 2f 2a 20 76 6f  rsafe_init(/* vo
3190: 69 64 20 2a 2f 29 3b 0a 69 6e 74 20 53 74 72 73  id */);.int Strs
31a0: 61 66 65 5f 69 6e 73 65 72 74 28 2f 2a 20 63 68  afe_insert(/* ch
31b0: 61 72 20 2a 20 2a 2f 29 3b 0a 63 68 61 72 20 2a  ar * */);.char *
31c0: 53 74 72 73 61 66 65 5f 66 69 6e 64 28 2f 2a 20  Strsafe_find(/* 
31d0: 63 68 61 72 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 20  char * */);../* 
31e0: 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e  Routines for han
31f0: 64 6c 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66  dling symbols of
3200: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a   the grammar */.
3210: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
3220: 53 79 6d 62 6f 6c 5f 6e 65 77 28 29 3b 0a 69 6e  Symbol_new();.in
3230: 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 2f 2a 20  t Symbolcmpp(/* 
3240: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3250: 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  , struct symbol 
3260: 2a 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 53 79 6d  ** */);.void Sym
3270: 62 6f 6c 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  bol_init(/* void
3280: 20 2a 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c   */);.int Symbol
3290: 5f 69 6e 73 65 72 74 28 2f 2a 20 73 74 72 75 63  _insert(/* struc
32a0: 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63 68 61 72  t symbol *, char
32b0: 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73   * */);.struct s
32c0: 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69  ymbol *Symbol_fi
32d0: 6e 64 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29  nd(/* char * */)
32e0: 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  ;.struct symbol 
32f0: 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 2f 2a 20 69  *Symbol_Nth(/* i
3300: 6e 74 20 2a 2f 29 3b 0a 69 6e 74 20 53 79 6d 62  nt */);.int Symb
3310: 6f 6c 5f 63 6f 75 6e 74 28 2f 2a 20 20 2a 2f 29  ol_count(/*  */)
3320: 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  ;.struct symbol 
3330: 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66  **Symbol_arrayof
3340: 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f  (/*  */);../* Ro
3350: 75 74 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67 65  utines to manage
3360: 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c 65   the state table
3370: 20 2a 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67 63   */..int Configc
3380: 6d 70 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e  mp(/* struct con
3390: 66 69 67 20 2a 2c 20 73 74 72 75 63 74 20 63 6f  fig *, struct co
33a0: 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75  nfig * */);.stru
33b0: 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f  ct state *State_
33c0: 6e 65 77 28 29 3b 0a 76 6f 69 64 20 53 74 61 74  new();.void Stat
33d0: 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a  e_init(/* void *
33e0: 2f 29 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e  /);.int State_in
33f0: 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74 20 73  sert(/* struct s
3400: 74 61 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63  tate *, struct c
3410: 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72  onfig * */);.str
3420: 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65  uct state *State
3430: 5f 66 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20  _find(/* struct 
3440: 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74  config * */);.st
3450: 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61  ruct state **Sta
3460: 74 65 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a  te_arrayof(/*  *
3470: 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73  /);../* Routines
3480: 20 75 73 65 64 20 66 6f 72 20 65 66 66 69 63 69   used for effici
3490: 65 6e 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c 69  ency in Configli
34a0: 73 74 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64 20  st_add */..void 
34b0: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74  Configtable_init
34c0: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e  (/* void */);.in
34d0: 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  t Configtable_in
34e0: 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74 20 63  sert(/* struct c
34f0: 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72  onfig * */);.str
3500: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
3510: 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 2f 2a 20  igtable_find(/* 
3520: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
3530: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
3540: 74 61 62 6c 65 5f 63 6c 65 61 72 28 2f 2a 20 69  table_clear(/* i
3550: 6e 74 28 2a 29 28 73 74 72 75 63 74 20 63 6f 6e  nt(*)(struct con
3560: 66 69 67 20 2a 29 20 2a 2f 29 3b 0a 2f 2a 2a 2a  fig *) */);./***
3570: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
3580: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61  From the file "a
3590: 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  ction.c" *******
35a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35b0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
35c0: 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73  Routines process
35d0: 69 6e 67 20 70 61 72 73 65 72 20 61 63 74 69 6f  ing parser actio
35e0: 6e 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  ns in the LEMON 
35f0: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
3600: 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  ..*/../* Allocat
3610: 65 20 61 20 6e 65 77 20 70 61 72 73 65 72 20 61  e a new parser a
3620: 63 74 69 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20  ction */.struct 
3630: 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e  action *Action_n
3640: 65 77 28 29 7b 0a 20 20 73 74 61 74 69 63 20 73  ew(){.  static s
3650: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72  truct action *fr
3660: 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74  eelist = 0;.  st
3670: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77  ruct action *new
3680: 3b 0a 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73  ;..  if( freelis
3690: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
36a0: 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d  i;.    int amt =
36b0: 20 31 30 30 3b 0a 20 20 20 20 66 72 65 65 6c 69   100;.    freeli
36c0: 73 74 20 3d 20 28 73 74 72 75 63 74 20 61 63 74  st = (struct act
36d0: 69 6f 6e 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  ion *)malloc( si
36e0: 7a 65 6f 66 28 73 74 72 75 63 74 20 61 63 74 69  zeof(struct acti
36f0: 6f 6e 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69  on)*amt );.    i
3700: 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29  f( freelist==0 )
3710: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
3720: 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74  stderr,"Unable t
3730: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
3740: 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61 72 73  y for a new pars
3750: 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20 20  er action.");.  
3760: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
3770: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
3780: 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72  i<amt-1; i++) fr
3790: 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d  eelist[i].next =
37a0: 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b   &freelist[i+1];
37b0: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d  .    freelist[am
37c0: 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20  t-1].next = 0;. 
37d0: 20 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65 65 6c   }.  new = freel
37e0: 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20  ist;.  freelist 
37f0: 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74  = freelist->next
3800: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a  ;.  return new;.
3810: 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
3820: 6f 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  o actions */.sta
3830: 74 69 63 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d  tic int actioncm
3840: 70 28 61 70 31 2c 61 70 32 29 0a 73 74 72 75 63  p(ap1,ap2).struc
3850: 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 3b 0a 73  t action *ap1;.s
3860: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
3870: 32 3b 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  2;.{.  int rc;. 
3880: 20 72 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e 69   rc = ap1->sp->i
3890: 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d 3e  ndex - ap2->sp->
38a0: 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 72 63 3d  index;.  if( rc=
38b0: 3d 30 20 29 20 72 63 20 3d 20 28 69 6e 74 29 61  =0 ) rc = (int)a
38c0: 70 31 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74 29  p1->type - (int)
38d0: 61 70 32 2d 3e 74 79 70 65 3b 0a 20 20 69 66 28  ap2->type;.  if(
38e0: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73   rc==0 ){.    as
38f0: 73 65 72 74 28 20 61 70 31 2d 3e 74 79 70 65 3d  sert( ap1->type=
3900: 3d 52 45 44 55 43 45 20 26 26 20 61 70 32 2d 3e  =REDUCE && ap2->
3910: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 3b 0a  type==REDUCE );.
3920: 20 20 20 20 72 63 20 3d 20 61 70 31 2d 3e 78 2e      rc = ap1->x.
3930: 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d  rp->index - ap2-
3940: 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  >x.rp->index;.  
3950: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
3960: 0a 0a 2f 2a 20 53 6f 72 74 20 70 61 72 73 65 72  ../* Sort parser
3970: 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 72 75   actions */.stru
3980: 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f  ct action *Actio
3990: 6e 5f 73 6f 72 74 28 61 70 29 0a 73 74 72 75 63  n_sort(ap).struc
39a0: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 7b 0a  t action *ap;.{.
39b0: 20 20 61 70 20 3d 20 28 73 74 72 75 63 74 20 61    ap = (struct a
39c0: 63 74 69 6f 6e 20 2a 29 6d 73 6f 72 74 28 61 70  ction *)msort(ap
39d0: 2c 26 61 70 2d 3e 6e 65 78 74 2c 61 63 74 69 6f  ,&ap->next,actio
39e0: 6e 63 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ncmp);.  return 
39f0: 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20 41 63 74 69  ap;.}..void Acti
3a00: 6f 6e 5f 61 64 64 28 61 70 70 2c 74 79 70 65 2c  on_add(app,type,
3a10: 73 70 2c 61 72 67 29 0a 73 74 72 75 63 74 20 61  sp,arg).struct a
3a20: 63 74 69 6f 6e 20 2a 2a 61 70 70 3b 0a 65 6e 75  ction **app;.enu
3a30: 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 3b  m e_action type;
3a40: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
3a50: 73 70 3b 0a 63 68 61 72 20 2a 61 72 67 3b 0a 7b  sp;.char *arg;.{
3a60: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
3a70: 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d 20 41   *new;.  new = A
3a80: 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e  ction_new();.  n
3a90: 65 77 2d 3e 6e 65 78 74 20 3d 20 2a 61 70 70 3b  ew->next = *app;
3aa0: 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77 3b 0a 20  .  *app = new;. 
3ab0: 20 6e 65 77 2d 3e 74 79 70 65 20 3d 20 74 79 70   new->type = typ
3ac0: 65 3b 0a 20 20 6e 65 77 2d 3e 73 70 20 3d 20 73  e;.  new->sp = s
3ad0: 70 3b 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53  p;.  if( type==S
3ae0: 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65 77 2d  HIFT ){.    new-
3af0: 3e 78 2e 73 74 70 20 3d 20 28 73 74 72 75 63 74  >x.stp = (struct
3b00: 20 73 74 61 74 65 20 2a 29 61 72 67 3b 0a 20 20   state *)arg;.  
3b10: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65 77 2d 3e  }else{.    new->
3b20: 78 2e 72 70 20 3d 20 28 73 74 72 75 63 74 20 72  x.rp = (struct r
3b30: 75 6c 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d  ule *)arg;.  }.}
3b40: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
3b50: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
3b60: 65 20 66 69 6c 65 20 22 61 73 73 65 72 74 2e 63  e file "assert.c
3b70: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
3b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
3b90: 2f 2a 0a 2a 2a 20 41 20 6d 6f 72 65 20 65 66 66  /*.** A more eff
3ba0: 69 63 69 65 6e 74 20 77 61 79 20 6f 66 20 68 61  icient way of ha
3bb0: 6e 64 6c 69 6e 67 20 61 73 73 65 72 74 69 6f 6e  ndling assertion
3bc0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 6d 79 61 73 73  s..*/.void myass
3bd0: 65 72 74 28 66 69 6c 65 2c 6c 69 6e 65 29 0a 63  ert(file,line).c
3be0: 68 61 72 20 2a 66 69 6c 65 3b 0a 69 6e 74 20 6c  har *file;.int l
3bf0: 69 6e 65 3b 0a 7b 0a 20 20 66 70 72 69 6e 74 66  ine;.{.  fprintf
3c00: 28 73 74 64 65 72 72 2c 22 41 73 73 65 72 74 69  (stderr,"Asserti
3c10: 6f 6e 20 66 61 69 6c 65 64 20 6f 6e 20 6c 69 6e  on failed on lin
3c20: 65 20 25 64 20 6f 66 20 66 69 6c 65 20 5c 22 25  e %d of file \"%
3c30: 73 5c 22 5c 6e 22 2c 6c 69 6e 65 2c 66 69 6c 65  s\"\n",line,file
3c40: 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a  );.  exit(1);.}.
3c50: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
3c60: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
3c70: 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 63 22 20   file "build.c" 
3c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
3ca0: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
3cb0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 68   construction th
3cc0: 65 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  e finite state m
3cd0: 61 63 68 69 6e 65 20 66 6f 72 20 74 68 65 20 4c  achine for the L
3ce0: 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67  EMON.** parser g
3cf0: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
3d00: 20 46 69 6e 64 20 61 20 70 72 65 63 65 64 65 6e   Find a preceden
3d10: 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65  ce symbol of eve
3d20: 72 79 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  ry rule in the g
3d30: 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54  rammar..** .** T
3d40: 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69 63 68  hose rules which
3d50: 20 68 61 76 65 20 61 20 70 72 65 63 65 64 65 6e   have a preceden
3d60: 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20  ce symbol coded 
3d70: 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20  in the input.** 
3d80: 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20 74 68  grammar using th
3d90: 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e  e "[symbol]" con
3da0: 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c 72 65  struct will alre
3db0: 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a 2a 20  ady have the.** 
3dc0: 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69 65 6c  rp->precsym fiel
3dd0: 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72  d filled.  Other
3de0: 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73 20 74   rules take as t
3df0: 68 65 69 72 20 70 72 65 63 65 64 65 6e 63 65 0a  heir precedence.
3e00: 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20 66 69  ** symbol the fi
3e10: 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 77  rst RHS symbol w
3e20: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72  ith a defined pr
3e30: 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20 74 68  ecedence.  If th
3e40: 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52  ere.** are not R
3e50: 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74 68 20  HS symbols with 
3e60: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
3e70: 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63 65 64  ence, the preced
3e80: 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66  ence.** symbol f
3e90: 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62 6c 61  ield is left bla
3ea0: 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  nk..*/.void Find
3eb0: 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28  RulePrecedences(
3ec0: 78 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  xp).struct lemon
3ed0: 20 2a 78 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74   *xp;.{.  struct
3ee0: 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72   rule *rp;.  for
3ef0: 28 72 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70  (rp=xp->rule; rp
3f00: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
3f10: 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63      if( rp->prec
3f20: 73 79 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sym==0 ){.      
3f30: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
3f40: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
3f50: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
3f60: 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e  if( rp->rhs[i]->
3f70: 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  prec>=0 ){.     
3f80: 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d       rp->precsym
3f90: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
3fa0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
3fb0: 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .}.      }.    }
3fc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
3fd0: 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f  ../* Find all no
3fe0: 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68  nterminals which
3ff0: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74   will generate t
4000: 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  he empty string.
4010: 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b  .** Then go back
4020: 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65   and compute the
4030: 20 66 69 72 73 74 20 73 65 74 73 20 6f 66 20 65   first sets of e
4040: 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  very nonterminal
4050: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73  ..** The first s
4060: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
4070: 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79   all terminal sy
4080: 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20  mbols which can 
4090: 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e  begin.** a strin
40a0: 67 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  g generated by t
40b0: 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  hat nonterminal.
40c0: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72  .*/.void FindFir
40d0: 73 74 53 65 74 73 28 6c 65 6d 70 29 0a 73 74 72  stSets(lemp).str
40e0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
40f0: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  .{.  int i;.  st
4100: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
4110: 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a   int progress;..
4120: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
4130: 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
4140: 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62  {.    lemp->symb
4150: 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d  ols[i]->lambda =
4160: 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f   FALSE;.  }.  fo
4170: 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  r(i=lemp->ntermi
4180: 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  nal; i<lemp->nsy
4190: 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
41a0: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
41b0: 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53 65 74  ->firstset = Set
41c0: 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  New();.  }..  /*
41d0: 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65 20 61   First compute a
41e0: 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20  ll lambdas */.  
41f0: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
4200: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70   = 0;.    for(rp
4210: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
4220: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
4230: 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
4240: 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74 69  ->lambda ) conti
4250: 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  nue;.      for(i
4260: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
4270: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 69  i++){.         i
4280: 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6c  f( rp->rhs[i]->l
4290: 61 6d 62 64 61 3d 3d 46 41 4c 53 45 20 29 20 62  ambda==FALSE ) b
42a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
42b0: 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
42c0: 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rhs ){.        r
42d0: 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d  p->lhs->lambda =
42e0: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 20 70   TRUE;.        p
42f0: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20  rogress = 1;.   
4300: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68     }.    }.  }wh
4310: 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b  ile( progress );
4320: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75  ..  /* Now compu
4330: 74 65 20 61 6c 6c 20 66 69 72 73 74 20 73 65 74  te all first set
4340: 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 73  s */.  do{.    s
4350: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 31  truct symbol *s1
4360: 2c 20 2a 73 32 3b 0a 20 20 20 20 70 72 6f 67 72  , *s2;.    progr
4370: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ess = 0;.    for
4380: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
4390: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
43a0: 7b 0a 20 20 20 20 20 20 73 31 20 3d 20 72 70 2d  {.      s1 = rp-
43b0: 3e 6c 68 73 3b 0a 20 20 20 20 20 20 66 6f 72 28  >lhs;.      for(
43c0: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
43d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
43e0: 32 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  2 = rp->rhs[i];.
43f0: 20 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e          if( s2->
4400: 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29  type==TERMINAL )
4410: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67  {.          prog
4420: 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28 73  ress += SetAdd(s
4430: 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e  1->firstset,s2->
4440: 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
4450: 20 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 20    break;..}else 
4460: 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20  if( s1==s2 ){.  
4470: 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e          if( s1->
4480: 6c 61 6d 62 64 61 3d 3d 46 41 4c 53 45 20 29 20  lambda==FALSE ) 
4490: 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 7b 0a 20  break;..}else{. 
44a0: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
44b0: 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31  s += SetUnion(s1
44c0: 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 66  ->firstset,s2->f
44d0: 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20  irstset);.      
44e0: 20 20 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62      if( s2->lamb
44f0: 64 61 3d 3d 46 41 4c 53 45 20 29 20 62 72 65 61  da==FALSE ) brea
4500: 6b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20  k;..}.      }.  
4510: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
4520: 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 65 74 75  ogress );.  retu
4530: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74  rn;.}../* Comput
4540: 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74  e all LR(0) stat
4550: 65 73 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d  es for the gramm
4560: 61 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72  ar.  Links.** ar
4570: 65 20 61 64 64 65 64 20 74 6f 20 62 65 74 77 65  e added to betwe
4580: 65 6e 20 73 6f 6d 65 20 73 74 61 74 65 73 20 73  en some states s
4590: 6f 20 74 68 61 74 20 74 68 65 20 4c 52 28 31 29  o that the LR(1)
45a0: 20 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20   follow sets.** 
45b0: 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20  can be computed 
45c0: 6c 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54  later..*/.PRIVAT
45d0: 45 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  E struct state *
45e0: 67 65 74 73 74 61 74 65 28 2f 2a 20 73 74 72 75  getstate(/* stru
45f0: 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 20  ct lemon * */); 
4600: 20 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65   /* forward refe
4610: 72 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20 46 69  rence */.void Fi
4620: 6e 64 53 74 61 74 65 73 28 6c 65 6d 70 29 0a 73  ndStates(lemp).s
4630: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
4640: 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  p;.{.  struct sy
4650: 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75  mbol *sp;.  stru
4660: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20  ct rule *rp;..  
4670: 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28  Configlist_init(
4680: 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68  );..  /* Find th
4690: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a  e start symbol *
46a0: 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  /.  if( lemp->st
46b0: 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  art ){.    sp = 
46c0: 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70  Symbol_find(lemp
46d0: 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66  ->start);.    if
46e0: 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ( sp==0 ){.     
46f0: 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
4700: 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65  filename,0,."The
4710: 20 73 70 65 63 69 66 69 65 64 20 73 74 61 72 74   specified start
4720: 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69   symbol \"%s\" i
4730: 73 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e  s not \.in a non
4740: 74 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20  terminal of the 
4750: 67 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22  grammar.  \"%s\"
4760: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73   will be used as
4770: 20 74 68 65 20 73 74 61 72 74 20 5c 0a 73 79 6d   the start \.sym
4780: 62 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65  bol instead.",le
4790: 6d 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e  mp->start,lemp->
47a0: 72 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  rule->lhs->name)
47b0: 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
47c0: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
47d0: 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d  sp = lemp->rule-
47e0: 3e 6c 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  >lhs;.    }.  }e
47f0: 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65  lse{.    sp = le
4800: 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20  mp->rule->lhs;. 
4810: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
4820: 72 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  re the start sym
4830: 62 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63 75  bol doesn't occu
4840: 72 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68  r on the right-h
4850: 61 6e 64 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a  and side of.  **
4860: 20 61 6e 79 20 72 75 6c 65 2e 20 20 52 65 70 6f   any rule.  Repo
4870: 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69  rt an error if i
4880: 74 20 64 6f 65 73 2e 20 20 28 59 41 43 43 20 77  t does.  (YACC w
4890: 6f 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61 20  ould generate a 
48a0: 6e 65 77 0a 20 20 2a 2a 20 73 74 61 72 74 20 73  new.  ** start s
48b0: 79 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20 63 61  ymbol in this ca
48c0: 73 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70  se.) */.  for(rp
48d0: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
48e0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
48f0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
4900: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
4910: 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  s; i++){.      i
4920: 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73  f( rp->rhs[i]==s
4930: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  p ){.        Err
4940: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
4950: 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 74 61  name,0,."The sta
4960: 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22  rt symbol \"%s\"
4970: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 5c   occurs on the \
4980: 0a 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65  .right-hand side
4990: 20 6f 66 20 61 20 72 75 6c 65 2e 20 54 68 69 73   of a rule. This
49a0: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
49b0: 61 20 70 61 72 73 65 72 20 77 68 69 63 68 20 5c  a parser which \
49c0: 0a 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70  .does not work p
49d0: 72 6f 70 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61  roperly.",sp->na
49e0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d  me);.        lem
49f0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
4a00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4a10: 0a 0a 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73  ..  /* The basis
4a20: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   configuration s
4a30: 65 74 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  et for the first
4a40: 20 73 74 61 74 65 0a 20 20 2a 2a 20 69 73 20 61   state.  ** is a
4a50: 6c 6c 20 72 75 6c 65 73 20 77 68 69 63 68 20 68  ll rules which h
4a60: 61 76 65 20 74 68 65 20 73 74 61 72 74 20 73 79  ave the start sy
4a70: 6d 62 6f 6c 20 61 73 20 74 68 65 69 72 0a 20 20  mbol as their.  
4a80: 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  ** left-hand sid
4a90: 65 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70  e */.  for(rp=sp
4aa0: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
4ab0: 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20  p->nextlhs){.   
4ac0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
4ad0: 6e 65 77 63 66 70 3b 0a 20 20 20 20 6e 65 77 63  newcfp;.    newc
4ae0: 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fp = Configlist_
4af0: 61 64 64 62 61 73 69 73 28 72 70 2c 30 29 3b 0a  addbasis(rp,0);.
4b00: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
4b10: 70 2d 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a  p->fws,0);.  }..
4b20: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
4b30: 20 66 69 72 73 74 20 73 74 61 74 65 2e 20 20 41   first state.  A
4b40: 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 20  ll other states 
4b50: 77 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d  will be.  ** com
4b60: 70 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61  puted automatica
4b70: 6c 6c 79 20 64 75 72 69 6e 67 20 74 68 65 20 63  lly during the c
4b80: 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 74 68  omputation of th
4b90: 65 20 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a  e first one..  *
4ba0: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70  * The returned p
4bb0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69  ointer to the fi
4bc0: 72 73 74 20 73 74 61 74 65 20 69 73 20 6e 6f 74  rst state is not
4bd0: 20 75 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69   used. */.  (voi
4be0: 64 29 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29  d)getstate(lemp)
4bf0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
4c00: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
4c10: 65 72 20 74 6f 20 61 20 73 74 61 74 65 20 77 68  er to a state wh
4c20: 69 63 68 20 69 73 20 64 65 73 63 72 69 62 65 64  ich is described
4c30: 20 62 79 20 74 68 65 20 63 6f 6e 66 69 67 75 72   by the configur
4c40: 61 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68  ation.** list wh
4c50: 69 63 68 20 68 61 73 20 62 65 65 6e 20 62 75 69  ich has been bui
4c60: 6c 74 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f  lt from calls to
4c70: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e   Configlist_add.
4c80: 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
4c90: 20 62 75 69 6c 64 73 68 69 66 74 73 28 2f 2a 20   buildshifts(/* 
4ca0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20  struct lemon *, 
4cb0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 20 2a  struct state * *
4cc0: 2f 29 3b 20 2f 2a 20 46 6f 72 77 64 20 72 65 66  /); /* Forwd ref
4cd0: 20 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75   */.PRIVATE stru
4ce0: 63 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61  ct state *getsta
4cf0: 74 65 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  te(lemp).struct 
4d00: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
4d10: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
4d20: 63 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75  cfp, *bp;.  stru
4d30: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a  ct state *stp;..
4d40: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
4d50: 20 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f 66   sorted basis of
4d60: 20 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e 20   the new state. 
4d70: 20 54 68 65 20 62 61 73 69 73 20 77 61 73 20 63   The basis was c
4d80: 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20  onstructed.  ** 
4d90: 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  by prior calls t
4da0: 6f 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64  o "Configlist_ad
4db0: 64 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20  dbasis()". */.  
4dc0: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62  Configlist_sortb
4dd0: 61 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20 43  asis();.  bp = C
4de0: 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28  onfiglist_basis(
4df0: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 73  );..  /* Get a s
4e00: 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61  tate with the sa
4e10: 6d 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73 74  me basis */.  st
4e20: 70 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28 62  p = State_find(b
4e30: 70 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29 7b  p);.  if( stp ){
4e40: 0a 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 20  .    /* A state 
4e50: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61  with the same ba
4e60: 73 69 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  sis already exis
4e70: 74 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74 68  ts!  Copy all th
4e80: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20  e follow-set.   
4e90: 20 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e 20   ** propagation 
4ea0: 6c 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20 73  links from the s
4eb0: 74 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73 74  tate under const
4ec0: 72 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  ruction into the
4ed0: 0a 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74  .    ** preexist
4ee0: 69 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e 20  ing state, then 
4ef0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
4f00: 20 74 6f 20 74 68 65 20 70 72 65 65 78 69 73 74   to the preexist
4f10: 69 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  ing state */.   
4f20: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
4f30: 78 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78  x, *y;.    for(x
4f40: 3d 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20  =bp, y=stp->bp; 
4f50: 78 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c  x && y; x=x->bp,
4f60: 20 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20   y=y->bp){.     
4f70: 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e   Plink_copy(&y->
4f80: 62 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20  bplp,x->bplp);. 
4f90: 20 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74       Plink_delet
4fa0: 65 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20  e(x->fplp);.    
4fb0: 20 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62    x->fplp = x->b
4fc0: 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  plp = 0;.    }. 
4fd0: 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c     cfp = Configl
4fe0: 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20  ist_return();.  
4ff0: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74    Configlist_eat
5000: 28 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (cfp);.  }else{.
5010: 20 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61 6c      /* This real
5020: 6c 79 20 69 73 20 61 20 6e 65 77 20 73 74 61 74  ly is a new stat
5030: 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6c  e.  Construct al
5040: 6c 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a 2f  l the details */
5050: 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  .    Configlist_
5060: 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20 20  closure(lemp);  
5070: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
5080: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
5090: 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f  losure */.    Co
50a0: 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b  nfiglist_sort();
50b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
50c0: 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  rt the configura
50d0: 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a  tion closure */.
50e0: 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67      cfp = Config
50f0: 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20 20  list_return();  
5100: 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65   /* Get a pointe
5110: 72 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 20  r to the config 
5120: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70 20  list */.    stp 
5130: 3d 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20 20  = State_new();  
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65           /* A ne
5150: 77 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72  w state structur
5160: 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43  e */.    MemoryC
5170: 68 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20 73  heck(stp);.    s
5180: 74 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20 20  tp->bp = bp;    
5190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
51a0: 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66  emember the conf
51b0: 69 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73 20  iguration basis 
51c0: 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70 20  */.    stp->cfp 
51d0: 3d 20 63 66 70 3b 20 20 20 20 20 20 20 20 20 20  = cfp;          
51e0: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
51f0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
5200: 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20  n closure */.   
5210: 20 73 74 70 2d 3e 69 6e 64 65 78 20 3d 20 6c 65   stp->index = le
5220: 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a  mp->nstate++; /*
5230: 20 45 76 65 72 79 20 73 74 61 74 65 20 67 65 74   Every state get
5240: 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  s a sequence num
5250: 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  ber */.    stp->
5260: 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
5270: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 63          /* No ac
5280: 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a 20  tions, yet. */. 
5290: 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28     State_insert(
52a0: 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20 20 20  stp,stp->bp);   
52b0: 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 73 74  /* Add to the st
52c0: 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ate table */.   
52d0: 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65 6d   buildshifts(lem
52e0: 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20 2f 2a  p,stp);       /*
52f0: 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 6f 6d   Recursively com
5300: 70 75 74 65 20 73 75 63 63 65 73 73 6f 72 20 73  pute successor s
5310: 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 72  tates */.  }.  r
5320: 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a  eturn stp;.}../*
5330: 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 73   Construct all s
5340: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73 20  uccessor states 
5350: 74 6f 20 74 68 65 20 67 69 76 65 6e 20 73 74 61  to the given sta
5360: 74 65 2e 20 20 41 20 22 73 75 63 63 65 73 73 6f  te.  A "successo
5370: 72 22 0a 2a 2a 20 73 74 61 74 65 20 69 73 20 61  r".** state is a
5380: 6e 79 20 73 74 61 74 65 20 77 68 69 63 68 20 63  ny state which c
5390: 61 6e 20 62 65 20 72 65 61 63 68 65 64 20 62 79  an be reached by
53a0: 20 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e 2e   a shift action.
53b0: 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
53c0: 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65 6d   buildshifts(lem
53d0: 70 2c 73 74 70 29 0a 73 74 72 75 63 74 20 6c 65  p,stp).struct le
53e0: 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72 75 63  mon *lemp;.struc
53f0: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
5400: 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20 66    /* The state f
5410: 72 6f 6d 20 77 68 69 63 68 20 73 75 63 63 65 73  rom which succes
5420: 73 6f 72 73 20 61 72 65 20 63 6f 6d 70 75 74 65  sors are compute
5430: 64 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20  d */.{.  struct 
5440: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 2f 2a  config *cfp;  /*
5450: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72   For looping thr
5460: 75 20 74 68 65 20 63 6f 6e 66 69 67 20 63 6c 6f  u the config clo
5470: 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f  sure of "stp" */
5480: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
5490: 20 2a 62 63 66 70 3b 20 2f 2a 20 46 6f 72 20 74   *bcfp; /* For t
54a0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f 6e  he inner loop on
54b0: 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20   config closure 
54c0: 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74  of "stp" */.  st
54d0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
54e0: 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75 63  ;  /* */.  struc
54f0: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20  t symbol *sp;   
5500: 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77  /* Symbol follow
5510: 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63  ing the dot in c
5520: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 63 66  onfiguration "cf
5530: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  p" */.  struct s
5540: 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a 20  ymbol *bsp;  /* 
5550: 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67  Symbol following
5560: 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66   the dot in conf
5570: 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66 70 22  iguration "bcfp"
5580: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61   */.  struct sta
5590: 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20 41  te *newstp; /* A
55a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
55b0: 63 63 65 73 73 6f 72 20 73 74 61 74 65 20 2a 2f  ccessor state */
55c0: 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e 66  ..  /* Each conf
55d0: 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d 65  iguration become
55e0: 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74 65 72  s complete after
55f0: 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73 20 74   it contibutes t
5600: 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a 20 20  o a successor.  
5610: 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69 74 69  ** state.  Initi
5620: 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69 67  ally, all config
5630: 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69 6e 63  urations are inc
5640: 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f 72  omplete */.  for
5650: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
5660: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
5670: 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d  t) cfp->status =
5680: 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20   INCOMPLETE;..  
5690: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
56a0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
56b0: 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74 65 20  ns of the state 
56c0: 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28 63  "stp" */.  for(c
56d0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
56e0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
56f0: 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73  {.    if( cfp->s
5700: 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20  tatus==COMPLETE 
5710: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f  ) continue;    /
5720: 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20 62  * Already used b
5730: 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a  y inner loop */.
5740: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74      if( cfp->dot
5750: 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20  >=cfp->rp->nrhs 
5760: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
5770: 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69 73  Can't shift this
5780: 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 43   config */.    C
5790: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
57a0: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
57b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65 74          /* Reset
57c0: 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69 67 20   the new config 
57d0: 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d 20  set */.    sp = 
57e0: 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66 70  cfp->rp->rhs[cfp
57f0: 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20  ->dot];         
5800: 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61 66      /* Symbol af
5810: 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a 0a  ter the dot */..
5820: 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79      /* For every
5830: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
5840: 6e 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  n the state "stp
5850: 22 20 77 68 69 63 68 20 68 61 73 20 74 68 65 20  " which has the 
5860: 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20 20  symbol "sp".    
5870: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 73  ** following its
5880: 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20 73 61   dot, add the sa
5890: 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  me configuration
58a0: 20 74 6f 20 74 68 65 20 62 61 73 69 73 20 73 65   to the basis se
58b0: 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 63  t under.    ** c
58c0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75 74 20  onstruction but 
58d0: 77 69 74 68 20 74 68 65 20 64 6f 74 20 73 68 69  with the dot shi
58e0: 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c 20  fted one symbol 
58f0: 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  to the right. */
5900: 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d 63 66  .    for(bcfp=cf
5910: 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d 62 63  p; bcfp; bcfp=bc
5920: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
5930: 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61 74 75   if( bcfp->statu
5940: 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f  s==COMPLETE ) co
5950: 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c  ntinue;    /* Al
5960: 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a 20 20  ready used */.  
5970: 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 64 6f      if( bcfp->do
5980: 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72 68  t>=bcfp->rp->nrh
5990: 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a  s ) continue; /*
59a0: 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69   Can't shift thi
59b0: 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 62  s one */.      b
59c0: 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e 72  sp = bcfp->rp->r
59d0: 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20 20  hs[bcfp->dot];  
59e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20           /* Get 
59f0: 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f 74  symbol after dot
5a00: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 73   */.      if( bs
5a10: 70 21 3d 73 70 20 29 20 63 6f 6e 74 69 6e 75 65  p!=sp ) continue
5a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5a30: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 73      /* Must be s
5a40: 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66 70 22  ame as for "cfp"
5a50: 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70 2d 3e   */.      bcfp->
5a60: 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54  status = COMPLET
5a70: 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E;              
5a80: 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69 73      /* Mark this
5a90: 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65 64 20   config as used 
5aa0: 2a 2f 0a 20 20 20 20 20 20 6e 65 77 20 3d 20 43  */.      new = C
5ab0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
5ac0: 69 73 28 62 63 66 70 2d 3e 72 70 2c 62 63 66 70  is(bcfp->rp,bcfp
5ad0: 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20 20  ->dot+1);.      
5ae0: 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77 2d 3e  Plink_add(&new->
5af0: 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20 20  bplp,bcfp);.    
5b00: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 20  }..    /* Get a 
5b10: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
5b20: 74 61 74 65 20 64 65 73 63 72 69 62 65 64 20 62  tate described b
5b30: 79 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66  y the basis conf
5b40: 69 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20 20  iguration set.  
5b50: 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65 64    ** constructed
5b60: 20 69 6e 20 74 68 65 20 70 72 65 63 65 64 69 6e   in the precedin
5b70: 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e 65  g loop */.    ne
5b80: 77 73 74 70 20 3d 20 67 65 74 73 74 61 74 65 28  wstp = getstate(
5b90: 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  lemp);..    /* T
5ba0: 68 65 20 73 74 61 74 65 20 22 6e 65 77 73 74 70  he state "newstp
5bb0: 22 20 69 73 20 72 65 61 63 68 65 64 20 66 72 6f  " is reached fro
5bc0: 6d 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70  m the state "stp
5bd0: 22 20 62 79 20 61 20 73 68 69 66 74 20 61 63 74  " by a shift act
5be0: 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ion.    ** on th
5bf0: 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a 2f  e symbol "sp" */
5c00: 0a 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28  .    Action_add(
5c10: 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73  &stp->ap,SHIFT,s
5c20: 70 2c 6e 65 77 73 74 70 29 3b 0a 20 20 7d 0a 7d  p,newstp);.  }.}
5c30: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
5c40: 74 20 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f  t the propagatio
5c50: 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20  n links.*/.void 
5c60: 46 69 6e 64 4c 69 6e 6b 73 28 6c 65 6d 70 29 0a  FindLinks(lemp).
5c70: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
5c80: 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
5c90: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
5ca0: 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73  cfp, *other;.  s
5cb0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
5cc0: 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  ;.  struct plink
5cd0: 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75   *plp;..  /* Hou
5ce0: 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c  sekeeping detail
5cf0: 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76  :.  ** Add to ev
5d00: 65 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69  ery propagate li
5d10: 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63  nk a pointer bac
5d20: 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  k to the state t
5d30: 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65  o.  ** which the
5d40: 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65   link is attache
5d50: 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  d. */.  for(i=0;
5d60: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
5d70: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
5d80: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
5d90: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
5da0: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
5db0: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
5dc0: 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74     cfp->stp = st
5dd0: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
5de0: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62  /* Convert all b
5df0: 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f  acklinks into fo
5e00: 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e  rward links.  On
5e10: 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20  ly the forward. 
5e20: 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73   ** links are us
5e30: 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ed in the follow
5e40: 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e  -set computation
5e50: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
5e60: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
5e70: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
5e80: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
5e90: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
5ea0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
5eb0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
5ec0: 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62    for(plp=cfp->b
5ed0: 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c  plp; plp; plp=pl
5ee0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
5ef0: 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63    other = plp->c
5f00: 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e  fp;.        Plin
5f10: 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70  k_add(&other->fp
5f20: 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d  lp,cfp);.      }
5f30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
5f40: 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c   Compute all fol
5f50: 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41  lowsets..**.** A
5f60: 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68   followset is th
5f70: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d  e set of all sym
5f80: 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63  bols which can c
5f90: 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  ome immediately.
5fa0: 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69  ** after a confi
5fb0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  guration..*/.voi
5fc0: 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73  d FindFollowSets
5fd0: 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
5fe0: 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
5ff0: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63  nt i;.  struct c
6000: 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74  onfig *cfp;.  st
6010: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
6020: 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b  .  int progress;
6030: 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a  .  int change;..
6040: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
6050: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
6060: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d  .    for(cfp=lem
6070: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66  p->sorted[i]->cf
6080: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
6090: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66  >next){.      cf
60a0: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
60b0: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20  MPLETE;.    }.  
60c0: 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20 20 20 20 70  }.  .  do{.    p
60d0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
60e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
60f0: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
6100: 20 20 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65        for(cfp=le
6110: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63  mp->sorted[i]->c
6120: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
6130: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
6140: 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73   if( cfp->status
6150: 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e  ==COMPLETE ) con
6160: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66  tinue;.        f
6170: 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70  or(plp=cfp->fplp
6180: 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e  ; plp; plp=plp->
6190: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  next){.         
61a0: 20 63 68 61 6e 67 65 20 3d 20 53 65 74 55 6e 69   change = SetUni
61b0: 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73  on(plp->cfp->fws
61c0: 2c 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20  ,cfp->fws);.    
61d0: 20 20 20 20 20 20 69 66 28 20 63 68 61 6e 67 65        if( change
61e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
61f0: 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73  plp->cfp->status
6200: 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20   = INCOMPLETE;. 
6210: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72             progr
6220: 65 73 73 20 3d 20 31 3b 0a 09 20 20 7d 0a 09 7d  ess = 1;..  }..}
6230: 0a 20 20 20 20 20 20 20 20 63 66 70 2d 3e 73 74  .        cfp->st
6240: 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b  atus = COMPLETE;
6250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6260: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
6270: 73 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  s );.}..static i
6280: 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c  nt resolve_confl
6290: 69 63 74 28 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75  ict();../* Compu
62a0: 74 65 20 74 68 65 20 72 65 64 75 63 65 20 61 63  te the reduce ac
62b0: 74 69 6f 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c  tions, and resol
62c0: 76 65 20 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f  ve conflicts..*/
62d0: 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69 6f 6e  .void FindAction
62e0: 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
62f0: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
6300: 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63  int i,j;.  struc
6310: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
6320: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
6330: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  tp;.  struct sym
6340: 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63  bol *sp;.  struc
6350: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f  t rule *rp;..  /
6360: 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65  * Add all of the
6370: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20   reduce actions 
6380: 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61  .  ** A reduce a
6390: 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66  ction is added f
63a0: 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20  or each element 
63b0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74  of the followset
63c0: 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69   of.  ** a confi
63d0: 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68  guration which h
63e0: 61 73 20 69 74 73 20 64 6f 74 20 61 74 20 74 68  as its dot at th
63f0: 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e  e extreme right.
6400: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
6410: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
6420: 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70   i++){   /* Loop
6430: 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73   over all states
6440: 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65   */.    stp = le
6450: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
6460: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
6470: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
6480: 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f  p->next){  /* Lo
6490: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66  op over all conf
64a0: 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  igurations */.  
64b0: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d      if( cfp->rp-
64c0: 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20  >nrhs==cfp->dot 
64d0: 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20  ){        /* Is 
64e0: 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65 20 72  dot at extreme r
64f0: 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20  ight? */.       
6500: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70   for(j=0; j<lemp
6510: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b  ->nterminal; j++
6520: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
6530: 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77   SetFind(cfp->fw
6540: 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s,j) ){.        
6550: 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64      /* Add a red
6560: 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68  uce action to th
6570: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68  e state "stp" wh
6580: 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20  ich will reduce 
6590: 62 79 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  by the.         
65a0: 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d     ** rule "cfp-
65b0: 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b  >rp" if the look
65c0: 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20  ahead symbol is 
65d0: 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a  "lemp->symbols[j
65e0: 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ]" */.          
65f0: 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74    Action_add(&st
6600: 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d  p->ap,REDUCE,lem
6610: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 63 66  p->symbols[j],cf
6620: 70 2d 3e 72 70 29 3b 0a 20 20 20 20 20 20 20 20  p->rp);.        
6630: 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20    }..}.      }. 
6640: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
6650: 64 64 20 74 68 65 20 61 63 63 65 70 74 69 6e 67  dd the accepting
6660: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20   token */.  if( 
6670: 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20  lemp->start ){. 
6680: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66     sp = Symbol_f
6690: 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29  ind(lemp->start)
66a0: 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
66b0: 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c  ) sp = lemp->rul
66c0: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b  e->lhs;.  }else{
66d0: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
66e0: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20  rule->lhs;.  }. 
66f0: 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 66   /* Add to the f
6700: 69 72 73 74 20 73 74 61 74 65 20 28 77 68 69 63  irst state (whic
6710: 68 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  h is always the 
6720: 73 74 61 72 74 69 6e 67 20 73 74 61 74 65 20 6f  starting state o
6730: 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74  f the.  ** finit
6740: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 29  e state machine)
6750: 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41 43   an action to AC
6760: 43 45 50 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b  CEPT if the look
6770: 61 68 65 61 64 20 69 73 20 74 68 65 0a 20 20 2a  ahead is the.  *
6780: 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69  * start nontermi
6790: 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f  nal.  */.  Actio
67a0: 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72  n_add(&lemp->sor
67b0: 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50  ted[0]->ap,ACCEP
67c0: 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52  T,sp,0);..  /* R
67d0: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
67e0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
67f0: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
6800: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
6810: 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70  action *ap, *nap
6820: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
6830: 74 65 20 2a 73 74 70 3b 0a 20 20 20 20 73 74 70  te *stp;.    stp
6840: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
6850: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
6860: 73 74 70 2d 3e 61 70 20 29 3b 0a 20 20 20 20 73  stp->ap );.    s
6870: 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f  tp->ap = Action_
6880: 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20  sort(stp->ap);. 
6890: 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
68a0: 70 3b 20 61 70 20 26 26 20 61 70 2d 3e 6e 65 78  p; ap && ap->nex
68b0: 74 3b 20 61 70 3d 6e 61 70 29 7b 0a 20 20 20 20  t; ap=nap){.    
68c0: 20 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65    for(nap=ap->ne
68d0: 78 74 3b 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e  xt; nap && nap->
68e0: 73 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d  sp==ap->sp; nap=
68f0: 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  nap->next){.    
6900: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20       /* The two 
6910: 61 63 74 69 6f 6e 73 20 22 61 70 22 20 61 6e 64  actions "ap" and
6920: 20 22 6e 61 70 22 20 68 61 76 65 20 74 68 65 20   "nap" have the 
6930: 73 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a  same lookahead..
6940: 20 20 20 20 20 20 20 20 20 2a 2a 20 46 69 67 75           ** Figu
6950: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
6960: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
6970: 2a 2f 0a 20 20 20 20 20 20 20 20 20 6c 65 6d 70  */.         lemp
6980: 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72  ->nconflict += r
6990: 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28  esolve_conflict(
69a0: 61 70 2c 6e 61 70 2c 6c 65 6d 70 2d 3e 65 72 72  ap,nap,lemp->err
69b0: 73 79 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sym);.      }.  
69c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
69d0: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66 6f  port an error fo
69e0: 72 20 65 61 63 68 20 72 75 6c 65 20 74 68 61 74  r each rule that
69f0: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72 65   can never be re
6a00: 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  duced. */.  for(
6a10: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
6a20: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20  p; rp=rp->next) 
6a30: 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20  rp->canReduce = 
6a40: 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30  FALSE;.  for(i=0
6a50: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
6a60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
6a70: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20  ct action *ap;. 
6a80: 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e     for(ap=lemp->
6a90: 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61  sorted[i]->ap; a
6aa0: 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
6ab0: 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
6ac0: 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61 70  ype==REDUCE ) ap
6ad0: 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63  ->x.rp->canReduc
6ae0: 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  e = TRUE;.    }.
6af0: 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d    }.  for(rp=lem
6b00: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
6b10: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
6b20: 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65  f( rp->canReduce
6b30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6b40: 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e   ErrorMsg(lemp->
6b50: 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c  filename,rp->rul
6b60: 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c 65  eline,"This rule
6b70: 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64 75   can not be redu
6b80: 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65  ced.\n");.    le
6b90: 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
6ba0: 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76    }.}../* Resolv
6bb0: 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65 74  e a conflict bet
6bc0: 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76  ween the two giv
6bd0: 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20  en actions.  If 
6be0: 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20  the.** conflict 
6bf0: 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76 65  can't be resolve
6c00: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
6c10: 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47  o..**.** NO LONG
6c20: 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f  ER TRUE:.**   To
6c30: 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   resolve a confl
6c40: 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20  ict, first look 
6c50: 74 6f 20 73 65 65 20 69 66 20 65 69 74 68 65 72  to see if either
6c60: 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20   action.**   is 
6c70: 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65  on an error rule
6c80: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
6c90: 20 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e   take the action
6ca0: 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e   which.**   is n
6cb0: 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ot associated wi
6cc0: 74 68 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c  th the error rul
6cd0: 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f  e.  If neither o
6ce0: 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69  r both.**   acti
6cf0: 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61 74  ons are associat
6d00: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
6d10: 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20   rule, then try 
6d20: 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63  to.**   use prec
6d30: 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76  edence to resolv
6d40: 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a  e the conflict..
6d50: 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
6d60: 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46  action is a SHIF
6d70: 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  T, then it must 
6d80: 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a  be apx.  This.**
6d90: 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20   function won't 
6da0: 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70  work if apx->typ
6db0: 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70  e==REDUCE and ap
6dc0: 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a  y->type==SHIFT..
6dd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
6de0: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61  solve_conflict(a
6df0: 70 78 2c 61 70 79 2c 65 72 72 73 79 6d 29 0a 73  px,apy,errsym).s
6e00: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
6e10: 78 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  x;.struct action
6e20: 20 2a 61 70 79 3b 0a 73 74 72 75 63 74 20 73 79   *apy;.struct sy
6e30: 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20  mbol *errsym;   
6e40: 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 73 79 6d  /* The error sym
6e50: 62 6f 6c 20 28 69 66 20 64 65 66 69 6e 65 64 2e  bol (if defined.
6e60: 20 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65    NULL otherwise
6e70: 29 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20  ) */.{.  struct 
6e80: 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70  symbol *spx, *sp
6e90: 79 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20  y;.  int errcnt 
6ea0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61  = 0;.  assert( a
6eb0: 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20  px->sp==apy->sp 
6ec0: 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  );  /* Otherwise
6ed0: 20 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20   there would be 
6ee0: 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  no conflict */. 
6ef0: 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d   if( apx->type==
6f00: 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79  SHIFT && apy->ty
6f10: 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20  pe==REDUCE ){.  
6f20: 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b    spx = apx->sp;
6f30: 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e  .    spy = apy->
6f40: 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20  x.rp->precsym;. 
6f50: 20 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c     if( spy==0 ||
6f60: 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20   spx->prec<0 || 
6f70: 73 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20  spy->prec<0 ){. 
6f80: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75       /* Not enou
6f90: 67 68 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e  gh precedence in
6fa0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  formation. */.  
6fb0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
6fc0: 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20  CONFLICT;.      
6fd0: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  errcnt++;.    }e
6fe0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
6ff0: 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20 20  c>spy->prec ){  
7000: 20 20 2f 2a 20 4c 6f 77 65 72 20 70 72 65 63 65    /* Lower prece
7010: 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20  dence wins */.  
7020: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
7030: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  RD_RESOLVED;.   
7040: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
7050: 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29  prec<spy->prec )
7060: 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  {.      apx->typ
7070: 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b  e = SH_RESOLVED;
7080: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
7090: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
70a0: 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f  rec && spx->asso
70b0: 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20 55  c==RIGHT ){ /* U
70c0: 73 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  se operator */. 
70d0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
70e0: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20   RD_RESOLVED;   
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73            /* ass
7110: 6f 63 69 61 74 69 76 69 74 79 20 2a 2f 0a 20 20  ociativity */.  
7120: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
7130: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
7140: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
7150: 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62  LEFT ){  /* to b
7160: 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20  reak tie */.    
7170: 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48    apx->type = SH
7180: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
7190: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
71a0: 72 74 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73  rt( spx->prec==s
71b0: 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d  py->prec && spx-
71c0: 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a  >assoc==NONE );.
71d0: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
71e0: 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20  = CONFLICT;.    
71f0: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
7200: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70  }.  }else if( ap
7210: 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  x->type==REDUCE 
7220: 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45  && apy->type==RE
7230: 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20  DUCE ){.    spx 
7240: 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65  = apx->x.rp->pre
7250: 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20  csym;.    spy = 
7260: 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apy->x.rp->precs
7270: 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d  ym;.    if( spx=
7280: 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20  =0 || spy==0 || 
7290: 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20  spx->prec<0 ||. 
72a0: 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c     spy->prec<0 |
72b0: 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  | spx->prec==spy
72c0: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
72d0: 61 70 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46  apy->type = CONF
72e0: 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63  LICT;.      errc
72f0: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nt++;.    }else 
7300: 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70  if( spx->prec>sp
7310: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
7320: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
7330: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
7340: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
7350: 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c<spy->prec ){. 
7360: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
7370: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
7380: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
7390: 20 2f 2a 20 43 61 6e 27 74 20 68 61 70 70 65 6e   /* Can't happen
73a0: 2e 20 20 53 68 69 66 74 73 20 68 61 76 65 20 74  .  Shifts have t
73b0: 6f 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 52 65  o come before Re
73c0: 64 75 63 65 73 20 6f 6e 20 74 68 65 0a 20 20 20  duces on the.   
73d0: 20 2a 2a 20 6c 69 73 74 20 62 65 63 61 75 73 65   ** list because
73e0: 20 74 68 65 20 72 65 64 75 63 65 73 20 77 65 72   the reduces wer
73f0: 65 20 61 64 64 65 64 20 6c 61 73 74 2e 20 20 48  e added last.  H
7400: 65 6e 63 65 2c 20 69 66 20 61 70 78 2d 3e 74 79  ence, if apx->ty
7410: 70 65 3d 3d 52 45 44 55 43 45 0a 20 20 20 20 2a  pe==REDUCE.    *
7420: 2a 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  * then it is imp
7430: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 70 79 2d  ossible for apy-
7440: 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 2a 2f 0a  >type==SHIFT */.
7450: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72    }.  return err
7460: 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  cnt;.}./********
7470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
7480: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e  om the file "con
7490: 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a  figlist.c" *****
74a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
74b0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
74c0: 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69  ines to processi
74d0: 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69  ng a configurati
74e0: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c  on list and buil
74f0: 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20  ding a state.** 
7500: 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
7510: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
7520: 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  /..static struct
7530: 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73   config *freelis
7540: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c  t = 0;      /* L
7550: 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66  ist of free conf
7560: 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  igurations */.st
7570: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
7580: 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b  ig *current = 0;
7590: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
75a0: 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75   list of configu
75b0: 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
75c0: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
75d0: 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30  **currentend = 0
75e0: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c  ;   /* Last on l
75f0: 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a  ist of configs *
7600: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
7610: 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20  config *basis = 
7620: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  0;         /* To
7630: 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73  p of list of bas
7640: 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74  is configs */.st
7650: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
7660: 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20  ig **basisend = 
7670: 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  0;     /* End of
7680: 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63   list of basis c
7690: 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65  onfigs */../* Re
76a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
76b0: 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72  o a new configur
76c0: 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45  ation */.PRIVATE
76d0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
76e0: 6e 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73  newconfig(){.  s
76f0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
7700: 77 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73  w;.  if( freelis
7710: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
7720: 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d  i;.    int amt =
7730: 20 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74   3;.    freelist
7740: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
7750: 67 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  g *)malloc( size
7760: 6f 66 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  of(struct config
7770: 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69 66 28  )*amt );.    if(
7780: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
7790: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
77a0: 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20  derr,"Unable to 
77b0: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
77c0: 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66 69 67  for a new config
77d0: 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20  uration.");.    
77e0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
77f0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7800: 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65  amt-1; i++) free
7810: 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26  list[i].next = &
7820: 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
7830: 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d     freelist[amt-
7840: 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  1].next = 0;.  }
7850: 0a 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73  .  new = freelis
7860: 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20  t;.  freelist = 
7870: 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
7880: 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a    return new;.}.
7890: 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72  ./* The configur
78a0: 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e  ation "old" is n
78b0: 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f  o longer used */
78c0: 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 64 65  .PRIVATE void de
78d0: 6c 65 74 65 63 6f 6e 66 69 67 28 6f 6c 64 29 0a  leteconfig(old).
78e0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f  struct config *o
78f0: 6c 64 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78  ld;.{.  old->nex
7900: 74 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20  t = freelist;.  
7910: 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a  freelist = old;.
7920: 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  }../* Initialize
7930: 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  d the configurat
7940: 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72  ion list builder
7950: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
7960: 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75  ist_init(){.  cu
7970: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72  rrent = 0;.  cur
7980: 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65  rentend = &curre
7990: 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b  nt;.  basis = 0;
79a0: 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62  .  basisend = &b
79b0: 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61  asis;.  Configta
79c0: 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65  ble_init();.  re
79d0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74  turn;.}../* Init
79e0: 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66  ialized the conf
79f0: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62  iguration list b
7a00: 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43  uilder */.void C
7a10: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28  onfiglist_reset(
7a20: 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30  ){.  current = 0
7a30: 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d  ;.  currentend =
7a40: 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73   &current;.  bas
7a50: 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65  is = 0;.  basise
7a60: 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43  nd = &basis;.  C
7a70: 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72  onfigtable_clear
7a80: 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  (0);.  return;.}
7a90: 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72  ../* Add another
7aa0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
7ab0: 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  o the configurat
7ac0: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75  ion list */.stru
7ad0: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
7ae0: 67 6c 69 73 74 5f 61 64 64 28 72 70 2c 64 6f 74  glist_add(rp,dot
7af0: 29 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72  ).struct rule *r
7b00: 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c  p;    /* The rul
7b10: 65 20 2a 2f 0a 69 6e 74 20 64 6f 74 3b 20 20 20  e */.int dot;   
7b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
7b30: 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f  x into the RHS o
7b40: 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72 65  f the rule where
7b50: 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f   the dot goes */
7b60: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
7b70: 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a  ig *cfp, model;.
7b80: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65  .  assert( curre
7b90: 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f  ntend!=0 );.  mo
7ba0: 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d  del.rp = rp;.  m
7bb0: 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a  odel.dot = dot;.
7bc0: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61    cfp = Configta
7bd0: 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29  ble_find(&model)
7be0: 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29  ;.  if( cfp==0 )
7bf0: 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63  {.    cfp = newc
7c00: 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70  onfig();.    cfp
7c10: 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63  ->rp = rp;.    c
7c20: 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  fp->dot = dot;. 
7c30: 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65     cfp->fws = Se
7c40: 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d  tNew();.    cfp-
7c50: 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  >stp = 0;.    cf
7c60: 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62  p->fplp = cfp->b
7c70: 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  plp = 0;.    cfp
7c80: 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ->next = 0;.    
7c90: 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20  cfp->bp = 0;.   
7ca0: 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63   *currentend = c
7cb0: 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65  fp;.    currente
7cc0: 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b  nd = &cfp->next;
7cd0: 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65  .    Configtable
7ce0: 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20  _insert(cfp);.  
7cf0: 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a  }.  return cfp;.
7d00: 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73 69  }../* Add a basi
7d10: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
7d20: 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  to the configura
7d30: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72  tion list */.str
7d40: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
7d50: 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28  iglist_addbasis(
7d60: 72 70 2c 64 6f 74 29 0a 73 74 72 75 63 74 20 72  rp,dot).struct r
7d70: 75 6c 65 20 2a 72 70 3b 0a 69 6e 74 20 64 6f 74  ule *rp;.int dot
7d80: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
7d90: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
7da0: 0a 0a 20 20 61 73 73 65 72 74 28 20 62 61 73 69  ..  assert( basi
7db0: 73 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  send!=0 );.  ass
7dc0: 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21  ert( currentend!
7dd0: 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70  =0 );.  model.rp
7de0: 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64   = rp;.  model.d
7df0: 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20  ot = dot;.  cfp 
7e00: 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69  = Configtable_fi
7e10: 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66  nd(&model);.  if
7e20: 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ( cfp==0 ){.    
7e30: 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28  cfp = newconfig(
7e40: 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d  );.    cfp->rp =
7e50: 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f   rp;.    cfp->do
7e60: 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70  t = dot;.    cfp
7e70: 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29  ->fws = SetNew()
7e80: 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d  ;.    cfp->stp =
7e90: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c   0;.    cfp->fpl
7ea0: 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20  p = cfp->bplp = 
7eb0: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74  0;.    cfp->next
7ec0: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62   = 0;.    cfp->b
7ed0: 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72  p = 0;.    *curr
7ee0: 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20  entend = cfp;.  
7ef0: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26    currentend = &
7f00: 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a  cfp->next;.    *
7f10: 62 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a  basisend = cfp;.
7f20: 20 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26      basisend = &
7f30: 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e  cfp->bp;.    Con
7f40: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
7f50: 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  cfp);.  }.  retu
7f60: 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f  rn cfp;.}../* Co
7f70: 6d 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75 72  mpute the closur
7f80: 65 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  e of the configu
7f90: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
7fa0: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63  oid Configlist_c
7fb0: 6c 6f 73 75 72 65 28 6c 65 6d 70 29 0a 73 74 72  losure(lemp).str
7fc0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
7fd0: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
7fe0: 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70  ig *cfp, *newcfp
7ff0: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
8000: 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73  *rp, *newrp;.  s
8010: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
8020: 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c  , *xsp;.  int i,
8030: 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28   dot;..  assert(
8040: 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29   currentend!=0 )
8050: 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72  ;.  for(cfp=curr
8060: 65 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  ent; cfp; cfp=cf
8070: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70  p->next){.    rp
8080: 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20   = cfp->rp;.    
8090: 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a  dot = cfp->dot;.
80a0: 20 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d      if( dot>=rp-
80b0: 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65  >nrhs ) continue
80c0: 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72  ;.    sp = rp->r
80d0: 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28  hs[dot];.    if(
80e0: 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45   sp->type==NONTE
80f0: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
8100: 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20  if( sp->rule==0 
8110: 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72  && sp!=lemp->err
8120: 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45  sym ){.        E
8130: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
8140: 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c  lename,rp->line,
8150: 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25  "Nonterminal \"%
8160: 73 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73  s\" has no rules
8170: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70  .",.          sp
8180: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
8190: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
81a0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
81b0: 20 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72   for(newrp=sp->r
81c0: 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72  ule; newrp; newr
81d0: 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73  p=newrp->nextlhs
81e0: 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66  ){.        newcf
81f0: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61  p = Configlist_a
8200: 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20  dd(newrp,0);.   
8210: 20 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31       for(i=dot+1
8220: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
8230: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73  +){.          xs
8240: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
8250: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73            if( xs
8260: 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
8270: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
8280: 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e   SetAdd(newcfp->
8290: 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b  fws,xsp->index);
82a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
82b0: 61 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20  ak;..  }else{.  
82c0: 20 20 20 20 20 20 20 20 20 20 53 65 74 55 6e 69            SetUni
82d0: 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78  on(newcfp->fws,x
82e0: 73 70 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20  sp->firstset);. 
82f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78             if( x
8300: 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 46 41 4c 53  sp->lambda==FALS
8310: 45 20 29 20 62 72 65 61 6b 3b 0a 09 20 20 7d 0a  E ) break;..  }.
8320: 09 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  .}.        if( i
8330: 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c 69  ==rp->nrhs ) Pli
8340: 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66 70 6c  nk_add(&cfp->fpl
8350: 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20 20 20  p,newcfp);.     
8360: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
8370: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72  eturn;.}../* Sor
8380: 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  t the configurat
8390: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
83a0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
83b0: 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20  (){.  current = 
83c0: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
83d0: 29 6d 73 6f 72 74 28 63 75 72 72 65 6e 74 2c 26  )msort(current,&
83e0: 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c  (current->next),
83f0: 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75  Configcmp);.  cu
8400: 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20  rrentend = 0;.  
8410: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f  return;.}../* So
8420: 72 74 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e  rt the basis con
8430: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
8440: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
8450: 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 7b 0a  st_sortbasis(){.
8460: 20 20 62 61 73 69 73 20 3d 20 28 73 74 72 75 63    basis = (struc
8470: 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74  t config *)msort
8480: 28 63 75 72 72 65 6e 74 2c 26 28 63 75 72 72 65  (current,&(curre
8490: 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66 69 67 63 6d  nt->bp),Configcm
84a0: 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d  p);.  basisend =
84b0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
84c0: 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
84d0: 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
84e0: 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   of the configur
84f0: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a  ation list and.*
8500: 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74  * reset the list
8510: 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69   */.struct confi
8520: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65  g *Configlist_re
8530: 74 75 72 6e 28 29 7b 0a 20 20 73 74 72 75 63 74  turn(){.  struct
8540: 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20   config *old;.  
8550: 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a 20  old = current;. 
8560: 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20   current = 0;.  
8570: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a  currentend = 0;.
8580: 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a    return old;.}.
8590: 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
85a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
85b0: 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   of the configur
85c0: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a  ation list and.*
85d0: 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74  * reset the list
85e0: 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69   */.struct confi
85f0: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61  g *Configlist_ba
8600: 73 69 73 28 29 7b 0a 20 20 73 74 72 75 63 74 20  sis(){.  struct 
8610: 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f  config *old;.  o
8620: 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20 20 62 61  ld = basis;.  ba
8630: 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73  sis = 0;.  basis
8640: 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  end = 0;.  retur
8650: 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72 65  n old;.}../* Fre
8660: 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f  e all elements o
8670: 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6e 66  f the given conf
8680: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a  iguration list *
8690: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
86a0: 74 5f 65 61 74 28 63 66 70 29 0a 73 74 72 75 63  t_eat(cfp).struc
86b0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b  t config *cfp;.{
86c0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
86d0: 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f 72   *nextcfp;.  for
86e0: 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78 74  (; cfp; cfp=next
86f0: 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63 66  cfp){.    nextcf
8700: 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20  p = cfp->next;. 
8710: 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e     assert( cfp->
8720: 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61  fplp==0 );.    a
8730: 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c 70  ssert( cfp->bplp
8740: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 63  ==0 );.    if( c
8750: 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72 65  fp->fws ) SetFre
8760: 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20  e(cfp->fws);.   
8770: 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63 66   deleteconfig(cf
8780: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
8790: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
87a0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
87b0: 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20 2a  file "error.c" *
87c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
87d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
87e0: 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72  /./*.** Code for
87f0: 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72 20   printing error 
8800: 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 2f 2a 20  message..*/../* 
8810: 46 69 6e 64 20 61 20 67 6f 6f 64 20 70 6c 61 63  Find a good plac
8820: 65 20 74 6f 20 62 72 65 61 6b 20 22 6d 73 67 22  e to break "msg"
8830: 20 73 6f 20 74 68 61 74 20 69 74 73 20 6c 65 6e   so that its len
8840: 67 74 68 20 69 73 20 61 74 20 6c 65 61 73 74 20  gth is at least 
8850: 22 6d 69 6e 22 0a 2a 2a 20 62 75 74 20 6e 6f 20  "min".** but no 
8860: 6d 6f 72 65 20 74 68 61 6e 20 22 6d 61 78 22 2e  more than "max".
8870: 20 20 4d 61 6b 65 20 74 68 65 20 70 6f 69 6e 74    Make the point
8880: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 6d 61 78   as close to max
8890: 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f   as possible..*/
88a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
88b0: 62 72 65 61 6b 28 6d 73 67 2c 6d 69 6e 2c 6d 61  break(msg,min,ma
88c0: 78 29 0a 63 68 61 72 20 2a 6d 73 67 3b 0a 69 6e  x).char *msg;.in
88d0: 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d 61 78 3b 0a  t min;.int max;.
88e0: 7b 0a 20 20 69 6e 74 20 69 2c 73 70 6f 74 3b 0a  {.  int i,spot;.
88f0: 20 20 63 68 61 72 20 63 3b 0a 20 20 66 6f 72 28    char c;.  for(
8900: 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20 69 3c 3d 6d  i=spot=min; i<=m
8910: 61 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 20  ax; i++){.    c 
8920: 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20 20 20 69 66  = msg[i];.    if
8930: 28 20 63 3d 3d 27 5c 74 27 20 29 20 6d 73 67 5b  ( c=='\t' ) msg[
8940: 69 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69 66  i] = ' ';.    if
8950: 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 6d 73 67  ( c=='\n' ){ msg
8960: 5b 69 5d 20 3d 20 27 20 27 3b 20 73 70 6f 74 20  [i] = ' '; spot 
8970: 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20  = i; break; }.  
8980: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 20 73 70    if( c==0 ){ sp
8990: 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d  ot = i; break; }
89a0: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2d 27 20  .    if( c=='-' 
89b0: 26 26 20 69 3c 6d 61 78 2d 31 20 29 20 73 70 6f  && i<max-1 ) spo
89c0: 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 69 66 28  t = i+1;.    if(
89d0: 20 63 3d 3d 27 20 27 20 29 20 73 70 6f 74 20 3d   c==' ' ) spot =
89e0: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
89f0: 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   spot;.}../*.** 
8a00: 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  The error messag
8a10: 65 20 69 73 20 73 70 6c 69 74 20 61 63 72 6f 73  e is split acros
8a20: 73 20 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 65 73  s multiple lines
8a30: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20   if necessary.  
8a40: 54 68 65 0a 2a 2a 20 73 70 6c 69 74 73 20 6f 63  The.** splits oc
8a50: 63 75 72 20 61 74 20 61 20 73 70 61 63 65 2c 20  cur at a space, 
8a60: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 73 70  if there is a sp
8a70: 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6e 65  ace available ne
8a80: 61 72 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66  ar the end.** of
8a90: 20 74 68 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 23 64   the line..*/.#d
8aa0: 65 66 69 6e 65 20 45 52 52 4d 53 47 53 49 5a 45  efine ERRMSGSIZE
8ab0: 20 20 31 30 30 30 30 20 2f 2a 20 48 6f 70 65 20    10000 /* Hope 
8ac0: 74 68 69 73 20 69 73 20 62 69 67 20 65 6e 6f 75  this is big enou
8ad0: 67 68 2e 20 20 4e 6f 20 77 61 79 20 74 6f 20 65  gh.  No way to e
8ae0: 72 72 6f 72 20 63 68 65 63 6b 20 2a 2f 0a 23 64  rror check */.#d
8af0: 65 66 69 6e 65 20 4c 49 4e 45 57 49 44 54 48 20  efine LINEWIDTH 
8b00: 20 20 20 20 20 37 39 20 2f 2a 20 4d 61 78 20 77       79 /* Max w
8b10: 69 64 74 68 20 6f 66 20 61 6e 79 20 6f 75 74 70  idth of any outp
8b20: 75 74 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69  ut line */.#defi
8b30: 6e 65 20 50 52 45 46 49 58 4c 49 4d 49 54 20 20  ne PREFIXLIMIT  
8b40: 20 20 33 30 20 2f 2a 20 4d 61 78 20 77 69 64 74    30 /* Max widt
8b50: 68 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20  h of the prefix 
8b60: 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a  on each line */.
8b70: 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 76 61  void ErrorMsg(va
8b80: 5f 61 6c 69 73 74 29 0a 76 61 5f 64 63 6c 0a 7b  _alist).va_dcl.{
8b90: 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  .  char *filenam
8ba0: 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b  e;.  int lineno;
8bb0: 0a 20 20 63 68 61 72 20 2a 66 6f 72 6d 61 74 3b  .  char *format;
8bc0: 0a 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 45  .  char errmsg[E
8bd0: 52 52 4d 53 47 53 49 5a 45 5d 3b 0a 20 20 63 68  RRMSGSIZE];.  ch
8be0: 61 72 20 70 72 65 66 69 78 5b 50 52 45 46 49 58  ar prefix[PREFIX
8bf0: 4c 49 4d 49 54 2b 31 30 5d 3b 0a 20 20 69 6e 74  LIMIT+10];.  int
8c00: 20 65 72 72 6d 73 67 73 69 7a 65 3b 0a 20 20 69   errmsgsize;.  i
8c10: 6e 74 20 70 72 65 66 69 78 73 69 7a 65 3b 0a 20  nt prefixsize;. 
8c20: 20 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 77 69   int availablewi
8c30: 64 74 68 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61  dth;.  va_list a
8c40: 70 3b 0a 20 20 69 6e 74 20 65 6e 64 2c 20 72 65  p;.  int end, re
8c50: 73 74 61 72 74 2c 20 62 61 73 65 3b 0a 0a 20 20  start, base;..  
8c60: 76 61 5f 73 74 61 72 74 28 61 70 29 3b 0a 20 20  va_start(ap);.  
8c70: 66 69 6c 65 6e 61 6d 65 20 3d 20 76 61 5f 61 72  filename = va_ar
8c80: 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 6c  g(ap,char*);.  l
8c90: 69 6e 65 6e 6f 20 3d 20 76 61 5f 61 72 67 28 61  ineno = va_arg(a
8ca0: 70 2c 69 6e 74 29 3b 0a 20 20 66 6f 72 6d 61 74  p,int);.  format
8cb0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 63 68 61   = va_arg(ap,cha
8cc0: 72 2a 29 3b 0a 20 20 2f 2a 20 50 72 65 70 61 72  r*);.  /* Prepar
8cd0: 65 20 61 20 70 72 65 66 69 78 20 74 6f 20 62 65  e a prefix to be
8ce0: 20 70 72 65 70 65 6e 64 65 64 20 74 6f 20 65 76   prepended to ev
8cf0: 65 72 79 20 6f 75 74 70 75 74 20 6c 69 6e 65 20  ery output line 
8d00: 2a 2f 0a 20 20 69 66 28 20 6c 69 6e 65 6e 6f 3e  */.  if( lineno>
8d10: 30 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  0 ){.    sprintf
8d20: 28 70 72 65 66 69 78 2c 22 25 2e 2a 73 3a 25 64  (prefix,"%.*s:%d
8d30: 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d 49 54 2d  : ",PREFIXLIMIT-
8d40: 31 30 2c 66 69 6c 65 6e 61 6d 65 2c 6c 69 6e 65  10,filename,line
8d50: 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  no);.  }else{.  
8d60: 20 20 73 70 72 69 6e 74 66 28 70 72 65 66 69 78    sprintf(prefix
8d70: 2c 22 25 2e 2a 73 3a 20 22 2c 50 52 45 46 49 58  ,"%.*s: ",PREFIX
8d80: 4c 49 4d 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d  LIMIT-10,filenam
8d90: 65 29 3b 0a 20 20 7d 0a 20 20 70 72 65 66 69 78  e);.  }.  prefix
8da0: 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28 70 72  size = strlen(pr
8db0: 65 66 69 78 29 3b 0a 20 20 61 76 61 69 6c 61 62  efix);.  availab
8dc0: 6c 65 77 69 64 74 68 20 3d 20 4c 49 4e 45 57 49  lewidth = LINEWI
8dd0: 44 54 48 20 2d 20 70 72 65 66 69 78 73 69 7a 65  DTH - prefixsize
8de0: 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
8df0: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
8e00: 67 65 20 2a 2f 0a 20 20 76 73 70 72 69 6e 74 66  ge */.  vsprintf
8e10: 28 65 72 72 6d 73 67 2c 66 6f 72 6d 61 74 2c 61  (errmsg,format,a
8e20: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
8e30: 3b 0a 20 20 65 72 72 6d 73 67 73 69 7a 65 20 3d  ;.  errmsgsize =
8e40: 20 73 74 72 6c 65 6e 28 65 72 72 6d 73 67 29 3b   strlen(errmsg);
8e50: 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61  .  /* Remove tra
8e60: 69 6c 69 6e 67 20 27 5c 6e 27 73 20 66 72 6f 6d  iling '\n's from
8e70: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
8e80: 67 65 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ge. */.  while( 
8e90: 65 72 72 6d 73 67 73 69 7a 65 3e 30 20 26 26 20  errmsgsize>0 && 
8ea0: 65 72 72 6d 73 67 5b 65 72 72 6d 73 67 73 69 7a  errmsg[errmsgsiz
8eb0: 65 2d 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  e-1]=='\n' ){.  
8ec0: 20 20 20 65 72 72 6d 73 67 5b 2d 2d 65 72 72 6d     errmsg[--errm
8ed0: 73 67 73 69 7a 65 5d 20 3d 20 30 3b 0a 20 20 7d  sgsize] = 0;.  }
8ee0: 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20 74 68 65  ..  /* Print the
8ef0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a   error message *
8f00: 2f 0a 20 20 62 61 73 65 20 3d 20 30 3b 0a 20 20  /.  base = 0;.  
8f10: 77 68 69 6c 65 28 20 65 72 72 6d 73 67 5b 62 61  while( errmsg[ba
8f20: 73 65 5d 21 3d 30 20 29 7b 0a 20 20 20 20 65 6e  se]!=0 ){.    en
8f30: 64 20 3d 20 72 65 73 74 61 72 74 20 3d 20 66 69  d = restart = fi
8f40: 6e 64 62 72 65 61 6b 28 26 65 72 72 6d 73 67 5b  ndbreak(&errmsg[
8f50: 62 61 73 65 5d 2c 30 2c 61 76 61 69 6c 61 62 6c  base],0,availabl
8f60: 65 77 69 64 74 68 29 3b 0a 20 20 20 20 72 65 73  ewidth);.    res
8f70: 74 61 72 74 20 2b 3d 20 62 61 73 65 3b 0a 20 20  tart += base;.  
8f80: 20 20 77 68 69 6c 65 28 20 65 72 72 6d 73 67 5b    while( errmsg[
8f90: 72 65 73 74 61 72 74 5d 3d 3d 27 20 27 20 29 20  restart]==' ' ) 
8fa0: 72 65 73 74 61 72 74 2b 2b 3b 0a 20 20 20 20 66  restart++;.    f
8fb0: 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 22 25  printf(stdout,"%
8fc0: 73 25 2e 2a 73 5c 6e 22 2c 70 72 65 66 69 78 2c  s%.*s\n",prefix,
8fd0: 65 6e 64 2c 26 65 72 72 6d 73 67 5b 62 61 73 65  end,&errmsg[base
8fe0: 5d 29 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 72  ]);.    base = r
8ff0: 65 73 74 61 72 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a  estart;.  }.}./*
9000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
9010: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d  From the file "m
9020: 61 69 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ain.c" *********
9030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
9050: 2a 2a 20 4d 61 69 6e 20 70 72 6f 67 72 61 6d 20  ** Main program 
9060: 66 69 6c 65 20 66 6f 72 20 74 68 65 20 4c 45 4d  file for the LEM
9070: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
9080: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f  tor..*/../* Repo
9090: 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  rt an out-of-mem
90a0: 6f 72 79 20 63 6f 6e 64 69 74 69 6f 6e 20 61 6e  ory condition an
90b0: 64 20 61 62 6f 72 74 2e 20 20 54 68 69 73 20 66  d abort.  This f
90c0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73  unction.** is us
90d0: 65 64 20 6d 6f 73 74 6c 79 20 62 79 20 74 68 65  ed mostly by the
90e0: 20 22 4d 65 6d 6f 72 79 43 68 65 63 6b 22 20 6d   "MemoryCheck" m
90f0: 61 63 72 6f 20 69 6e 20 73 74 72 75 63 74 2e 68  acro in struct.h
9100: 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d 6f 72 79 5f  .*/.void memory_
9110: 65 72 72 6f 72 28 29 7b 0a 20 20 66 70 72 69 6e  error(){.  fprin
9120: 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
9130: 66 20 6d 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74  f memory.  Abort
9140: 69 6e 67 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78  ing...\n");.  ex
9150: 69 74 28 31 29 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68  it(1);.}.../* Th
9160: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20  e main program. 
9170: 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61   Parse the comma
9180: 6e 64 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69  nd line and do i
9190: 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e  t... */.int main
91a0: 28 61 72 67 63 2c 61 72 67 76 29 0a 69 6e 74 20  (argc,argv).int 
91b0: 61 72 67 63 3b 0a 63 68 61 72 20 2a 2a 61 72 67  argc;.char **arg
91c0: 76 3b 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  v;.{.  static in
91d0: 74 20 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20  t version = 0;. 
91e0: 20 73 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c   static int rpfl
91f0: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
9200: 20 69 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d   int basisflag =
9210: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
9220: 20 63 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20   compress = 0;. 
9230: 20 73 74 61 74 69 63 20 69 6e 74 20 71 75 69 65   static int quie
9240: 74 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  t = 0;.  static 
9250: 69 6e 74 20 73 74 61 74 69 73 74 69 63 73 20 3d  int statistics =
9260: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
9270: 20 6d 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73   mhflag = 0;.  s
9280: 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f  tatic struct s_o
9290: 70 74 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d  ptions options[]
92a0: 20 3d 20 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c   = {.    {OPT_FL
92b0: 41 47 2c 20 22 62 22 2c 20 28 63 68 61 72 2a 29  AG, "b", (char*)
92c0: 26 62 61 73 69 73 66 6c 61 67 2c 20 22 50 72 69  &basisflag, "Pri
92d0: 6e 74 20 6f 6e 6c 79 20 74 68 65 20 62 61 73 69  nt only the basi
92e0: 73 20 69 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a  s in report."},.
92f0: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
9300: 63 22 2c 20 28 63 68 61 72 2a 29 26 63 6f 6d 70  c", (char*)&comp
9310: 72 65 73 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d  ress, "Don't com
9320: 70 72 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e  press the action
9330: 20 74 61 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b   table."},.    {
9340: 4f 50 54 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28  OPT_FLAG, "g", (
9350: 63 68 61 72 2a 29 26 72 70 66 6c 61 67 2c 20 22  char*)&rpflag, "
9360: 50 72 69 6e 74 20 67 72 61 6d 6d 61 72 20 77 69  Print grammar wi
9370: 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d  thout actions."}
9380: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
9390: 20 22 6d 22 2c 20 28 63 68 61 72 2a 29 26 6d 68   "m", (char*)&mh
93a0: 66 6c 61 67 2c 20 22 4f 75 74 70 75 74 20 61 20  flag, "Output a 
93b0: 6d 61 6b 65 68 65 61 64 65 72 73 20 63 6f 6d 70  makeheaders comp
93c0: 61 74 69 62 6c 65 20 66 69 6c 65 22 7d 2c 0a 20  atible file"},. 
93d0: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71     {OPT_FLAG, "q
93e0: 22 2c 20 28 63 68 61 72 2a 29 26 71 75 69 65 74  ", (char*)&quiet
93f0: 2c 20 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74  , "(Quiet) Don't
9400: 20 70 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72   print the repor
9410: 74 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b  t file."},.    {
9420: 4f 50 54 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28  OPT_FLAG, "s", (
9430: 63 68 61 72 2a 29 26 73 74 61 74 69 73 74 69 63  char*)&statistic
9440: 73 2c 20 22 50 72 69 6e 74 20 70 61 72 73 65 72  s, "Print parser
9450: 20 73 74 61 74 73 20 74 6f 20 73 74 61 6e 64 61   stats to standa
9460: 72 64 20 6f 75 74 70 75 74 2e 22 7d 2c 0a 20 20  rd output."},.  
9470: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 78 22    {OPT_FLAG, "x"
9480: 2c 20 28 63 68 61 72 2a 29 26 76 65 72 73 69 6f  , (char*)&versio
9490: 6e 2c 20 22 50 72 69 6e 74 20 74 68 65 20 76 65  n, "Print the ve
94a0: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c  rsion number."},
94b0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30  .    {OPT_FLAG,0
94c0: 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  ,0,0}.  };.  int
94d0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d   i;.  struct lem
94e0: 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e  on lem;..  OptIn
94f0: 69 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c  it(argv,options,
9500: 73 74 64 65 72 72 29 3b 0a 20 20 69 66 28 20 76  stderr);.  if( v
9510: 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70  ersion ){.     p
9520: 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72  rintf("Lemon ver
9530: 73 69 6f 6e 20 31 2e 30 5c 6e 22 0a 20 20 20 20  sion 1.0\n".    
9540: 20 20 20 22 43 6f 70 79 72 69 67 68 74 20 31 39     "Copyright 19
9550: 39 31 2d 31 39 39 37 20 62 79 20 44 2e 20 52 69  91-1997 by D. Ri
9560: 63 68 61 72 64 20 48 69 70 70 5c 6e 22 0a 20 20  chard Hipp\n".  
9570: 20 20 20 20 20 22 46 72 65 65 6c 79 20 64 69 73       "Freely dis
9580: 74 72 69 62 75 74 61 62 6c 65 20 75 6e 64 65 72  tributable under
9590: 20 74 68 65 20 47 4e 55 20 50 75 62 6c 69 63 20   the GNU Public 
95a0: 4c 69 63 65 6e 73 65 2e 5c 6e 22 0a 20 20 20 20  License.\n".    
95b0: 20 29 3b 0a 20 20 20 20 20 65 78 69 74 28 30 29   );.     exit(0)
95c0: 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 4f 70 74  ; .  }.  if( Opt
95d0: 4e 41 72 67 73 28 29 21 3d 31 20 29 7b 0a 20 20  NArgs()!=1 ){.  
95e0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
95f0: 2c 22 45 78 61 63 74 6c 79 20 6f 6e 65 20 66 69  ,"Exactly one fi
9600: 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
9610: 69 73 20 72 65 71 75 69 72 65 64 2e 5c 6e 22 29  is required.\n")
9620: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
9630: 20 7d 0a 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e   }.  lem.errorcn
9640: 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69  t = 0;..  /* Ini
9650: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 63 68  tialize the mach
9660: 69 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61 66 65  ine */.  Strsafe
9670: 5f 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f  _init();.  Symbo
9680: 6c 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74 61 74  l_init();.  Stat
9690: 65 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e  e_init();.  lem.
96a0: 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b  argv0 = argv[0];
96b0: 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20  .  lem.filename 
96c0: 3d 20 4f 70 74 41 72 67 28 30 29 3b 0a 20 20 6c  = OptArg(0);.  l
96d0: 65 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d 20 62  em.basisflag = b
96e0: 61 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e  asisflag;.  lem.
96f0: 6e 63 6f 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 20  nconflict = 0;. 
9700: 20 6c 65 6d 2e 6e 61 6d 65 20 3d 20 6c 65 6d 2e   lem.name = lem.
9710: 69 6e 63 6c 75 64 65 20 3d 20 6c 65 6d 2e 61 72  include = lem.ar
9720: 67 20 3d 20 6c 65 6d 2e 74 6f 6b 65 6e 74 79 70  g = lem.tokentyp
9730: 65 20 3d 20 6c 65 6d 2e 73 74 61 72 74 20 3d 20  e = lem.start = 
9740: 30 3b 0a 20 20 6c 65 6d 2e 73 74 61 63 6b 73 69  0;.  lem.stacksi
9750: 7a 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 65 72  ze = 0;.  lem.er
9760: 72 6f 72 20 3d 20 6c 65 6d 2e 6f 76 65 72 66 6c  ror = lem.overfl
9770: 6f 77 20 3d 20 6c 65 6d 2e 66 61 69 6c 75 72 65  ow = lem.failure
9780: 20 3d 20 6c 65 6d 2e 61 63 63 65 70 74 20 3d 20   = lem.accept = 
9790: 6c 65 6d 2e 74 6f 6b 65 6e 64 65 73 74 20 3d 0a  lem.tokendest =.
97a0: 20 20 20 20 20 6c 65 6d 2e 74 6f 6b 65 6e 70 72       lem.tokenpr
97b0: 65 66 69 78 20 3d 20 6c 65 6d 2e 6f 75 74 6e 61  efix = lem.outna
97c0: 6d 65 20 3d 20 6c 65 6d 2e 65 78 74 72 61 63 6f  me = lem.extraco
97d0: 64 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 74 61  de = 0;.  lem.ta
97e0: 62 6c 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 53  blesize = 0;.  S
97f0: 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a  ymbol_new("$");.
9800: 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53    lem.errsym = S
9810: 79 6d 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72  ymbol_new("error
9820: 22 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  ");..  /* Parse 
9830: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
9840: 2f 0a 20 20 50 61 72 73 65 28 26 6c 65 6d 29 3b  /.  Parse(&lem);
9850: 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72  .  if( lem.error
9860: 63 6e 74 20 29 20 65 78 69 74 28 6c 65 6d 2e 65  cnt ) exit(lem.e
9870: 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69 66 28 20  rrorcnt);.  if( 
9880: 6c 65 6d 2e 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  lem.rule==0 ){. 
9890: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
98a0: 72 2c 22 45 6d 70 74 79 20 67 72 61 6d 6d 61 72  r,"Empty grammar
98b0: 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
98c0: 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  1);.  }..  /* Co
98d0: 75 6e 74 20 61 6e 64 20 69 6e 64 65 78 20 74 68  unt and index th
98e0: 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65  e symbols of the
98f0: 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 6c 65   grammar */.  le
9900: 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62  m.nsymbol = Symb
9910: 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 53 79  ol_count();.  Sy
9920: 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75  mbol_new("{defau
9930: 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d  lt}");.  lem.sym
9940: 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c 5f 61 72  bols = Symbol_ar
9950: 72 61 79 6f 66 28 29 3b 0a 20 20 71 73 6f 72 74  rayof();.  qsort
9960: 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d  (lem.symbols,lem
9970: 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65 6f  .nsymbol+1,sizeo
9980: 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
9990: 29 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74 28  ),.        (int(
99a0: 2a 29 28 29 29 53 79 6d 62 6f 6c 63 6d 70 70 29  *)())Symbolcmpp)
99b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
99c0: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  lem.nsymbol; i++
99d0: 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d  ) lem.symbols[i]
99e0: 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 66  ->index = i;.  f
99f0: 6f 72 28 69 3d 31 3b 20 69 73 75 70 70 65 72 28  or(i=1; isupper(
9a00: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  lem.symbols[i]->
9a10: 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a  name[0]); i++);.
9a20: 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20    lem.nterminal 
9a30: 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  = i;..  /* Gener
9a40: 61 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f 66  ate a reprint of
9a50: 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69 66   the grammar, if
9a60: 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74 68   requested on th
9a70: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a  e command line *
9a80: 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20 29  /.  if( rpflag )
9a90: 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26 6c  {.    Reprint(&l
9aa0: 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
9ab0: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
9ac0: 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c 6c  the size for all
9ad0: 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72 73   follow and firs
9ae0: 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53 65  t sets */.    Se
9af0: 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d 69  tSize(lem.ntermi
9b00: 6e 61 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  nal);..    /* Fi
9b10: 6e 64 20 74 68 65 20 70 72 65 63 65 64 65 6e 63  nd the precedenc
9b20: 65 20 66 6f 72 20 65 76 65 72 79 20 70 72 6f 64  e for every prod
9b30: 75 63 74 69 6f 6e 20 72 75 6c 65 20 28 74 68 61  uction rule (tha
9b40: 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20 20  t has one) */.  
9b50: 20 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64    FindRulePreced
9b60: 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  ences(&lem);..  
9b70: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
9b80: 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d 69   lambda-nontermi
9b90: 6e 61 6c 73 20 61 6e 64 20 74 68 65 20 66 69 72  nals and the fir
9ba0: 73 74 2d 73 65 74 73 20 66 6f 72 20 65 76 65 72  st-sets for ever
9bb0: 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d  y.    ** nonterm
9bc0: 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e 64  inal */.    Find
9bd0: 46 69 72 73 74 53 65 74 73 28 26 6c 65 6d 29 3b  FirstSets(&lem);
9be0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
9bf0: 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65   all LR(0) state
9c00: 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f 72 64 20  s.  Also record 
9c10: 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61  follow-set propa
9c20: 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69  gation.    ** li
9c30: 6e 6b 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  nks so that the 
9c40: 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20 62  follow-set can b
9c50: 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72  e computed later
9c60: 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74 61   */.    lem.nsta
9c70: 74 65 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e 64  te = 0;.    Find
9c80: 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20 20  States(&lem);.  
9c90: 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20 53    lem.sorted = S
9ca0: 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 3b 0a  tate_arrayof();.
9cb0: 0a 20 20 20 20 2f 2a 20 54 69 65 20 75 70 20 6c  .    /* Tie up l
9cc0: 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20 74 68 65  oose ends on the
9cd0: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
9ce0: 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c 69  ks */.    FindLi
9cf0: 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  nks(&lem);..    
9d00: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66  /* Compute the f
9d10: 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20 65 76 65  ollow set of eve
9d20: 72 79 20 72 65 64 75 63 69 62 6c 65 20 63 6f 6e  ry reducible con
9d30: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  figuration */.  
9d40: 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73    FindFollowSets
9d50: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
9d60: 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69  Compute the acti
9d70: 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  on tables */.   
9d80: 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c 65   FindActions(&le
9d90: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
9da0: 72 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20  ress the action 
9db0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 66  tables */.    if
9dc0: 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29 20  ( compress==0 ) 
9dd0: 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 26  CompressTables(&
9de0: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
9df0: 6e 65 72 61 74 65 20 61 20 72 65 70 6f 72 74 20  nerate a report 
9e00: 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 67 65  of the parser ge
9e10: 6e 65 72 61 74 65 64 2e 20 20 28 74 68 65 20 22  nerated.  (the "
9e20: 79 2e 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20  y.output" file) 
9e30: 2a 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69 65  */.    if( !quie
9e40: 74 20 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74  t ) ReportOutput
9e50: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
9e60: 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75  Generate the sou
9e70: 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  rce code for the
9e80: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52   parser */.    R
9e90: 65 70 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c  eportTable(&lem,
9ea0: 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f   mhflag);..    /
9eb0: 2a 20 50 72 6f 64 75 63 65 20 61 20 68 65 61 64  * Produce a head
9ec0: 65 72 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20  er file for use 
9ed0: 62 79 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20  by the scanner. 
9ee0: 20 28 54 68 69 73 20 73 74 65 70 20 69 73 0a 20   (This step is. 
9ef0: 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66     ** omitted if
9f00: 20 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e   the "-m" option
9f10: 20 69 73 20 75 73 65 64 20 62 65 63 61 75 73 65   is used because
9f20: 20 6d 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c   makeheaders wil
9f30: 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74  l.    ** generat
9f40: 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75  e the file for u
9f50: 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  s.) */.    if( !
9f60: 6d 68 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48  mhflag ) ReportH
9f70: 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d  eader(&lem);.  }
9f80: 0a 20 20 69 66 28 20 73 74 61 74 69 73 74 69 63  .  if( statistic
9f90: 73 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  s ){.    printf(
9fa0: 22 50 61 72 73 65 72 20 73 74 61 74 69 73 74 69  "Parser statisti
9fb0: 63 73 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73  cs: %d terminals
9fc0: 2c 20 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  , %d nonterminal
9fd0: 73 2c 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a  s, %d rules\n",.
9fe0: 20 20 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69        lem.ntermi
9ff0: 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c  nal, lem.nsymbol
a000: 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c   - lem.nterminal
a010: 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20  , lem.nrule);.  
a020: 20 20 70 72 69 6e 74 66 28 22 20 20 20 20 20 20    printf("      
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
a040: 73 74 61 74 65 73 2c 20 25 64 20 70 61 72 73 65  states, %d parse
a050: 72 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c  r table entries,
a060: 20 25 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22   %d conflicts\n"
a070: 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61  ,.      lem.nsta
a080: 74 65 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a  te, lem.tablesiz
a090: 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74  e, lem.nconflict
a0a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d  );.  }.  if( lem
a0b0: 2e 6e 63 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20  .nconflict ){.  
a0c0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
a0d0: 2c 22 25 64 20 70 61 72 73 69 6e 67 20 63 6f 6e  ,"%d parsing con
a0e0: 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e  flicts.\n",lem.n
a0f0: 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 20  conflict);.  }. 
a100: 20 65 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63   exit(lem.errorc
a110: 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69  nt + lem.nconfli
a120: 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ct);.}./********
a130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
a140: 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 73 6f 72  m the file "msor
a150: 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.c" ***********
a160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a170: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65  ****/./*.** A ge
a180: 6e 65 72 69 63 20 6d 65 72 67 65 2d 73 6f 72 74  neric merge-sort
a190: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
a1a0: 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70  USAGE:.** Let "p
a1b0: 74 72 22 20 62 65 20 61 20 70 6f 69 6e 74 65 72  tr" be a pointer
a1c0: 20 74 6f 20 73 6f 6d 65 20 73 74 72 75 63 74 75   to some structu
a1d0: 72 65 20 77 68 69 63 68 20 69 73 20 61 74 20 74  re which is at t
a1e0: 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20  he head of.** a 
a1f0: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
a200: 6c 69 73 74 2e 20 20 54 68 65 6e 20 74 6f 20 73  list.  Then to s
a210: 6f 72 74 20 74 68 65 20 6c 69 73 74 20 63 61 6c  ort the list cal
a220: 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72  l:.**.**     ptr
a230: 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26 28 70   = msort(ptr,&(p
a240: 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63  tr->next),cmpfnc
a250: 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  );.**.** In the 
a260: 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22 20  above, "cmpfnc" 
a270: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
a280: 61 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 68  a function which
a290: 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f   compares.** two
a2a0: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
a2b0: 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
a2c0: 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67  returns an integ
a2d0: 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72  er, as in.** str
a2e0: 63 6d 70 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  cmp.  The second
a2f0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
a300: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 6f  ointer to the po
a310: 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20  inter to the.** 
a320: 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f  second element o
a330: 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  f the linked lis
a340: 74 2e 20 20 54 68 69 73 20 61 64 64 72 65 73 73  t.  This address
a350: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
a360: 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65  ute.** the offse
a370: 74 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20  t to the "next" 
a380: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
a390: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
a3a0: 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68   offset to.** th
a3b0: 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20 6d  e "next" field m
a3c0: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20  ust be constant 
a3d0: 66 6f 72 20 61 6c 6c 20 73 74 72 75 63 74 75 72  for all structur
a3e0: 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  es in the list..
a3f0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  **.** The functi
a400: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77  on returns a new
a410: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 69   pointer which i
a420: 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  s the head of th
a430: 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72 20  e list.** after 
a440: 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  sorting..**.** A
a450: 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72  LGORITHM:.** Mer
a460: 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a  ge-sort..*/../*.
a470: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
a480: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ter to the next 
a490: 73 74 72 75 63 74 75 72 65 20 69 6e 20 74 68 65  structure in the
a4a0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f   linked list..*/
a4b0: 0a 23 64 65 66 69 6e 65 20 4e 45 58 54 28 41 29  .#define NEXT(A)
a4c0: 20 28 2a 28 63 68 61 72 2a 2a 29 28 28 28 69 6e   (*(char**)(((in
a4d0: 74 29 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a 2f  t)A)+offset))../
a4e0: 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20  *.** Inputs:.** 
a4f0: 20 20 61 3a 20 20 20 20 20 20 20 41 20 73 6f 72    a:       A sor
a500: 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  ted, null-termin
a510: 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74  ated linked list
a520: 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29  .  (May be null)
a530: 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20 20 20  ..**   b:       
a540: 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74  A sorted, null-t
a550: 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64  erminated linked
a560: 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20   list.  (May be 
a570: 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a  null)..**   cmp:
a580: 20 20 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74       A pointer t
a590: 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
a5a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20   function..**   
a5b0: 6f 66 66 73 65 74 3a 20 20 4f 66 66 73 65 74 20  offset:  Offset 
a5c0: 69 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65  in the structure
a5d0: 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66   to the "next" f
a5e0: 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ield..**.** Retu
a5f0: 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41  rn Value:.**   A
a600: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a610: 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64  head of a sorted
a620: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
a630: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a   the elements.**
a640: 20 20 20 6f 66 20 62 6f 74 68 20 61 20 61 6e 64     of both a and
a650: 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65   b..**.** Side e
a660: 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65  ffects:.**   The
a670: 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73   "next" pointers
a680: 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e   for elements in
a690: 20 74 68 65 20 6c 69 73 74 73 20 61 20 61 6e 64   the lists a and
a6a0: 20 62 20 61 72 65 0a 2a 2a 20 20 20 63 68 61 6e   b are.**   chan
a6b0: 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ged..*/.static c
a6c0: 68 61 72 20 2a 6d 65 72 67 65 28 61 2c 62 2c 63  har *merge(a,b,c
a6d0: 6d 70 2c 6f 66 66 73 65 74 29 0a 63 68 61 72 20  mp,offset).char 
a6e0: 2a 61 3b 0a 63 68 61 72 20 2a 62 3b 0a 69 6e 74  *a;.char *b;.int
a6f0: 20 28 2a 63 6d 70 29 28 29 3b 0a 69 6e 74 20 6f   (*cmp)();.int o
a700: 66 66 73 65 74 3b 0a 7b 0a 20 20 63 68 61 72 20  ffset;.{.  char 
a710: 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20 20  *ptr, *head;..  
a720: 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
a730: 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c 73  head = b;.  }els
a740: 65 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20 20  e if( b==0 ){.  
a750: 20 20 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d 65    head = a;.  }e
a760: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 28 2a 63  lse{.    if( (*c
a770: 6d 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20  mp)(a,b)<0 ){.  
a780: 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20 20      ptr = a;.   
a790: 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a     a = NEXT(a);.
a7a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a7b0: 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20   ptr = b;.      
a7c0: 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20  b = NEXT(b);.   
a7d0: 20 7d 0a 20 20 20 20 68 65 61 64 20 3d 20 70 74   }.    head = pt
a7e0: 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 61 20  r;.    while( a 
a7f0: 26 26 20 62 20 29 7b 0a 20 20 20 20 20 20 69 66  && b ){.      if
a800: 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20  ( (*cmp)(a,b)<0 
a810: 29 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28  ){.        NEXT(
a820: 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 20 20  ptr) = a;.      
a830: 20 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20    ptr = a;.     
a840: 20 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a     a = NEXT(a);.
a850: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a860: 20 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d       NEXT(ptr) =
a870: 20 62 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20   b;.        ptr 
a880: 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 62 20 3d  = b;.        b =
a890: 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 20 20   NEXT(b);.      
a8a0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
a8b0: 61 20 29 20 4e 45 58 54 28 70 74 72 29 20 3d 20  a ) NEXT(ptr) = 
a8c0: 61 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 4e  a;.    else    N
a8d0: 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20  EXT(ptr) = b;.  
a8e0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 65 61 64 3b  }.  return head;
a8f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73  .}../*.** Inputs
a900: 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a 20 20 20 20  :.**   list:    
a910: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73    Pointer to a s
a920: 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20 6c 69 73  ingly-linked lis
a930: 74 20 6f 66 20 73 74 72 75 63 74 75 72 65 73 2e  t of structures.
a940: 0a 2a 2a 20 20 20 6e 65 78 74 3a 20 20 20 20 20  .**   next:     
a950: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   Pointer to poin
a960: 74 65 72 20 74 6f 20 74 68 65 20 73 65 63 6f 6e  ter to the secon
a970: 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  d element of the
a980: 20 6c 69 73 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a   list..**   cmp:
a990: 20 20 20 20 20 20 20 41 20 63 6f 6d 70 61 72 69         A compari
a9a0: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  son function..**
a9b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65  .** Return Value
a9c0: 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72  :.**   A pointer
a9d0: 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
a9e0: 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f  a sorted list co
a9f0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65  ntaining the ele
aa00: 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 72 67 69 6e  ments.**   orgin
aa10: 61 6c 6c 79 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a  ally in list..**
aa20: 0a 2a 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  .** Side effects
aa30: 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74  :.**   The "next
aa40: 22 20 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65  " pointers for e
aa50: 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73 74 20  lements in list 
aa60: 61 72 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  are changed..*/.
aa70: 23 64 65 66 69 6e 65 20 4c 49 53 54 53 49 5a 45  #define LISTSIZE
aa80: 20 33 30 0a 63 68 61 72 20 2a 6d 73 6f 72 74 28   30.char *msort(
aa90: 6c 69 73 74 2c 6e 65 78 74 2c 63 6d 70 29 0a 63  list,next,cmp).c
aaa0: 68 61 72 20 2a 6c 69 73 74 3b 0a 63 68 61 72 20  har *list;.char 
aab0: 2a 2a 6e 65 78 74 3b 0a 69 6e 74 20 28 2a 63 6d  **next;.int (*cm
aac0: 70 29 28 29 3b 0a 7b 0a 20 20 69 6e 74 20 6f 66  p)();.{.  int of
aad0: 66 73 65 74 3b 0a 20 20 63 68 61 72 20 2a 65 70  fset;.  char *ep
aae0: 3b 0a 20 20 63 68 61 72 20 2a 73 65 74 5b 4c 49  ;.  char *set[LI
aaf0: 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69  STSIZE];.  int i
ab00: 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 69 6e  ;.  offset = (in
ab10: 74 29 6e 65 78 74 20 2d 20 28 69 6e 74 29 6c 69  t)next - (int)li
ab20: 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  st;.  for(i=0; i
ab30: 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20  <LISTSIZE; i++) 
ab40: 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68  set[i] = 0;.  wh
ab50: 69 6c 65 28 20 6c 69 73 74 20 29 7b 0a 20 20 20  ile( list ){.   
ab60: 20 65 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20   ep = list;.    
ab70: 6c 69 73 74 20 3d 20 4e 45 58 54 28 6c 69 73 74  list = NEXT(list
ab80: 29 3b 0a 20 20 20 20 4e 45 58 54 28 65 70 29 20  );.    NEXT(ep) 
ab90: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
aba0: 3b 20 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26  ; i<LISTSIZE-1 &
abb0: 26 20 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b  & set[i]!=0; i++
abc0: 29 7b 0a 20 20 20 20 20 20 65 70 20 3d 20 6d 65  ){.      ep = me
abd0: 72 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d  rge(ep,set[i],cm
abe0: 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  p,offset);.     
abf0: 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20   set[i] = 0;.   
ac00: 20 7d 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d 20   }.    set[i] = 
ac10: 65 70 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30  ep;.  }.  ep = 0
ac20: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c  ;.  for(i=0; i<L
ac30: 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66  ISTSIZE; i++) if
ac40: 28 20 73 65 74 5b 69 5d 20 29 20 65 70 20 3d 20  ( set[i] ) ep = 
ac50: 6d 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c  merge(ep,set[i],
ac60: 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72  cmp,offset);.  r
ac70: 65 74 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a  eturn ep;.}./***
ac80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac90: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
aca0: 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a  ile "option.c" *
acb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
acc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69  *********/.stati
acd0: 63 20 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73  c char **argv;.s
ace0: 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f  tatic struct s_o
acf0: 70 74 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74  ptions *op;.stat
ad00: 69 63 20 46 49 4c 45 20 2a 65 72 72 73 74 72 65  ic FILE *errstre
ad10: 61 6d 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f  am;..#define ISO
ad20: 50 54 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27  PT(X) ((X)[0]=='
ad30: 2d 27 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c  -'||(X)[0]=='+'|
ad40: 7c 73 74 72 63 68 72 28 28 58 29 2c 27 3d 27 29  |strchr((X),'=')
ad50: 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  !=0)../*.** Prin
ad60: 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  t the command li
ad70: 6e 65 20 77 69 74 68 20 61 20 63 61 72 72 6f 74  ne with a carrot
ad80: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
ad90: 20 6b 2d 74 68 20 63 68 61 72 61 63 74 65 72 0a   k-th character.
ada0: 2a 2a 20 6f 66 20 74 68 65 20 6e 2d 74 68 20 66  ** of the n-th f
adb0: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
adc0: 76 6f 69 64 20 65 72 72 6c 69 6e 65 28 6e 2c 6b  void errline(n,k
add0: 2c 65 72 72 29 0a 69 6e 74 20 6e 3b 0a 69 6e 74  ,err).int n;.int
ade0: 20 6b 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b   k;.FILE *err;.{
adf0: 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b  .  int spcnt, i;
ae00: 0a 20 20 73 70 63 6e 74 20 3d 20 30 3b 0a 20 20  .  spcnt = 0;.  
ae10: 69 66 28 20 61 72 67 76 5b 30 5d 20 29 20 66 70  if( argv[0] ) fp
ae20: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 22 2c 61  rintf(err,"%s",a
ae30: 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63 6e 74  rgv[0]);.  spcnt
ae40: 20 3d 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 30   = strlen(argv[0
ae50: 5d 29 20 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d  ]) + 1;.  for(i=
ae60: 31 3b 20 69 3c 6e 20 26 26 20 61 72 67 76 5b 69  1; i<n && argv[i
ae70: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72  ]; i++){.    fpr
ae80: 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61  intf(err," %s",a
ae90: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63  rgv[i]);.    spc
aea0: 6e 74 20 2b 3d 20 73 74 72 6c 65 6e 28 61 72 67  nt += strlen(arg
aeb0: 76 5b 69 5d 2b 31 29 3b 0a 20 20 7d 0a 20 20 73  v[i]+1);.  }.  s
aec0: 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72  pcnt += k;.  for
aed0: 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  (; argv[i]; i++)
aee0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25   fprintf(err," %
aef0: 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69  s",argv[i]);.  i
af00: 66 28 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20  f( spcnt<20 ){. 
af10: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
af20: 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22  \n%*s^-- here\n"
af30: 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65  ,spcnt,"");.  }e
af40: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
af50: 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20  (err,"\n%*shere 
af60: 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22  --^\n",spcnt-7,"
af70: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
af80: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
af90: 78 20 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f  x of the N-th no
afa0: 6e 2d 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e  n-switch argumen
afb0: 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  t.  Return -1.**
afc0: 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20   if N is out of 
afd0: 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  range..*/.static
afe0: 20 69 6e 74 20 61 72 67 69 6e 64 65 78 28 6e 29   int argindex(n)
aff0: 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20  .int n;.{.  int 
b000: 69 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73  i;.  int dashdas
b010: 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67  h = 0;.  if( arg
b020: 76 21 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30  v!=0 && *argv!=0
b030: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
b040: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   argv[i]; i++){.
b050: 20 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61        if( dashda
b060: 73 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67  sh || !ISOPT(arg
b070: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  v[i]) ){.       
b080: 20 69 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75   if( n==0 ) retu
b090: 72 6e 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d  rn i;.        n-
b0a0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
b0b0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
b0c0: 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64  [i],"--")==0 ) d
b0d0: 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20  ashdash = 1;.   
b0e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b0f0: 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68  -1;.}..static ch
b100: 61 72 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d  ar emsg[] = "Com
b110: 6d 61 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78  mand line syntax
b120: 20 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a   error: ";../*.*
b130: 2a 20 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67  * Process a flag
b140: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72   command line ar
b150: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
b160: 63 20 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67  c int handleflag
b170: 73 28 69 2c 65 72 72 29 0a 69 6e 74 20 69 3b 0a  s(i,err).int i;.
b180: 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69  FILE *err;.{.  i
b190: 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65 72 72 63  nt v;.  int errc
b1a0: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b  nt = 0;.  int j;
b1b0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a  .  for(j=0; op[j
b1c0: 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20  ].label; j++){. 
b1d0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 26 61     if( strcmp(&a
b1e0: 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e  rgv[i][1],op[j].
b1f0: 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65 61  label)==0 ) brea
b200: 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72 67  k;.  }.  v = arg
b210: 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31  v[i][0]=='-' ? 1
b220: 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a   : 0;.  if( op[j
b230: 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20  ].label==0 ){.  
b240: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
b250: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
b260: 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69  %sundefined opti
b270: 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  on.\n",emsg);.  
b280: 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c      errline(i,1,
b290: 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  err);.    }.    
b2a0: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73  errcnt++;.  }els
b2b0: 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  e if( op[j].type
b2c0: 3d 3d 4f 50 54 5f 46 4c 41 47 20 29 7b 0a 20 20  ==OPT_FLAG ){.  
b2d0: 20 20 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e    *((int*)op[j].
b2e0: 61 72 67 29 20 3d 20 76 3b 0a 20 20 7d 65 6c 73  arg) = v;.  }els
b2f0: 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  e if( op[j].type
b300: 3d 3d 4f 50 54 5f 46 46 4c 41 47 20 29 7b 0a 20  ==OPT_FFLAG ){. 
b310: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29     (*(void(*)())
b320: 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b  (op[j].arg))(v);
b330: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
b340: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66  ( err ){.      f
b350: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6d 69  printf(err,"%smi
b360: 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f  ssing argument o
b370: 6e 20 73 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73  n switch.\n",ems
b380: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
b390: 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,1,err);.    
b3a0: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
b3b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72    }.  return err
b3c0: 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  cnt;.}../*.** Pr
b3d0: 6f 63 65 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20  ocess a command 
b3e0: 6c 69 6e 65 20 73 77 69 74 63 68 20 77 68 69 63  line switch whic
b3f0: 68 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  h has an argumen
b400: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
b410: 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69 2c   handleswitch(i,
b420: 65 72 72 29 0a 69 6e 74 20 69 3b 0a 46 49 4c 45  err).int i;.FILE
b430: 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 6c   *err;.{.  int l
b440: 76 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20  v = 0;.  double 
b450: 64 76 20 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72  dv = 0.0;.  char
b460: 20 2a 73 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a   *sv = 0, *end;.
b470: 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e    char *cp;.  in
b480: 74 20 6a 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e  t j;.  int errcn
b490: 74 20 3d 20 30 3b 0a 20 20 63 70 20 3d 20 73 74  t = 0;.  cp = st
b4a0: 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27  rchr(argv[i],'='
b4b0: 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20  );.  *cp = 0;.  
b4c0: 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c  for(j=0; op[j].l
b4d0: 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  abel; j++){.    
b4e0: 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
b4f0: 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d  i],op[j].label)=
b500: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
b510: 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69    *cp = '=';.  i
b520: 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d  f( op[j].label==
b530: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  0 ){.    if( err
b540: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
b550: 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e  f(err,"%sundefin
b560: 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d  ed option.\n",em
b570: 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69  sg);.      errli
b580: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
b590: 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b   }.    errcnt++;
b5a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70  .  }else{.    cp
b5b0: 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ++;.    switch( 
b5c0: 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[j].type ){.  
b5d0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
b5e0: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
b5f0: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
b600: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
b610: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
b620: 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75  r,"%soption requ
b630: 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
b640: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
b650: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
b660: 30 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  0,err);.        
b670: 7d 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  }.        errcnt
b680: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
b690: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
b6a0: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
b6b0: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
b6c0: 20 20 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28      dv = strtod(
b6d0: 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20  cp,&end);.      
b6e0: 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20    if( *end ){.  
b6f0: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
b700: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
b710: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c  printf(err,"%sil
b720: 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
b730: 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  in floating-poin
b740: 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65  t argument.\n",e
b750: 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  msg);.          
b760: 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 28 69 6e    errline(i,((in
b770: 74 29 65 6e 64 29 2d 28 69 6e 74 29 61 72 67 76  t)end)-(int)argv
b780: 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  [i],err);.      
b790: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b7a0: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  errcnt++;.      
b7b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
b7c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
b7d0: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
b7e0: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
b7f0: 20 20 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28      lv = strtol(
b800: 63 70 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20  cp,&end,0);.    
b810: 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a      if( *end ){.
b820: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
b830: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
b840: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
b850: 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65  illegal characte
b860: 72 20 69 6e 20 69 6e 74 65 67 65 72 20 61 72 67  r in integer arg
b870: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
b880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
b890: 6c 69 6e 65 28 69 2c 28 28 69 6e 74 29 65 6e 64  line(i,((int)end
b8a0: 29 2d 28 69 6e 74 29 61 72 67 76 5b 69 5d 2c 65  )-(int)argv[i],e
b8b0: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rr);.          }
b8c0: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e  .          errcn
b8d0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
b8e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b8f0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
b900: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
b910: 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73  _FSTR:.        s
b920: 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20  v = cp;.        
b930: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b940: 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74   switch( op[j].t
b950: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
b960: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
b970: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
b980: 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  :.        break;
b990: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
b9a0: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64  DBL:.        *(d
b9b0: 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72  ouble*)(op[j].ar
b9c0: 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20  g) = dv;.       
b9d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b9e0: 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
b9f0: 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
ba00: 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64  ))(op[j].arg))(d
ba10: 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
ba20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
ba30: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a  T_INT:.        *
ba40: 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  (int*)(op[j].arg
ba50: 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20  ) = lv;.        
ba60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ba70: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
ba80: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29      (*(void(*)()
ba90: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28 69  )(op[j].arg))((i
baa0: 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20 20 20 20  nt)lv);.        
bab0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bac0: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
bad0: 20 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70 5b     *(char**)(op[
bae0: 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20 20  j].arg) = sv;.  
baf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bb00: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
bb10: 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69  :.        (*(voi
bb20: 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72  d(*)())(op[j].ar
bb30: 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20  g))(sv);.       
bb40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bb50: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
bb60: 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69  t;.}..int OptIni
bb70: 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68 61 72 20  t(a,o,err).char 
bb80: 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70  **a;.struct s_op
bb90: 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c 45 20 2a  tions *o;.FILE *
bba0: 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 65 72 72  err;.{.  int err
bbb0: 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20  cnt = 0;.  argv 
bbc0: 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20  = a;.  op = o;. 
bbd0: 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72   errstream = err
bbe0: 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26 26 20  ;.  if( argv && 
bbf0: 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20  *argv && op ){. 
bc00: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
bc10: 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20  r(i=1; argv[i]; 
bc20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
bc30: 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20  argv[i][0]=='+' 
bc40: 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  || argv[i][0]=='
bc50: 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  -' ){.        er
bc60: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c  rcnt += handlefl
bc70: 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  ags(i,err);.    
bc80: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
bc90: 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20  hr(argv[i],'=') 
bca0: 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e  ){.        errcn
bcb0: 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63  t += handleswitc
bcc0: 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  h(i,err);.      
bcd0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
bce0: 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20  ( errcnt>0 ){.  
bcf0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56    fprintf(err,"V
bd00: 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  alid command lin
bd10: 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22  e options for \"
bd20: 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29  %s\" are:\n",*a)
bd30: 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29  ;.    OptPrint()
bd40: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
bd50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bd60: 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 29  ..int OptNArgs()
bd70: 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  {.  int cnt = 0;
bd80: 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20  .  int dashdash 
bd90: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
bda0: 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 61  if( argv!=0 && a
bdb0: 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20  rgv[0]!=0 ){.   
bdc0: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
bdd0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
bde0: 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21  f( dashdash || !
bdf0: 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29  ISOPT(argv[i]) )
be00: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
be10: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
be20: 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68  ,"--")==0 ) dash
be30: 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  dash = 1;.    }.
be40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74    }.  return cnt
be50: 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72  ;.}..char *OptAr
be60: 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20  g(n).int n;.{.  
be70: 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67  int i;.  i = arg
be80: 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75  index(n);.  retu
be90: 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69  rn i>=0 ? argv[i
bea0: 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f  ] : 0;.}..void O
beb0: 70 74 45 72 72 28 6e 29 0a 69 6e 74 20 6e 3b 0a  ptErr(n).int n;.
bec0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
bed0: 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20   argindex(n);.  
bee0: 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69  if( i>=0 ) errli
bef0: 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d  ne(i,0,errstream
bf00: 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72  );.}..void OptPr
bf10: 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  int(){.  int i;.
bf20: 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a    int max, len;.
bf30: 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72    max = 0;.  for
bf40: 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65  (i=0; op[i].labe
bf50: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e  l; i++){.    len
bf60: 20 3d 20 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e   = strlen(op[i].
bf70: 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20  label) + 1;.    
bf80: 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79  switch( op[i].ty
bf90: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
bfa0: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
bfb0: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
bfc0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
bfd0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49        case OPT_I
bfe0: 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  NT:.      case O
bff0: 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20  PT_FINT:.       
c000: 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20   len += 9;      
c010: 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c   /* length of "<
c020: 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20  integer>" */.   
c030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c040: 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a    case OPT_DBL:.
c050: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
c060: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e  DBL:.        len
c070: 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20   += 6;       /* 
c080: 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c  length of "<real
c090: 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  >" */.        br
c0a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
c0b0: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63  OPT_STR:.      c
c0c0: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
c0d0: 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20        len += 8; 
c0e0: 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
c0f0: 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f  of "<string>" */
c100: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
c110: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65      }.    if( le
c120: 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65  n>max ) max = le
c130: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
c140: 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69  ; op[i].label; i
c150: 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ++){.    switch(
c160: 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20   op[i].type ){. 
c170: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c       case OPT_FL
c180: 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  AG:.      case O
c190: 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20  PT_FFLAG:.      
c1a0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
c1b0: 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73  eam,"  -%-*s  %s
c1c0: 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61  \n",max,op[i].la
c1d0: 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  bel,op[i].messag
c1e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
c1f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
c200: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
c210: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
c220: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
c230: 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e 74  tream,"  %s=<int
c240: 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  eger>%*s  %s\n",
c250: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
c260: 20 20 20 20 20 20 20 6d 61 78 2d 73 74 72 6c 65         max-strle
c270: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39  n(op[i].label)-9
c280: 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  ,"",op[i].messag
c290: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
c2a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
c2b0: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
c2c0: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
c2d0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
c2e0: 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 72 65 61  tream,"  %s=<rea
c2f0: 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b  l>%*s  %s\n",op[
c300: 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20  i].label,.      
c310: 20 20 20 20 6d 61 78 2d 73 74 72 6c 65 6e 28 6f      max-strlen(o
c320: 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 2c 22 22  p[i].label)-6,""
c330: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
c340: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
c350: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
c360: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
c370: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
c380: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
c390: 61 6d 2c 22 20 20 25 73 3d 3c 73 74 72 69 6e 67  am,"  %s=<string
c3a0: 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
c3b0: 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
c3c0: 20 20 20 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70     max-strlen(op
c3d0: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 2c 22 22 2c  [i].label)-8,"",
c3e0: 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a  op[i].message);.
c3f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c400: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a     }.  }.}./****
c410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c420: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
c430: 65 20 22 70 61 72 73 65 2e 63 22 20 2a 2a 2a 2a  e "parse.c" ****
c440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c450: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
c460: 49 6e 70 75 74 20 66 69 6c 65 20 70 61 72 73 65  Input file parse
c470: 72 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20  r for the LEMON 
c480: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
c490: 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20 73 74 61  ..*/../* The sta
c4a0: 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
c4b0: 20 2a 2f 0a 73 74 72 75 63 74 20 70 73 74 61 74   */.struct pstat
c4c0: 65 20 7b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  e {.  char *file
c4d0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e  name;       /* N
c4e0: 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74  ame of the input
c4f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 74   file */.  int t
c500: 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20 20 20 20  okenlineno;     
c510: 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 61   /* Linenumber a
c520: 74 20 77 68 69 63 68 20 63 75 72 72 65 6e 74 20  t which current 
c530: 74 6f 6b 65 6e 20 73 74 61 72 74 73 20 2a 2f 0a  token starts */.
c540: 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
c550: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c560: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 6f 20 66  r of errors so f
c570: 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  ar */.  char *to
c580: 6b 65 6e 73 74 61 72 74 3b 20 20 20 20 20 2f 2a  kenstart;     /*
c590: 20 54 65 78 74 20 6f 66 20 63 75 72 72 65 6e 74   Text of current
c5a0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
c5b0: 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b 20 20 20  ct lemon *gp;   
c5c0: 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 74 61 74    /* Global stat
c5d0: 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20 20 65 6e  e vector */.  en
c5e0: 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a 20 20 20  um e_state {.   
c5f0: 20 49 4e 49 54 49 41 4c 49 5a 45 2c 0a 20 20 20   INITIALIZE,.   
c600: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
c610: 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20 20 20 57  L_OR_RULE,.    W
c620: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
c630: 4b 45 59 57 4f 52 44 2c 0a 20 20 20 20 57 41 49  KEYWORD,.    WAI
c640: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52  TING_FOR_DECL_AR
c650: 47 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  G,.    WAITING_F
c660: 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
c670: 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e  MBOL,.    WAITIN
c680: 47 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 20  G_FOR_ARROW,.   
c690: 20 49 4e 5f 52 48 53 2c 0a 20 20 20 20 4c 48 53   IN_RHS,.    LHS
c6a0: 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 20 20 4c 48  _ALIAS_1,.    LH
c6b0: 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 20 20 4c  S_ALIAS_2,.    L
c6c0: 48 53 5f 41 4c 49 41 53 5f 33 2c 0a 20 20 20 20  HS_ALIAS_3,.    
c6d0: 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 20  RHS_ALIAS_1,.   
c6e0: 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20   RHS_ALIAS_2,.  
c6f0: 20 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52    PRECEDENCE_MAR
c700: 4b 5f 31 2c 0a 20 20 20 20 50 52 45 43 45 44 45  K_1,.    PRECEDE
c710: 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20 20 20 20  NCE_MARK_2,.    
c720: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
c730: 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 52 45 53  E_ERROR,.    RES
c740: 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
c750: 52 52 4f 52 2c 0a 20 20 20 20 57 41 49 54 49 4e  RROR,.    WAITIN
c760: 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52  G_FOR_DESTRUCTOR
c770: 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49  _SYMBOL,.    WAI
c780: 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50  TING_FOR_DATATYP
c790: 45 5f 53 59 4d 42 4f 4c 0a 20 20 7d 20 73 74 61  E_SYMBOL.  } sta
c7a0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
c7b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
c7c0: 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
c7d0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
c7e0: 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 20  bol *lhs;       
c7f0: 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 73 69   /* Left-hand si
c800: 64 65 20 6f 66 20 63 75 72 72 65 6e 74 20 72 75  de of current ru
c810: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 68  le */.  char *lh
c820: 73 61 6c 69 61 73 3b 20 20 20 20 20 20 20 20 20  salias;         
c830: 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20     /* Alias for 
c840: 74 68 65 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74  the LHS */.  int
c850: 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20 20 20   nrhs;          
c860: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c870: 72 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  r of right-hand 
c880: 73 69 64 65 20 73 79 6d 62 6f 6c 73 20 73 65 65  side symbols see
c890: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  n */.  struct sy
c8a0: 6d 62 6f 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53  mbol *rhs[MAXRHS
c8b0: 5d 3b 20 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f  ];  /* RHS symbo
c8c0: 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 6c  ls */.  char *al
c8d0: 69 61 73 5b 4d 41 58 52 48 53 5d 3b 20 20 20 20  ias[MAXRHS];    
c8e0: 20 20 20 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f     /* Aliases fo
c8f0: 72 20 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f  r each RHS symbo
c900: 6c 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20  l (or NULL) */. 
c910: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 70 72   struct rule *pr
c920: 65 76 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50  evrule;     /* P
c930: 72 65 76 69 6f 75 73 20 72 75 6c 65 20 70 61 72  revious rule par
c940: 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  sed */.  char *d
c950: 65 63 6c 6b 65 79 77 6f 72 64 3b 20 20 20 20 20  eclkeyword;     
c960: 20 20 20 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f      /* Keyword o
c970: 66 20 61 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  f a declaration 
c980: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 64 65 63 6c  */.  char **decl
c990: 61 72 67 73 6c 6f 74 3b 20 20 20 20 20 20 20 20  argslot;        
c9a0: 2f 2a 20 57 68 65 72 65 20 74 68 65 20 64 65 63  /* Where the dec
c9b0: 6c 61 72 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e  laration argumen
c9c0: 74 20 73 68 6f 75 6c 64 20 62 65 20 70 75 74 20  t should be put 
c9d0: 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c 6c 6e  */.  int *declln
c9e0: 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20  slot;           
c9f0: 2f 2a 20 57 68 65 72 65 20 74 68 65 20 64 65 63  /* Where the dec
ca00: 6c 61 72 61 74 69 6f 6e 20 6c 69 6e 65 6e 75 6d  laration linenum
ca10: 62 65 72 20 69 73 20 70 75 74 20 2a 2f 0a 20 20  ber is put */.  
ca20: 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64 65 63  enum e_assoc dec
ca30: 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73  lassoc;    /* As
ca40: 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f 63 69  sign this associ
ca50: 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72  ation to decl ar
ca60: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  guments */.  int
ca70: 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20 20 20   preccounter;   
ca80: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 69 67          /* Assig
ca90: 6e 20 74 68 69 73 20 70 72 65 63 65 64 65 6e 63  n this precedenc
caa0: 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65  e to decl argume
cab0: 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nts */.  struct 
cac0: 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c 65 3b  rule *firstrule;
cad0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
cae0: 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69 6e 20  o first rule in 
caf0: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
cb00: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6c 61   struct rule *la
cb10: 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50  strule;     /* P
cb20: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 6f  ointer to the mo
cb30: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
cb40: 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f  ed rule */.};../
cb50: 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c 65  * Parse a single
cb60: 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63   token */.static
cb70: 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65 74 6f   void parseoneto
cb80: 6b 65 6e 28 70 73 70 29 0a 73 74 72 75 63 74 20  ken(psp).struct 
cb90: 70 73 74 61 74 65 20 2a 70 73 70 3b 0a 7b 0a 20  pstate *psp;.{. 
cba0: 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20   char *x;.  x = 
cbb0: 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b  Strsafe(psp->tok
cbc0: 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20 2f 2a  enstart);     /*
cbd0: 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65 6e 20   Save the token 
cbe0: 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23  permanently */.#
cbf0: 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22 25  if 0.  printf("%
cc00: 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d  s:%d: Token=[%s]
cc10: 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70   state=%d\n",psp
cc20: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
cc30: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
cc40: 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a   x,psp->state);.
cc50: 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
cc60: 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20   psp->state ){. 
cc70: 20 20 20 63 61 73 65 20 49 4e 49 54 49 41 4c 49     case INITIALI
cc80: 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e 70  ZE:.      psp->p
cc90: 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  revrule = 0;.   
cca0: 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
ccb0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
ccc0: 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20  sp->firstrule = 
ccd0: 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20  psp->lastrule = 
cce0: 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 67 70  0;.      psp->gp
ccf0: 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  ->nrule = 0;.   
cd00: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
cd10: 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a  to next case */.
cd20: 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
cd30: 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
cd40: 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  E:.      if( x[0
cd50: 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20  ]=='%' ){.      
cd60: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
cd70: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
cd80: 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d  KEYWORD;.      }
cd90: 65 6c 73 65 20 69 66 28 20 69 73 6c 6f 77 65 72  else if( islower
cda0: 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
cdb0: 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d    psp->lhs = Sym
cdc0: 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
cdd0: 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20      psp->nrhs = 
cde0: 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
cdf0: 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20  lhsalias = 0;.  
ce00: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
ce10: 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41   = WAITING_FOR_A
ce20: 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROW;.      }els
ce30: 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20  e if( x[0]=='{' 
ce40: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
ce50: 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20  sp->prevrule==0 
ce60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
ce70: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
ce80: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
ce90: 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73 20  neno,."There is 
cea0: 6e 6f 74 20 70 72 69 6f 72 20 72 75 6c 65 20 6f  not prior rule o
ceb0: 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74 74  pon which to att
cec0: 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a 66  ach the code \.f
ced0: 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62 65  ragment which be
cee0: 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e  gins on this lin
cef0: 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e.");.          
cf00: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
cf10: 0a 09 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d  ..}else if( psp-
cf20: 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 21  >prevrule->code!
cf30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
cf40: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
cf50: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
cf60: 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20 66  nlineno,."Code f
cf70: 72 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e 69 6e  ragment beginnin
cf80: 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  g on this line i
cf90: 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20  s not the first 
cfa0: 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20  \.to follow the 
cfb0: 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29  previous rule.")
cfc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
cfd0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
cfe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
cff0: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
d000: 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73 70 2d  ule->line = psp-
d010: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20  >tokenlineno;.  
d020: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
d030: 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20 26 78  vrule->code = &x
d040: 5b 31 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65  [1];..}.      }e
d050: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b  lse if( x[0]=='[
d060: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
d070: 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45 44  ->state = PRECED
d080: 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20  ENCE_MARK_1;.   
d090: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d0a0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
d0b0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
d0c0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
d0d0: 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73       "Token \"%s
d0e0: 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69 74  \" should be eit
d0f0: 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61 20  her \"%%\" or a 
d100: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65  nonterminal name
d110: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 29  .",.          x)
d120: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
d130: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
d140: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d150: 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45      case PRECEDE
d160: 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20  NCE_MARK_1:.    
d170: 20 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78    if( !isupper(x
d180: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
d190: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
d1a0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
d1b0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
d1c0: 20 20 20 22 54 68 65 20 70 72 65 63 65 64 65 6e     "The preceden
d1d0: 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62  ce symbol must b
d1e0: 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b  e a terminal.");
d1f0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
d200: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
d210: 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70  }else if( psp->p
d220: 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20  revrule==0 ){.  
d230: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
d240: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
d250: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
d260: 20 20 20 20 20 20 20 20 20 22 54 68 65 72 65 20           "There 
d270: 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65  is no prior rule
d280: 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63 65   to assign prece
d290: 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22  dence \"[%s]\"."
d2a0: 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ,x);.        psp
d2b0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
d2c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73      }else if( ps
d2d0: 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65  p->prevrule->pre
d2e0: 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20  csym!=0 ){.     
d2f0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
d300: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
d310: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65  okenlineno,."Pre
d320: 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20  cedence mark on 
d330: 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
d340: 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20   the first \.to 
d350: 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69  follow the previ
d360: 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20  ous rule.");.   
d370: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
d380: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
d390: 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  e{.        psp->
d3a0: 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79  prevrule->precsy
d3b0: 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  m = Symbol_new(x
d3c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d3d0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52   psp->state = PR
d3e0: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b  ECEDENCE_MARK_2;
d3f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d400: 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43    case PRECEDENC
d410: 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20  E_MARK_2:.      
d420: 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b  if( x[0]!=']' ){
d430: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
d440: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
d450: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
d460: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
d470: 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72  sing \"]\" on pr
d480: 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29  ecedence mark.")
d490: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
d4a0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
d4b0: 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74   }.      psp->st
d4c0: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
d4d0: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
d4e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d4f0: 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
d500: 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20 69  R_ARROW:.      i
d510: 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20  f( x[0]==':' && 
d520: 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32  x[1]==':' && x[2
d530: 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='=' ){.      
d540: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49    psp->state = I
d550: 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c  N_RHS;.      }el
d560: 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27  se if( x[0]=='('
d570: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
d580: 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49  >state = LHS_ALI
d590: 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_1;.      }els
d5a0: 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
d5b0: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
d5c0: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
d5d0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 45  no,.          "E
d5e0: 78 70 65 63 74 65 64 20 74 6f 20 73 65 65 20 61  xpected to see a
d5f0: 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \":\" following
d600: 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20   the LHS symbol 
d610: 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20  \"%s\".",.      
d620: 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61      psp->lhs->na
d630: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
d640: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
d650: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
d660: 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
d670: 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
d680: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
d690: 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c  .    case LHS_AL
d6a0: 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28  IAS_1:.      if(
d6b0: 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29   isalpha(x[0]) )
d6c0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c  {.        psp->l
d6d0: 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20  hsalias = x;.   
d6e0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
d6f0: 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20  = LHS_ALIAS_2;. 
d700: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d710: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
d720: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
d730: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
d740: 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69         "\"%s\" i
d750: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c  s not a valid al
d760: 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20  ias for the LHS 
d770: 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
d780: 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d       x,psp->lhs-
d790: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
d7a0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
d7b0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
d7c0: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
d7d0: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
d7e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
d7f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53  ak;.    case LHS
d800: 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20  _ALIAS_2:.      
d810: 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b  if( x[0]==')' ){
d820: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
d830: 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f  ate = LHS_ALIAS_
d840: 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  3;.      }else{.
d850: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
d860: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
d870: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
d880: 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
d890: 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77  ing \")\" follow
d8a0: 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61  ing LHS alias na
d8b0: 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d  me \"%s\".",psp-
d8c0: 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
d8d0: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
d8e0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
d8f0: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
d900: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
d910: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
d920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
d930: 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20   LHS_ALIAS_3:.  
d940: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a      if( x[0]==':
d950: 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26  ' && x[1]==':' &
d960: 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20  & x[2]=='=' ){. 
d970: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
d980: 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20  e = IN_RHS;.    
d990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d9a0: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
d9b0: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
d9c0: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
d9d0: 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d      "Missing \"-
d9e0: 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c  >\" following: \
d9f0: 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20  "%s(%s)\".",.   
da00: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
da10: 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61  ->name,psp->lhsa
da20: 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70  lias);.        p
da30: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
da40: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
da50: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
da60: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
da70: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
da80: 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f 52  k;.    case IN_R
da90: 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  HS:.      if( x[
daa0: 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20  0]=='.' ){.     
dab0: 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a     struct rule *
dac0: 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20 3d  rp;.        rp =
dad0: 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29   (struct rule *)
dae0: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
daf0: 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a 20  truct rule) + . 
db00: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
db10: 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
db20: 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73  *)*psp->nrhs + s
db30: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73 70  izeof(char*)*psp
db40: 2d 3e 6e 72 68 73 20 29 3b 0a 20 20 20 20 20 20  ->nrhs );.      
db50: 20 20 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a 20    if( rp==0 ){. 
db60: 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
db70: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
db80: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
db90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  ,.            "C
dba0: 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 65 6e  an't allocate en
dbb0: 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 20  ough memory for 
dbc0: 74 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  this rule.");.  
dbd0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
dbe0: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
dbf0: 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
dc00: 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20   = 0;..}else{.  
dc10: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
dc20: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 75 6c           rp->rul
dc30: 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b  eline = psp->tok
dc40: 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
dc50: 20 20 20 20 72 70 2d 3e 72 68 73 20 3d 20 28 73      rp->rhs = (s
dc60: 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26  truct symbol**)&
dc70: 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  rp[1];.         
dc80: 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20   rp->rhsalias = 
dc90: 28 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68  (char**)&(rp->rh
dca0: 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20  s[psp->nrhs]);. 
dcb0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
dcc0: 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69  ; i<psp->nrhs; i
dcd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
dce0: 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73   rp->rhs[i] = ps
dcf0: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
dd00: 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
dd10: 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c  ias[i] = psp->al
dd20: 69 61 73 5b 69 5d 3b 0a 09 20 20 7d 0a 20 20 20  ias[i];..  }.   
dd30: 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 20 3d         rp->lhs =
dd40: 20 70 73 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20   psp->lhs;.     
dd50: 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61       rp->lhsalia
dd60: 73 20 3d 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61  s = psp->lhsalia
dd70: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  s;.          rp-
dd80: 3e 6e 72 68 73 20 3d 20 70 73 70 2d 3e 6e 72 68  >nrhs = psp->nrh
dd90: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  s;.          rp-
dda0: 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20  >code = 0;.     
ddb0: 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d       rp->precsym
ddc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
ddd0: 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70 73 70 2d  rp->index = psp-
dde0: 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20  >gp->nrule++;.  
ddf0: 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74          rp->next
de00: 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72  lhs = rp->lhs->r
de10: 75 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ule;.          r
de20: 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20 3d 20 72  p->lhs->rule = r
de30: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  p;.          rp-
de40: 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  >next = 0;.     
de50: 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66 69       if( psp->fi
de60: 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20  rstrule==0 ){.  
de70: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66            psp->f
de80: 69 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e  irstrule = psp->
de90: 6c 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09  lastrule = rp;..
dea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
deb0: 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75       psp->lastru
dec0: 6c 65 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20  le->next = rp;. 
ded0: 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e             psp->
dee0: 6c 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09  lastrule = rp;..
def0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 73    }.          ps
df00: 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 72 70  p->prevrule = rp
df10: 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20 70 73 70  ;..}.        psp
df20: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
df30: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
df40: 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LE;.      }else 
df50: 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d  if( isalpha(x[0]
df60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
df70: 20 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52   psp->nrhs>=MAXR
df80: 48 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  HS ){.          
df90: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
dfa0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
dfb0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
dfc0: 20 20 20 20 20 22 54 6f 6f 20 6d 61 6e 79 20 73       "Too many s
dfd0: 79 6d 62 6f 6c 20 6f 6e 20 52 48 53 20 6f 72 20  ymbol on RHS or 
dfe0: 72 75 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20 61  rule beginning a
dff0: 74 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20  t \"%s\".",.    
e000: 20 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20          x);.    
e010: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
e020: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
e030: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
e040: 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
e050: 45 52 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20  ERROR;..}else{. 
e060: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
e070: 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53  s[psp->nrhs] = S
e080: 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
e090: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69          psp->ali
e0a0: 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20  as[psp->nrhs] = 
e0b0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  0;.          psp
e0c0: 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d 0a 20 20 20  ->nrhs++;..}.   
e0d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
e0e0: 5d 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e 6e  ]=='(' && psp->n
e0f0: 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rhs>0 ){.       
e100: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48   psp->state = RH
e110: 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20  S_ALIAS_1;.     
e120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e130: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
e140: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
e150: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
e160: 20 20 20 22 49 6c 6c 65 67 61 6c 20 63 68 61 72     "Illegal char
e170: 61 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66 20  acter on RHS of 
e180: 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c 78  rule: \"%s\".",x
e190: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
e1a0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
e1b0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
e1c0: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
e1d0: 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
e1e0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
e1f0: 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41     case RHS_ALIA
e200: 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 69  S_1:.      if( i
e210: 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a  salpha(x[0]) ){.
e220: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69          psp->ali
e230: 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20  as[psp->nrhs-1] 
e240: 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
e250: 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c  ->state = RHS_AL
e260: 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_2;.      }el
e270: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
e280: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
e290: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
e2a0: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
e2b0: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20  \"%s\" is not a 
e2c0: 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20  valid alias for 
e2d0: 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20 5c  the RHS symbol \
e2e0: 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20  "%s\"\n",.      
e2f0: 20 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b 70      x,psp->rhs[p
e300: 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d  sp->nrhs-1]->nam
e310: 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  e);.        psp-
e320: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
e330: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
e340: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
e350: 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
e360: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
e370: 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49      case RHS_ALI
e380: 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_2:.      if( 
e390: 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20  x[0]==')' ){.   
e3a0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
e3b0: 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20  = IN_RHS;.      
e3c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
e3d0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
e3e0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
e3f0: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
e400: 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22    "Missing \")\"
e410: 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61   following LHS a
e420: 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22  lias name \"%s\"
e430: 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73  .",psp->lhsalias
e440: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
e450: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
e460: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
e470: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
e480: 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
e490: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
e4a0: 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f     case WAITING_
e4b0: 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44  FOR_DECL_KEYWORD
e4c0: 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c  :.      if( isal
e4d0: 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
e4e0: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b 65       psp->declke
e4f0: 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20 20  yword = x;.     
e500: 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
e510: 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lot = 0;.       
e520: 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74   psp->decllnslot
e530: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
e540: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
e550: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
e560: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
e570: 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30  cmp(x,"name")==0
e580: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
e590: 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
e5a0: 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65   &(psp->gp->name
e5b0: 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  );..}else if( st
e5c0: 72 63 6d 70 28 78 2c 22 69 6e 63 6c 75 64 65 22  rcmp(x,"include"
e5d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e5e0: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
e5f0: 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
e600: 69 6e 63 6c 75 64 65 29 3b 0a 20 20 20 20 20 20  include);.      
e610: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73      psp->decllns
e620: 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
e630: 69 6e 63 6c 75 64 65 6c 6e 3b 0a 09 7d 65 6c 73  includeln;..}els
e640: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
e650: 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  code")==0 ){.   
e660: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
e670: 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
e680: 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b  >gp->extracode);
e690: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
e6a0: 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73  decllnslot = &ps
e6b0: 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65  p->gp->extracode
e6c0: 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  ln;..}else if( s
e6d0: 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 64  trcmp(x,"token_d
e6e0: 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29  estructor")==0 )
e6f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
e700: 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
e710: 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65  psp->gp->tokende
e720: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  st;.          ps
e730: 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
e740: 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64  &psp->gp->tokend
e750: 65 73 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66  estln;..}else if
e760: 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
e770: 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b  n_prefix")==0 ){
e780: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
e790: 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
e7a0: 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65  sp->gp->tokenpre
e7b0: 66 69 78 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  fix;..}else if( 
e7c0: 73 74 72 63 6d 70 28 78 2c 22 73 79 6e 74 61 78  strcmp(x,"syntax
e7d0: 5f 65 72 72 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  _error")==0 ){. 
e7e0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
e7f0: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
e800: 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 29 3b 0a 20  p->gp->error);. 
e810: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
e820: 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d  cllnslot = &psp-
e830: 3e 67 70 2d 3e 65 72 72 6f 72 6c 6e 3b 0a 09 7d  >gp->errorln;..}
e840: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
e850: 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74 22  x,"parse_accept"
e860: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e870: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
e880: 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
e890: 61 63 63 65 70 74 29 3b 0a 20 20 20 20 20 20 20  accept);.       
e8a0: 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
e8b0: 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 61  ot = &psp->gp->a
e8c0: 63 63 65 70 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20  cceptln;..}else 
e8d0: 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61  if( strcmp(x,"pa
e8e0: 72 73 65 5f 66 61 69 6c 75 72 65 22 29 3d 3d 30  rse_failure")==0
e8f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
e900: 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
e910: 20 26 28 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c   &(psp->gp->fail
e920: 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ure);.          
e930: 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
e940: 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c  = &psp->gp->fail
e950: 75 72 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66  ureln;..}else if
e960: 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63  ( strcmp(x,"stac
e970: 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20  k_overflow")==0 
e980: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
e990: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
e9a0: 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66  &(psp->gp->overf
e9b0: 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  low);.          
e9c0: 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
e9d0: 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72  = &psp->gp->over
e9e0: 66 6c 6f 77 6c 6e 3b 0a 20 20 20 20 20 20 20 20  flowln;.        
e9f0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
ea00: 28 78 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65  (x,"extra_argume
ea10: 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nt")==0 ){.     
ea20: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
ea30: 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
ea40: 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20  p->arg);.       
ea50: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
ea60: 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22  p(x,"token_type"
ea70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ea80: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
ea90: 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
eaa0: 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20  tokentype);.    
eab0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
eac0: 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73 69  rcmp(x,"stack_si
ead0: 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ze")==0 ){.     
eae0: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
eaf0: 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
eb00: 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20  p->stacksize);. 
eb10: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
eb20: 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72 74   strcmp(x,"start
eb30: 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a  _symbol")==0 ){.
eb40: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
eb50: 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
eb60: 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a  sp->gp->start);.
eb70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
eb80: 28 20 73 74 72 63 6d 70 28 78 2c 22 6c 65 66 74  ( strcmp(x,"left
eb90: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
eba0: 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
ebb0: 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ter++;.         
ebc0: 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20   psp->declassoc 
ebd0: 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20 20 20 20  = LEFT;.        
ebe0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
ebf0: 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45  AITING_FOR_PRECE
ec00: 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20  DENCE_SYMBOL;.  
ec10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ec20: 73 74 72 63 6d 70 28 78 2c 22 72 69 67 68 74 22  strcmp(x,"right"
ec30: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ec40: 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74    psp->preccount
ec50: 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  er++;.          
ec60: 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d  psp->declassoc =
ec70: 20 52 49 47 48 54 3b 0a 20 20 20 20 20 20 20 20   RIGHT;.        
ec80: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
ec90: 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45  AITING_FOR_PRECE
eca0: 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20  DENCE_SYMBOL;.  
ecb0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ecc0: 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e 61 73 73  strcmp(x,"nonass
ecd0: 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  oc")==0 ){.     
ece0: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
ecf0: 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20  unter++;.       
ed00: 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f     psp->declasso
ed10: 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  c = NONE;.      
ed20: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
ed30: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
ed40: 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a  CEDENCE_SYMBOL;.
ed50: 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
ed60: 70 28 78 2c 22 64 65 73 74 72 75 63 74 6f 72 22  p(x,"destructor"
ed70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
ed80: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
ed90: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
eda0: 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 09 7d  UCTOR_SYMBOL;..}
edb0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
edc0: 78 2c 22 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a  x,"type")==0 ){.
edd0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
ede0: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
edf0: 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42  OR_DATATYPE_SYMB
ee00: 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OL;.        }els
ee10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  e{.          Err
ee20: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
ee30: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
ee40: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
ee50: 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61    "Unknown decla
ee60: 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
ee70: 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  \"%%%s\".",x);. 
ee80: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
ee90: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
eea0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
eeb0: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
eec0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
eed0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
eee0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
eef0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
ef00: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
ef10: 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 64 65       "Illegal de
ef20: 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72  claration keywor
ef30: 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  d: \"%s\".",x);.
ef40: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
ef50: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
ef60: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
ef70: 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
ef80: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
ef90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
efa0: 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
efb0: 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42  _DESTRUCTOR_SYMB
efc0: 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69  OL:.      if( !i
efd0: 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a  salpha(x[0]) ){.
efe0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
eff0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f000: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f010: 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
f020: 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20  ol name missing 
f030: 61 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f  after %destructo
f040: 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20  r keyword");.   
f050: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f060: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
f070: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
f080: 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
f090: 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
f0a0: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
f0b0: 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
f0c0: 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
f0d0: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
f0e0: 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74  slot = &sp->dest
f0f0: 72 75 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20  ructor;.        
f100: 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
f110: 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  = &sp->destructo
f120: 72 6c 6e 3b 0a 20 20 20 20 20 20 20 20 70 73 70  rln;.        psp
f130: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
f140: 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a  G_FOR_DECL_ARG;.
f150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f160: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
f170: 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59  ITING_FOR_DATATY
f180: 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  PE_SYMBOL:.     
f190: 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 78 5b   if( !isalpha(x[
f1a0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
f1b0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f1c0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f1d0: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
f1e0: 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d    "Symbol name m
f1f0: 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 64 65  issing after %de
f200: 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72 64  structor keyword
f210: 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
f220: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f230: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f240: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
f250: 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
f260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f270: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
f280: 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  p = Symbol_new(x
f290: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f2a0: 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73  declargslot = &s
f2b0: 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20  p->datatype;.   
f2c0: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
f2d0: 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  slot = 0;.      
f2e0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
f2f0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
f300: 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ARG;.      }.   
f310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
f320: 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50  se WAITING_FOR_P
f330: 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
f340: 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
f350: 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
f360: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
f370: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
f380: 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
f390: 6c 73 65 20 69 66 28 20 69 73 75 70 70 65 72 28  lse if( isupper(
f3a0: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
f3b0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
f3c0: 73 70 3b 0a 20 20 20 20 20 20 20 20 73 70 20 3d  sp;.        sp =
f3d0: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
f3e0: 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
f3f0: 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  prec>=0 ){.     
f400: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f410: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f420: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f430: 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
f440: 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 61 6c 72  l \"%s\" has alr
f450: 65 61 64 79 20 62 65 20 67 69 76 65 6e 20 61 20  eady be given a 
f460: 70 72 65 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b  precedence.",x);
f470: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
f480: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c  errorcnt++;..}el
f490: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70  se{.          sp
f4a0: 2d 3e 70 72 65 63 20 3d 20 70 73 70 2d 3e 70 72  ->prec = psp->pr
f4b0: 65 63 63 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20  eccounter;.     
f4c0: 20 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d       sp->assoc =
f4d0: 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b   psp->declassoc;
f4e0: 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ..}.      }else{
f4f0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f500: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f510: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f520: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 61 6e  ,.          "Can
f530: 27 74 20 61 73 73 69 67 6e 20 61 20 70 72 65 63  't assign a prec
f540: 65 64 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22  edence to \"%s\"
f550: 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
f560: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f580: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
f590: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
f5a0: 52 47 3a 0a 20 20 20 20 20 20 69 66 28 20 28 78  RG:.      if( (x
f5b0: 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d  [0]=='{' || x[0]
f5c0: 3d 3d 27 5c 22 27 20 7c 7c 20 69 73 61 6c 6e 75  =='\"' || isalnu
f5d0: 6d 28 78 5b 30 5d 29 29 20 29 7b 0a 20 20 20 20  m(x[0])) ){.    
f5e0: 20 20 20 20 69 66 28 20 2a 28 70 73 70 2d 3e 64      if( *(psp->d
f5f0: 65 63 6c 61 72 67 73 6c 6f 74 29 21 3d 30 20 29  eclargslot)!=0 )
f600: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
f610: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f620: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f630: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
f640: 20 22 54 68 65 20 61 72 67 75 6d 65 6e 74 20 5c   "The argument \
f650: 22 25 73 5c 22 20 74 6f 20 64 65 63 6c 61 72 61  "%s\" to declara
f660: 74 69 6f 6e 20 5c 22 25 25 25 73 5c 22 20 69 73  tion \"%%%s\" is
f670: 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74 2e 22   not the first."
f680: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 5b  ,.            x[
f690: 30 5d 3d 3d 27 5c 22 27 20 3f 20 26 78 5b 31 5d  0]=='\"' ? &x[1]
f6a0: 20 3a 20 78 2c 70 73 70 2d 3e 64 65 63 6c 6b 65   : x,psp->declke
f6b0: 79 77 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  yword);.        
f6c0: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f6d0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
f6e0: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
f6f0: 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
f700: 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20  R;..}else{.     
f710: 20 20 20 20 20 2a 28 70 73 70 2d 3e 64 65 63 6c       *(psp->decl
f720: 61 72 67 73 6c 6f 74 29 20 3d 20 28 78 5b 30 5d  argslot) = (x[0]
f730: 3d 3d 27 5c 22 27 20 7c 7c 20 78 5b 30 5d 3d 3d  =='\"' || x[0]==
f740: 27 7b 27 29 20 3f 20 26 78 5b 31 5d 20 3a 20 78  '{') ? &x[1] : x
f750: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
f760: 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
f770: 29 20 2a 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c  ) *psp->decllnsl
f780: 6f 74 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ot = psp->tokenl
f790: 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  ineno;.         
f7a0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
f7b0: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
f7c0: 52 5f 52 55 4c 45 3b 0a 09 7d 0a 20 20 20 20 20  R_RULE;..}.     
f7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f7e0: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f7f0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f800: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
f810: 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72 67 75     "Illegal argu
f820: 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20 25 73  ment to %%%s: %s
f830: 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f  ",psp->declkeywo
f840: 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  rd,x);.        p
f850: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f860: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f870: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
f880: 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
f890: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
f8a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 59  k;.    case RESY
f8b0: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
f8c0: 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28  ROR:./*      if(
f8d0: 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70   x[0]=='.' ) psp
f8e0: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
f8f0: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
f900: 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65 61  LE;.**      brea
f910: 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 52  k; */.    case R
f920: 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
f930: 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69 66  _ERROR:.      if
f940: 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73  ( x[0]=='.' ) ps
f950: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
f960: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
f970: 55 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 78  ULE;.      if( x
f980: 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e  [0]=='%' ) psp->
f990: 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
f9a0: 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44  FOR_DECL_KEYWORD
f9b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f9c0: 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69 74   }.}../* In spit
f9d0: 65 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c 20 74  e of its name, t
f9e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
f9f0: 72 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e 65 72  really a scanner
fa00: 2e 20 20 49 74 20 72 65 61 64 0a 2a 2a 20 69 6e  .  It read.** in
fa10: 20 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75   the entire inpu
fa20: 74 20 66 69 6c 65 20 28 61 6c 6c 20 61 74 20 6f  t file (all at o
fa30: 6e 63 65 29 20 74 68 65 6e 20 74 6f 6b 65 6e 69  nce) then tokeni
fa40: 7a 65 73 20 69 74 2e 20 20 45 61 63 68 0a 2a 2a  zes it.  Each.**
fa50: 20 74 6f 6b 65 6e 20 69 73 20 70 61 73 73 65 64   token is passed
fa60: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
fa70: 20 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 22   "parseonetoken"
fa80: 20 77 68 69 63 68 20 62 75 69 6c 64 73 20 61 6c   which builds al
fa90: 6c 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72  l.** the appropr
faa0: 69 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74  iate data struct
fab0: 75 72 65 73 20 69 6e 20 74 68 65 20 67 6c 6f 62  ures in the glob
fac0: 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20  al state vector 
fad0: 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61  "gp"..*/.void Pa
fae0: 72 73 65 28 67 70 29 0a 73 74 72 75 63 74 20 6c  rse(gp).struct l
faf0: 65 6d 6f 6e 20 2a 67 70 3b 0a 7b 0a 20 20 73 74  emon *gp;.{.  st
fb00: 72 75 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a  ruct pstate ps;.
fb10: 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68    FILE *fp;.  ch
fb20: 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 69  ar *filebuf;.  i
fb30: 6e 74 20 66 69 6c 65 73 69 7a 65 3b 0a 20 20 69  nt filesize;.  i
fb40: 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74  nt lineno;.  int
fb50: 20 63 3b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20   c;.  char *cp, 
fb60: 2a 6e 65 78 74 63 70 3b 0a 20 20 69 6e 74 20 73  *nextcp;.  int s
fb70: 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20  tartline = 0;.. 
fb80: 20 70 73 2e 67 70 20 3d 20 67 70 3b 0a 20 20 70   ps.gp = gp;.  p
fb90: 73 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 67 70 2d  s.filename = gp-
fba0: 3e 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 73 2e  >filename;.  ps.
fbb0: 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20  errorcnt = 0;.  
fbc0: 70 73 2e 73 74 61 74 65 20 3d 20 49 4e 49 54 49  ps.state = INITI
fbd0: 41 4c 49 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65 67  ALIZE;..  /* Beg
fbe0: 69 6e 20 62 79 20 72 65 61 64 69 6e 67 20 74 68  in by reading th
fbf0: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
fc00: 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 70 73 2e    fp = fopen(ps.
fc10: 66 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a  filename,"rb");.
fc20: 20 20 69 66 28 20 66 70 3d 3d 30 20 29 7b 0a 20    if( fp==0 ){. 
fc30: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66     ErrorMsg(ps.f
fc40: 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74  ilename,0,"Can't
fc50: 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20   open this file 
fc60: 66 6f 72 20 72 65 61 64 69 6e 67 2e 22 29 3b 0a  for reading.");.
fc70: 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74      gp->errorcnt
fc80: 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
fc90: 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 70 2c 30    }.  fseek(fp,0
fca0: 2c 32 29 3b 0a 20 20 66 69 6c 65 73 69 7a 65 20  ,2);.  filesize 
fcb0: 3d 20 66 74 65 6c 6c 28 66 70 29 3b 0a 20 20 72  = ftell(fp);.  r
fcc0: 65 77 69 6e 64 28 66 70 29 3b 0a 20 20 66 69 6c  ewind(fp);.  fil
fcd0: 65 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29 6d  ebuf = (char *)m
fce0: 61 6c 6c 6f 63 28 20 66 69 6c 65 73 69 7a 65 2b  alloc( filesize+
fcf0: 31 20 29 3b 0a 20 20 69 66 28 20 66 69 6c 65 62  1 );.  if( fileb
fd00: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72  uf==0 ){.    Err
fd10: 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
fd20: 65 2c 30 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63  e,0,"Can't alloc
fd30: 61 74 65 20 25 64 20 6f 66 20 6d 65 6d 6f 72 79  ate %d of memory
fd40: 20 74 6f 20 68 6f 6c 64 20 74 68 69 73 20 66 69   to hold this fi
fd50: 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c 65  le.",.      file
fd60: 73 69 7a 65 2b 31 29 3b 0a 20 20 20 20 67 70 2d  size+1);.    gp-
fd70: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
fd80: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
fd90: 66 28 20 66 72 65 61 64 28 66 69 6c 65 62 75 66  f( fread(filebuf
fda0: 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66 70 29 21  ,1,filesize,fp)!
fdb0: 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a 20 20 20  =filesize ){.   
fdc0: 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
fdd0: 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 72  ename,0,"Can't r
fde0: 65 61 64 20 69 6e 20 61 6c 6c 20 25 64 20 62 79  ead in all %d by
fdf0: 74 65 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65  tes of this file
fe00: 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69  .",.      filesi
fe10: 7a 65 29 3b 0a 20 20 20 20 66 72 65 65 28 66 69  ze);.    free(fi
fe20: 6c 65 62 75 66 29 3b 0a 20 20 20 20 67 70 2d 3e  lebuf);.    gp->
fe30: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
fe40: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 63  return;.  }.  fc
fe50: 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66 69 6c 65  lose(fp);.  file
fe60: 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d 20 3d 20  buf[filesize] = 
fe70: 30 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61  0;..  /* Now sca
fe80: 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  n the text of th
fe90: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
fea0: 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20    lineno = 1;.  
feb0: 66 6f 72 28 63 70 3d 66 69 6c 65 62 75 66 3b 20  for(cp=filebuf; 
fec0: 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a  (c= *cp)!=0; ){.
fed0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
fee0: 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20  ) lineno++;     
fef0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 65 70           /* Keep
ff00: 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69   track of the li
ff10: 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  ne number */.   
ff20: 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20   if( isspace(c) 
ff30: 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75  ){ cp++; continu
ff40: 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c  e; }  /* Skip al
ff50: 6c 20 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f  l white space */
ff60: 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20  .    if( c=='/' 
ff70: 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b  && cp[1]=='/' ){
ff80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69            /* Ski
ff90: 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d  p C++ style comm
ffa0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  ents */.      cp
ffb0: 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  +=2;.      while
ffc0: 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
ffd0: 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b   c!='\n' ) cp++;
ffe0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
fff0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
10000 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
10010 27 2a 27 20 29 7b 20 20 20 20 20 20 20 20 20 20  '*' ){          
10020 2f 2a 20 53 6b 69 70 20 43 20 73 74 79 6c 65 20  /* Skip C style 
10030 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  comments */.    
10040 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77    cp+=2;.      w
10050 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
10060 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20  0 && (c!='/' || 
10070 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a  cp[-1]!='*') ){.
10080 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
10090 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
100a0 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20          cp++;.  
100b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
100c0 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20  c ) cp++;.      
100d0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
100e0 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72      ps.tokenstar
100f0 74 20 3d 20 63 70 3b 20 20 20 20 20 20 20 20 20  t = cp;         
10100 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74         /* Mark t
10110 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
10120 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20  the token */.   
10130 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20   ps.tokenlineno 
10140 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20  = lineno;       
10150 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65      /* Linenumbe
10160 72 20 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e  r on which token
10170 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69   begins */.    i
10180 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20  f( c=='\"' ){   
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74 65    /* String lite
101b0 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  rals */.      cp
101c0 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
101d0 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
101e0 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20  c!='\"' ){.     
101f0 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
10200 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
10210 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d     cp++;.      }
10220 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
10230 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
10240 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
10250 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69  startline,."Stri
10260 6e 67 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74  ng starting on t
10270 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
10280 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72  terminated befor
10290 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  e the end of the
102a0 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   file.");.      
102b0 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b    ps.errorcnt++;
102c0 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20  .        nextcp 
102d0 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = cp;.      }els
102e0 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63  e{.        nextc
102f0 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20  p = cp+1;.      
10300 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
10310 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20 20 20 20  c=='{' ){       
10320 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f          /* A blo
10330 63 6b 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a  ck of C code */.
10340 20 20 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b        int level;
10350 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20  .      cp++;.   
10360 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20     for(level=1; 
10370 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
10380 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d  level>1 || c!='}
10390 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20  '); cp++){.     
103a0 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
103b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
103c0 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
103d0 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20  {' ) level++;.  
103e0 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
103f0 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b  =='}' ) level--;
10400 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
10410 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
10420 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b  ]=='*' ){  /* Sk
10430 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20  ip comments */. 
10440 20 20 20 20 20 20 20 20 20 69 6e 74 20 70 72 65           int pre
10450 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20 63 70  vc;.          cp
10460 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20   = &cp[2];.     
10470 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a       prevc = 0;.
10480 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
10490 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
104a0 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63  (c!='/' || prevc
104b0 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20  !='*') ){.      
104c0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
104d0 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
104e0 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20            prevc 
104f0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = c;.           
10500 20 63 70 2b 2b 3b 0a 09 20 20 7d 0a 09 7d 65 6c   cp++;..  }..}el
10510 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26  se if( c=='/' &&
10520 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20   cp[1]=='/' ){  
10530 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c  /* Skip C++ styl
10540 65 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a  e comments too *
10550 2f 0a 20 20 20 20 20 20 20 20 20 20 63 70 20 3d  /.          cp =
10560 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20   &cp[2];.       
10570 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
10580 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27  p)!=0 && c!='\n'
10590 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20   ) cp++;.       
105a0 20 20 20 69 66 28 20 63 20 29 20 6c 69 6e 65 6e     if( c ) linen
105b0 6f 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  o++;..}else if( 
105c0 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 5c  c=='\'' || c=='\
105d0 22 27 20 29 7b 20 20 20 20 2f 2a 20 53 74 72 69  "' ){    /* Stri
105e0 6e 67 20 61 20 63 68 61 72 61 63 74 65 72 20 6c  ng a character l
105f0 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20  iterals */.     
10600 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 63 68       int startch
10610 61 72 2c 20 70 72 65 76 63 3b 0a 20 20 20 20 20  ar, prevc;.     
10620 20 20 20 20 20 73 74 61 72 74 63 68 61 72 20 3d       startchar =
10630 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72   c;.          pr
10640 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  evc = 0;.       
10650 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63 3d     for(cp++; (c=
10660 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d   *cp)!=0 && (c!=
10670 73 74 61 72 74 63 68 61 72 20 7c 7c 20 70 72 65  startchar || pre
10680 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b 29  vc=='\\'); cp++)
10690 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
106a0 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
106b0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  no++;.          
106c0 20 20 69 66 28 20 70 72 65 76 63 3d 3d 27 5c 5c    if( prevc=='\\
106d0 27 20 29 20 70 72 65 76 63 20 3d 20 30 3b 0a 20  ' ) prevc = 0;. 
106e0 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20             else 
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
10700 76 63 20 3d 20 63 3b 0a 09 20 20 7d 0a 09 7d 0a  vc = c;..  }..}.
10710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10720 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
10730 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
10740 6c 65 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65  lename,startline
10750 2c 0a 22 43 20 63 6f 64 65 20 73 74 61 72 74 69  ,."C code starti
10760 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  ng on this line 
10770 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  is not terminate
10780 64 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64  d before the end
10790 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b   of the file.");
107a0 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f  .        ps.erro
107b0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
107c0 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
107d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
107e0 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b    nextcp = cp+1;
107f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
10800 73 65 20 69 66 28 20 69 73 61 6c 6e 75 6d 28 63  se if( isalnum(c
10810 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a  ) ){          /*
10820 20 49 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a   Identifiers */.
10830 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
10840 20 2a 63 70 29 21 3d 30 20 26 26 20 28 69 73 61   *cp)!=0 && (isa
10850 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f  lnum(c) || c=='_
10860 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20  ') ) cp++;.     
10870 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
10880 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
10890 3a 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 3a 27  :' && cp[1]==':'
108a0 20 26 26 20 63 70 5b 32 5d 3d 3d 27 3d 27 20 29   && cp[2]=='=' )
108b0 7b 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  { /* The operato
108c0 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20 20 20  r "::=" */.     
108d0 20 63 70 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20   cp += 3;.      
108e0 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
108f0 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
10900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10910 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f   /* All other (o
10920 6e 65 20 63 68 61 72 61 63 74 65 72 29 20 6f 70  ne character) op
10930 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20  erators */.     
10940 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78   cp++;.      nex
10950 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a  tcp = cp;.    }.
10960 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20      c = *cp;.   
10970 20 2a 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20   *cp = 0;       
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 20 2f 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61   /* Null termina
109a0 74 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  te the token */.
109b0 20 20 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65      parseonetoke
109c0 6e 28 26 70 73 29 3b 20 20 20 20 20 20 20 20 20  n(&ps);         
109d0 20 20 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65      /* Parse the
109e0 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63   token */.    *c
109f0 70 20 3d 20 63 3b 20 20 20 20 20 20 20 20 20 20  p = c;          
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a10 20 52 65 73 74 6f 72 65 20 74 68 65 20 62 75 66   Restore the buf
10a20 66 65 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20  fer */.    cp = 
10a30 6e 65 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72  nextcp;.  }.  fr
10a40 65 65 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20  ee(filebuf);    
10a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a60 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 62  /* Release the b
10a70 75 66 66 65 72 20 61 66 74 65 72 20 70 61 72 73  uffer after pars
10a80 69 6e 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c  ing */.  gp->rul
10a90 65 20 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65  e = ps.firstrule
10aa0 3b 0a 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74  ;.  gp->errorcnt
10ab0 20 3d 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a   = ps.errorcnt;.
10ac0 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
10ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
10ae0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c  rom the file "pl
10af0 69 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ink.c" *********
10b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
10b10 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f  .** Routines pro
10b20 63 65 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72  cessing configur
10b30 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74  ation follow-set
10b40 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
10b50 6b 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d  ks.** in the LEM
10b60 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
10b70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  tor..*/.static s
10b80 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69  truct plink *pli
10b90 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b  nk_freelist = 0;
10ba0 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
10bb0 6e 65 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72  new plink */.str
10bc0 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b  uct plink *Plink
10bd0 5f 6e 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74  _new(){.  struct
10be0 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20   plink *new;..  
10bf0 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  if( plink_freeli
10c00 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
10c10 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
10c20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b  = 100;.    plink
10c30 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72  _freelist = (str
10c40 75 63 74 20 70 6c 69 6e 6b 20 2a 29 6d 61 6c 6c  uct plink *)mall
10c50 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
10c60 74 20 70 6c 69 6e 6b 29 2a 61 6d 74 20 29 3b 0a  t plink)*amt );.
10c70 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72      if( plink_fr
10c80 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
10c90 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
10ca0 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65  r,.      "Unable
10cb0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
10cc0 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f  ory for a new fo
10cd0 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
10ce0 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a  tion link.\n");.
10cf0 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
10d00 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
10d10 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
10d20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69  plink_freelist[i
10d30 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f  ].next = &plink_
10d40 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
10d50 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73     plink_freelis
10d60 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20  t[amt-1].next = 
10d70 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70  0;.  }.  new = p
10d80 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20  link_freelist;. 
10d90 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20   plink_freelist 
10da0 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  = plink_freelist
10db0 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  ->next;.  return
10dc0 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20   new;.}../* Add 
10dd0 61 20 70 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69  a plink to a pli
10de0 6e 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  nk list */.void 
10df0 50 6c 69 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63  Plink_add(plpp,c
10e00 66 70 29 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b  fp).struct plink
10e10 20 2a 2a 70 6c 70 70 3b 0a 73 74 72 75 63 74 20   **plpp;.struct 
10e20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20  config *cfp;.{. 
10e30 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
10e40 65 77 3b 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e  ew;.  new = Plin
10e50 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e  k_new();.  new->
10e60 6e 65 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20  next = *plpp;.  
10e70 2a 70 6c 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e  *plpp = new;.  n
10e80 65 77 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d  ew->cfp = cfp;.}
10e90 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65 76  ../* Transfer ev
10ea0 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65  ery plink on the
10eb0 20 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f 20   list "from" to 
10ec0 74 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f  the list "to" */
10ed0 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79  .void Plink_copy
10ee0 28 74 6f 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74  (to,from).struct
10ef0 20 70 6c 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72   plink **to;.str
10f00 75 63 74 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b  uct plink *from;
10f10 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  .{.  struct plin
10f20 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69  k *nextpl;.  whi
10f30 6c 65 28 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20  le( from ){.    
10f40 6e 65 78 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e  nextpl = from->n
10f50 65 78 74 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e  ext;.    from->n
10f60 65 78 74 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a  ext = *to;.    *
10f70 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66  to = from;.    f
10f80 72 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20  rom = nextpl;.  
10f90 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65  }.}../* Delete e
10fa0 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68  very plink on th
10fb0 65 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50  e list */.void P
10fc0 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29  link_delete(plp)
10fd0 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70  .struct plink *p
10fe0 6c 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70  lp;.{.  struct p
10ff0 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20  link *nextpl;.. 
11000 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20   while( plp ){. 
11010 20 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d     nextpl = plp-
11020 3e 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e  >next;.    plp->
11030 6e 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65  next = plink_fre
11040 65 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b  elist;.    plink
11050 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b  _freelist = plp;
11060 0a 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74 70  .    plp = nextp
11070 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  l;.  }.}./******
11080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11090 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
110a0 22 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a  "report.c" *****
110b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110c0 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f  *****/./*.** Pro
110d0 63 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e 65  cedures for gene
110e0 72 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20 61  rating reports a
110f0 6e 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  nd tables in the
11100 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
11110 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20  nerator..*/../* 
11120 47 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65 6e  Generate a filen
11130 61 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76  ame with the giv
11140 65 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61 63  en suffix.  Spac
11150 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  e to hold the.**
11160 20 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d   name comes from
11170 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75   malloc() and mu
11180 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
11190 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
111a0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41  nction..*/.PRIVA
111b0 54 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61  TE char *file_ma
111c0 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66  kename(lemp,suff
111d0 69 78 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ix).struct lemon
111e0 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75   *lemp;.char *su
111f0 66 66 69 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a  ffix;.{.  char *
11200 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70  name;.  char *cp
11210 3b 0a 0a 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c  ;..  name = mall
11220 6f 63 28 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d  oc( strlen(lemp-
11230 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20 73 74 72  >filename) + str
11240 6c 65 6e 28 73 75 66 66 69 78 29 20 2b 20 35 20  len(suffix) + 5 
11250 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30  );.  if( name==0
11260 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
11270 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c  stderr,"Can't al
11280 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
11290 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29   a filename.\n")
112a0 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
112b0 20 7d 0a 20 20 73 74 72 63 70 79 28 6e 61 6d 65   }.  strcpy(name
112c0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
112d0 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72  ;.  cp = strrchr
112e0 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66  (name,'.');.  if
112f0 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30 3b 0a  ( cp ) *cp = 0;.
11300 20 20 73 74 72 63 61 74 28 6e 61 6d 65 2c 73 75    strcat(name,su
11310 66 66 69 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  ffix);.  return 
11320 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e  name;.}../* Open
11330 20 61 20 66 69 6c 65 20 77 69 74 68 20 61 20 6e   a file with a n
11340 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ame based on the
11350 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70   name of the inp
11360 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20  ut file,.** but 
11370 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
11380 20 28 73 70 65 63 69 66 69 65 64 29 20 73 75 66   (specified) suf
11390 66 69 78 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  fix, and return 
113a0 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
113b0 74 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52  the stream */.PR
113c0 49 56 41 54 45 20 46 49 4c 45 20 2a 66 69 6c 65  IVATE FILE *file
113d0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 73 75 66 66 69  _open(lemp,suffi
113e0 78 2c 6d 6f 64 65 29 0a 73 74 72 75 63 74 20 6c  x,mode).struct l
113f0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72  emon *lemp;.char
11400 20 2a 73 75 66 66 69 78 3b 0a 63 68 61 72 20 2a   *suffix;.char *
11410 6d 6f 64 65 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a  mode;.{.  FILE *
11420 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d  fp;..  if( lemp-
11430 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72 65 65 28  >outname ) free(
11440 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a  lemp->outname);.
11450 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20    lemp->outname 
11460 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28  = file_makename(
11470 6c 65 6d 70 2c 20 73 75 66 66 69 78 29 3b 0a 20  lemp, suffix);. 
11480 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c 65 6d 70   fp = fopen(lemp
11490 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b  ->outname,mode);
114a0 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 26 26 20  .  if( fp==0 && 
114b0 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b 0a 20 20  *mode=='w' ){.  
114c0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
114d0 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 66 69 6c  ,"Can't open fil
114e0 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d  e \"%s\".\n",lem
114f0 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20  p->outname);.   
11500 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
11510 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  +;.    return 0;
11520 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 70  .  }.  return fp
11530 3b 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74  ;.}../* Duplicat
11540 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  e the input file
11550 20 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74   without comment
11560 73 20 61 6e 64 20 77 69 74 68 6f 75 74 20 61 63  s and without ac
11570 74 69 6f 6e 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c  tions .** on rul
11580 65 73 20 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69  es */.void Repri
11590 6e 74 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  nt(lemp).struct 
115a0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
115b0 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
115c0 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
115d0 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20  l *sp;.  int i, 
115e0 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20  j, maxlen, len, 
115f0 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a  ncolumns, skip;.
11600 20 20 70 72 69 6e 74 66 28 22 2f 2f 20 52 65 70    printf("// Rep
11610 72 69 6e 74 20 6f 66 20 69 6e 70 75 74 20 66 69  rint of input fi
11620 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53  le \"%s\".\n// S
11630 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d  ymbols:\n",lemp-
11640 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61  >filename);.  ma
11650 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72  xlen = 10;.  for
11660 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
11670 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
11680 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
11690 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20  ols[i];.    len 
116a0 3d 20 73 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d  = strlen(sp->nam
116b0 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  e);.    if( len>
116c0 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20  maxlen ) maxlen 
116d0 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f  = len;.  }.  nco
116e0 6c 75 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c  lumns = 76/(maxl
116f0 65 6e 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f  en+5);.  if( nco
11700 6c 75 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d  lumns<1 ) ncolum
11710 6e 73 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d  ns = 1;.  skip =
11720 20 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20   (lemp->nsymbol 
11730 2b 20 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f  + ncolumns - 1)/
11740 6e 63 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28  ncolumns;.  for(
11750 69 3d 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b  i=0; i<skip; i++
11760 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2f  ){.    printf("/
11770 2f 22 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  /");.    for(j=i
11780 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; j<lemp->nsymbo
11790 6c 3b 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20  l; j+=skip){.   
117a0 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79     sp = lemp->sy
117b0 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20  mbols[j];.      
117c0 61 73 73 65 72 74 28 20 73 70 2d 3e 69 6e 64 65  assert( sp->inde
117d0 78 3d 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70 72  x==j );.      pr
117e0 69 6e 74 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a  intf(" %3d %-*.*
117f0 73 22 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c  s",j,maxlen,maxl
11800 65 6e 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  en,sp->name);.  
11810 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22    }.    printf("
11820 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  \n");.  }.  for(
11830 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
11840 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
11850 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 22  .    printf("%s"
11860 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  ,rp->lhs->name);
11870 0a 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  ./*    if( rp->l
11880 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e 74 66  hsalias ) printf
11890 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61  ("(%s)",rp->lhsa
118a0 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72  lias); */.    pr
118b0 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20  intf(" ::=");.  
118c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
118d0 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
118e0 20 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c     printf(" %s",
118f0 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65  rp->rhs[i]->name
11900 29 3b 0a 2f 2a 20 20 20 20 20 20 69 66 28 20 72  );./*      if( r
11910 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29  p->rhsalias[i] )
11920 20 70 72 69 6e 74 66 28 22 28 25 73 29 22 2c 72   printf("(%s)",r
11930 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b  p->rhsalias[i]);
11940 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 72   */.    }.    pr
11950 69 6e 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69  intf(".");.    i
11960 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29  f( rp->precsym )
11970 20 70 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c   printf(" [%s]",
11980 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d  rp->precsym->nam
11990 65 29 3b 0a 2f 2a 20 20 20 20 69 66 28 20 72 70  e);./*    if( rp
119a0 2d 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28  ->code ) printf(
119b0 22 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63  "\n    %s",rp->c
119c0 6f 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69  ode); */.    pri
119d0 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d  ntf("\n");.  }.}
119e0 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69  ..void ConfigPri
119f0 6e 74 28 66 70 2c 63 66 70 29 0a 46 49 4c 45 20  nt(fp,cfp).FILE 
11a00 2a 66 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  *fp;.struct conf
11a10 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72  ig *cfp;.{.  str
11a20 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
11a30 69 6e 74 20 69 3b 0a 20 20 72 70 20 3d 20 63 66  int i;.  rp = cf
11a40 70 2d 3e 72 70 3b 0a 20 20 66 70 72 69 6e 74 66  p->rp;.  fprintf
11a50 28 66 70 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d  (fp,"%s ::=",rp-
11a60 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66  >lhs->name);.  f
11a70 6f 72 28 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e  or(i=0; i<=rp->n
11a80 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  rhs; i++){.    i
11a90 66 28 20 69 3d 3d 63 66 70 2d 3e 64 6f 74 20 29  f( i==cfp->dot )
11aa0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 2a 22   fprintf(fp," *"
11ab0 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 72 70  );.    if( i==rp
11ac0 2d 3e 6e 72 68 73 20 29 20 62 72 65 61 6b 3b 0a  ->nrhs ) break;.
11ad0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
11ae0 20 25 73 22 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d   %s",rp->rhs[i]-
11af0 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >name);.  }.}../
11b00 2a 20 23 64 65 66 69 6e 65 20 54 45 53 54 20 2a  * #define TEST *
11b10 2f 0a 23 69 66 64 65 66 20 54 45 53 54 0a 2f 2a  /.#ifdef TEST./*
11b20 20 50 72 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a   Print a set */.
11b30 50 52 49 56 41 54 45 20 76 6f 69 64 20 53 65 74  PRIVATE void Set
11b40 50 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65  Print(out,set,le
11b50 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63  mp).FILE *out;.c
11b60 68 61 72 20 2a 73 65 74 3b 0a 73 74 72 75 63 74  har *set;.struct
11b70 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
11b80 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
11b90 2a 73 70 61 63 65 72 3b 0a 20 20 73 70 61 63 65  *spacer;.  space
11ba0 72 20 3d 20 22 22 3b 0a 20 20 66 70 72 69 6e 74  r = "";.  fprint
11bb0 66 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c 22 22  f(out,"%12s[",""
11bc0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
11bd0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
11be0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
11bf0 65 74 46 69 6e 64 28 73 65 74 2c 69 29 20 29 7b  etFind(set,i) ){
11c00 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
11c10 75 74 2c 22 25 73 25 73 22 2c 73 70 61 63 65 72  ut,"%s%s",spacer
11c20 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
11c30 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
11c40 73 70 61 63 65 72 20 3d 20 22 20 22 3b 0a 20 20  spacer = " ";.  
11c50 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
11c60 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a  f(out,"]\n");.}.
11c70 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c 69 6e  ./* Print a plin
11c80 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41  k chain */.PRIVA
11c90 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69  TE void PlinkPri
11ca0 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a  nt(out,plp,tag).
11cb0 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63  FILE *out;.struc
11cc0 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68  t plink *plp;.ch
11cd0 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69  ar *tag;.{.  whi
11ce0 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 66  le( plp ){.    f
11cf0 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73  printf(out,"%12s
11d00 25 73 20 28 73 74 61 74 65 20 25 32 64 29 20 22  %s (state %2d) "
11d10 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70  ,"",tag,plp->cfp
11d20 2d 3e 73 74 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  ->stp->index);. 
11d30 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f     ConfigPrint(o
11d40 75 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20  ut,plp->cfp);.  
11d50 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
11d60 6e 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70  n");.    plp = p
11d70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a  lp->next;.  }.}.
11d80 23 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74  #endif../* Print
11d90 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 74 68   an action to th
11da0 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
11db0 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
11dc0 20 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74   FALSE if.** not
11dd0 68 69 6e 67 20 77 61 73 20 61 63 74 75 61 6c 6c  hing was actuall
11de0 79 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e  y printed..*/.in
11df0 74 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 73 74  t PrintAction(st
11e00 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c  ruct action *ap,
11e10 20 46 49 4c 45 20 2a 66 70 2c 20 69 6e 74 20 69   FILE *fp, int i
11e20 6e 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 65  ndent){.  int re
11e30 73 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77 69 74  sult = 1;.  swit
11e40 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a  ch( ap->type ){.
11e50 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 0a      case SHIFT:.
11e60 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
11e70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 25 64 22  ,"%*s shift  %d"
11e80 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
11e90 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
11ea0 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72  index);.      br
11eb0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45  eak;.    case RE
11ec0 44 55 43 45 3a 0a 20 20 20 20 20 20 66 70 72 69  DUCE:.      fpri
11ed0 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75  ntf(fp,"%*s redu
11ee0 63 65 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70  ce %d",indent,ap
11ef0 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78  ->sp->name,ap->x
11f00 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  .rp->index);.   
11f10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11f20 73 65 20 41 43 43 45 50 54 3a 0a 20 20 20 20 20  se ACCEPT:.     
11f30 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
11f40 20 61 63 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c   accept",indent,
11f50 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  ap->sp->name);. 
11f60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11f70 63 61 73 65 20 45 52 52 4f 52 3a 0a 20 20 20 20  case ERROR:.    
11f80 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
11f90 73 20 65 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c  s error",indent,
11fa0 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  ap->sp->name);. 
11fb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11fc0 63 61 73 65 20 43 4f 4e 46 4c 49 43 54 3a 0a 20  case CONFLICT:. 
11fd0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
11fe0 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64  "%*s reduce %-3d
11ff0 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
12000 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20  lict **",.      
12010 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
12020 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
12030 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72  index);.      br
12040 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48  eak;.    case SH
12050 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63  _RESOLVED:.    c
12060 61 73 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a  ase RD_RESOLVED:
12070 0a 20 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53  .    case NOT_US
12080 45 44 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74  ED:.      result
12090 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
120a0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
120b0 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65  result;.}../* Ge
120c0 6e 65 72 61 74 65 20 74 68 65 20 22 79 2e 6f 75  nerate the "y.ou
120d0 74 70 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a  tput" log file *
120e0 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74  /.void ReportOut
120f0 70 75 74 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  put(lemp).struct
12100 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
12110 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
12120 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
12130 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
12140 66 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  fp;.  struct act
12150 69 6f 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20  ion *ap;.  FILE 
12160 2a 66 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c  *fp;..  fp = fil
12170 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75  e_open(lemp,".ou
12180 74 22 2c 22 77 22 29 3b 0a 20 20 69 66 28 20 66  t","w");.  if( f
12190 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
121a0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 5c 62   fprintf(fp," \b
121b0 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
121c0 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
121d0 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
121e0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
121f0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
12200 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c 73 74 70  State %d:\n",stp
12210 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 69 66  ->index);.    if
12220 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61  ( lemp->basisfla
12230 67 20 29 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b  g ) cfp=stp->bp;
12240 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20  .    else       
12250 20 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 73             cfp=s
12260 74 70 2d 3e 63 66 70 3b 0a 20 20 20 20 77 68 69  tp->cfp;.    whi
12270 6c 65 28 20 63 66 70 20 29 7b 0a 20 20 20 20 20  le( cfp ){.     
12280 20 63 68 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20   char buf[20];. 
12290 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f       if( cfp->do
122a0 74 3d 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73  t==cfp->rp->nrhs
122b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69   ){.        spri
122c0 6e 74 66 28 62 75 66 2c 22 28 25 64 29 22 2c 63  ntf(buf,"(%d)",c
122d0 66 70 2d 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a  fp->rp->index);.
122e0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
122f0 66 70 2c 22 20 20 20 20 25 35 73 20 22 2c 62 75  fp,"    %5s ",bu
12300 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  f);.      }else{
12310 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
12320 28 66 70 2c 22 20 20 20 20 20 20 20 20 20 20 22  (fp,"          "
12330 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12340 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c   ConfigPrint(fp,
12350 63 66 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69  cfp);.      fpri
12360 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69  ntf(fp,"\n");.#i
12370 66 64 65 66 20 54 45 53 54 0a 20 20 20 20 20 20  fdef TEST.      
12380 53 65 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  SetPrint(fp,cfp-
12390 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20  >fws,lemp);.    
123a0 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c    PlinkPrint(fp,
123b0 63 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22  cfp->fplp,"To  "
123c0 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
123d0 69 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70  int(fp,cfp->bplp
123e0 2c 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66  ,"From");.#endif
123f0 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  .      if( lemp-
12400 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70  >basisflag ) cfp
12410 3d 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20  =cfp->bp;.      
12420 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
12430 20 20 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e        cfp=cfp->n
12440 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ext;.    }.    f
12450 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
12460 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
12470 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
12480 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
12490 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c   PrintAction(ap,
124a0 66 70 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66  fp,30) ) fprintf
124b0 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d  (fp,"\n");.    }
124c0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
124d0 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c  "\n");.  }.  fcl
124e0 6f 73 65 28 66 70 29 3b 0a 20 20 72 65 74 75 72  ose(fp);.  retur
124f0 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20  n;.}../* Search 
12500 66 6f 72 20 74 68 65 20 66 69 6c 65 20 22 6e 61  for the file "na
12510 6d 65 22 20 77 68 69 63 68 20 69 73 20 69 6e 20  me" which is in 
12520 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
12530 72 79 20 61 73 0a 2a 2a 20 74 68 65 20 65 78 61  ry as.** the exa
12540 63 75 74 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41  cutable */.PRIVA
12550 54 45 20 63 68 61 72 20 2a 70 61 74 68 73 65 61  TE char *pathsea
12560 72 63 68 28 61 72 67 76 30 2c 6e 61 6d 65 2c 6d  rch(argv0,name,m
12570 6f 64 65 6d 61 73 6b 29 0a 63 68 61 72 20 2a 61  odemask).char *a
12580 72 67 76 30 3b 0a 63 68 61 72 20 2a 6e 61 6d 65  rgv0;.char *name
12590 3b 0a 69 6e 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a  ;.int modemask;.
125a0 7b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 6c 69  {.  char *pathli
125b0 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  st;.  char *path
125c0 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a  ,*cp;.  char c;.
125d0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63    extern int acc
125e0 65 73 73 28 29 3b 0a 0a 23 69 66 64 65 66 20 5f  ess();..#ifdef _
125f0 5f 57 49 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20  _WIN32__.  cp = 
12600 73 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 5c  strrchr(argv0,'\
12610 5c 27 29 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20  \');.#else.  cp 
12620 3d 20 73 74 72 72 63 68 72 28 61 72 67 76 30 2c  = strrchr(argv0,
12630 27 2f 27 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  '/');.#endif.  i
12640 66 28 20 63 70 20 29 7b 0a 20 20 20 20 63 20 3d  f( cp ){.    c =
12650 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20   *cp;.    *cp = 
12660 30 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63  0;.    path = (c
12670 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 74  har *)malloc( st
12680 72 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 73 74  rlen(argv0) + st
12690 72 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29  rlen(name) + 2 )
126a0 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 20 29  ;.    if( path )
126b0 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25   sprintf(path,"%
126c0 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65  s/%s",argv0,name
126d0 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a  );.    *cp = c;.
126e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 74    }else{.    ext
126f0 65 72 6e 20 63 68 61 72 20 2a 67 65 74 65 6e 76  ern char *getenv
12700 28 29 3b 0a 20 20 20 20 70 61 74 68 6c 69 73 74  ();.    pathlist
12710 20 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48 22   = getenv("PATH"
12720 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c  );.    if( pathl
12730 69 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73  ist==0 ) pathlis
12740 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72  t = ".:/bin:/usr
12750 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 20  /bin";.    path 
12760 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
12770 28 20 73 74 72 6c 65 6e 28 70 61 74 68 6c 69 73  ( strlen(pathlis
12780 74 29 2b 73 74 72 6c 65 6e 28 6e 61 6d 65 29 2b  t)+strlen(name)+
12790 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74  2 );.    if( pat
127a0 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 68  h!=0 ){.      wh
127b0 69 6c 65 28 20 2a 70 61 74 68 6c 69 73 74 20 29  ile( *pathlist )
127c0 7b 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 73  {.        cp = s
127d0 74 72 63 68 72 28 70 61 74 68 6c 69 73 74 2c 27  trchr(pathlist,'
127e0 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :');.        if(
127f0 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 26 70   cp==0 ) cp = &p
12800 61 74 68 6c 69 73 74 5b 73 74 72 6c 65 6e 28 70  athlist[strlen(p
12810 61 74 68 6c 69 73 74 29 5d 3b 0a 20 20 20 20 20  athlist)];.     
12820 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20     c = *cp;.    
12830 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20      *cp = 0;.   
12840 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 61 74       sprintf(pat
12850 68 2c 22 25 73 2f 25 73 22 2c 70 61 74 68 6c 69  h,"%s/%s",pathli
12860 73 74 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  st,name);.      
12870 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20 20    *cp = c;.     
12880 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 70 61     if( c==0 ) pa
12890 74 68 6c 69 73 74 20 3d 20 22 22 3b 0a 20 20 20  thlist = "";.   
128a0 20 20 20 20 20 65 6c 73 65 20 70 61 74 68 6c 69       else pathli
128b0 73 74 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20  st = &cp[1];.   
128c0 20 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28       if( access(
128d0 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d  path,modemask)==
128e0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
128f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
12900 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f  eturn path;.}../
12910 2a 20 47 69 76 65 6e 20 61 6e 20 61 63 74 69 6f  * Given an actio
12920 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 69  n, compute the i
12930 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72  nteger value for
12940 20 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20   that action.** 
12950 77 68 69 63 68 20 69 73 20 74 6f 20 62 65 20 70  which is to be p
12960 75 74 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e  ut in the action
12970 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 67 65   table of the ge
12980 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e 65 2e  nerated machine.
12990 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74  .** Return negat
129a0 69 76 65 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e  ive if no action
129b0 20 73 68 6f 75 6c 64 20 62 65 20 67 65 6e 65 72   should be gener
129c0 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  ated..*/.PRIVATE
129d0 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63 74   int compute_act
129e0 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 0a 73 74 72  ion(lemp,ap).str
129f0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
12a00 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  .struct action *
12a10 61 70 3b 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b  ap;.{.  int act;
12a20 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74  .  switch( ap->t
12a30 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
12a40 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61 70  SHIFT:  act = ap
12a50 2d 3e 78 2e 73 74 70 2d 3e 69 6e 64 65 78 3b 20  ->x.stp->index; 
12a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
12a70 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45  eak;.    case RE
12a80 44 55 43 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e  DUCE: act = ap->
12a90 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65  x.rp->index + le
12aa0 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 62 72 65 61  mp->nstate; brea
12ab0 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f  k;.    case ERRO
12ac0 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e  R:  act = lemp->
12ad0 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e  nstate + lemp->n
12ae0 72 75 6c 65 3b 20 20 20 20 20 62 72 65 61 6b 3b  rule;     break;
12af0 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50 54  .    case ACCEPT
12b00 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73  : act = lemp->ns
12b10 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75  tate + lemp->nru
12b20 6c 65 20 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20  le + 1; break;. 
12b30 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20     default:     
12b40 61 63 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b  act = -1; break;
12b50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 63  .  }.  return ac
12b60 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49  t;.}..#define LI
12b70 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54  NESIZE 1000./* T
12b80 68 65 20 6e 65 78 74 20 63 6c 75 73 74 65 72 20  he next cluster 
12b90 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
12ba0 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68 65 20  for reading the 
12bb0 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a  template file.**
12bc0 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74 68 65   and writing the
12bd0 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20   results to the 
12be0 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72  generated parser
12bf0 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73 74   */./* The first
12c00 20 66 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66   function transf
12c10 65 72 73 20 64 61 74 61 20 66 72 6f 6d 20 22 69  ers data from "i
12c20 6e 22 20 74 6f 20 22 6f 75 74 22 20 75 6e 74 69  n" to "out" unti
12c30 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20 73  l.** a line is s
12c40 65 65 6e 20 77 68 69 63 68 20 62 65 67 69 6e 73  een which begins
12c50 20 77 69 74 68 20 22 25 25 22 2e 20 20 54 68 65   with "%%".  The
12c60 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a   line number is.
12c70 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a  ** tracked..**.*
12c80 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68  * if name!=0, th
12c90 65 6e 20 61 6e 79 20 77 6f 72 64 20 74 68 61 74  en any word that
12ca0 20 62 65 67 69 6e 20 77 69 74 68 20 22 50 61 72   begin with "Par
12cb0 73 65 22 20 69 73 20 63 68 61 6e 67 65 64 20 74  se" is changed t
12cc0 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69 74 68 20  o.** begin with 
12cd0 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a  *name instead..*
12ce0 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
12cf0 70 6c 74 5f 78 66 65 72 28 6e 61 6d 65 2c 69 6e  plt_xfer(name,in
12d00 2c 6f 75 74 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61  ,out,lineno).cha
12d10 72 20 2a 6e 61 6d 65 3b 0a 46 49 4c 45 20 2a 69  r *name;.FILE *i
12d20 6e 3b 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e  n;.FILE *out;.in
12d30 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69  t *lineno;.{.  i
12d40 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20  nt i, iStart;.  
12d50 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49  char line[LINESI
12d60 5a 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67  ZE];.  while( fg
12d70 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a  ets(line,LINESIZ
12d80 45 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30  E,in) && (line[0
12d90 5d 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31  ]!='%' || line[1
12da0 5d 21 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28  ]!='%') ){.    (
12db0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
12dc0 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20  iStart = 0;.    
12dd0 69 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20  if( name ){.    
12de0 20 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b    for(i=0; line[
12df0 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
12e00 20 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27    if( line[i]=='
12e10 50 27 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c  P' && strncmp(&l
12e20 69 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35  ine[i],"Parse",5
12e30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  )==0.          &
12e40 26 20 28 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c  & (i==0 || !isal
12e50 70 68 61 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a  pha(line[i-1])).
12e60 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
12e70 20 20 20 20 20 69 66 28 20 69 3e 69 53 74 61 72       if( i>iStar
12e80 74 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  t ) fprintf(out,
12e90 22 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c  "%.*s",i-iStart,
12ea0 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a  &line[iStart]);.
12eb0 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
12ec0 66 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29  f(out,"%s",name)
12ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
12ee0 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53   4;.          iS
12ef0 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20  tart = i+1;.    
12f00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12f10 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
12f20 6f 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69  out,"%s",&line[i
12f30 53 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a  Start]);.  }.}..
12f40 2f 2a 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63  /* The next func
12f50 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74  tion finds the t
12f60 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64  emplate file and
12f70 20 6f 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72   opens it, retur
12f80 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  ning.** a pointe
12f90 72 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  r to the opened 
12fa0 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45  file. */.PRIVATE
12fb0 20 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e   FILE *tplt_open
12fc0 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
12fd0 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73  mon *lemp;.{.  s
12fe0 74 61 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c  tatic char templ
12ff0 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d  atename[] = "lem
13000 70 61 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62  par.c";.  char b
13010 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45  uf[1000];.  FILE
13020 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70   *in;.  char *tp
13030 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a  ltname;.  char *
13040 63 70 3b 0a 0a 20 20 63 70 20 3d 20 73 74 72 72  cp;..  cp = strr
13050 63 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  chr(lemp->filena
13060 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63  me,'.');.  if( c
13070 70 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  p ){.    sprintf
13080 28 62 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28  (buf,"%.*s.lt",(
13090 69 6e 74 29 63 70 2d 28 69 6e 74 29 6c 65 6d 70  int)cp-(int)lemp
130a0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 6c 65 6d 70 2d  ->filename,lemp-
130b0 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65  >filename);.  }e
130c0 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  lse{.    sprintf
130d0 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d  (buf,"%s.lt",lem
130e0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
130f0 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 62  }.  if( access(b
13100 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  uf,004)==0 ){.  
13110 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75 66    tpltname = buf
13120 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
13130 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68 73 65  pltname = pathse
13140 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67 76 30  arch(lemp->argv0
13150 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 29  ,templatename,0)
13160 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 70 6c 74  ;.  }.  if( tplt
13170 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  name==0 ){.    f
13180 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
13190 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70 61  an't find the pa
131a0 72 73 65 72 20 64 72 69 76 65 72 20 74 65 6d 70  rser driver temp
131b0 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
131c0 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70 6c 61  .\n",.    templa
131d0 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  tename);.    lem
131e0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
131f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
13200 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 74 70  .  in = fopen(tp
13210 6c 74 6e 61 6d 65 2c 22 72 22 29 3b 0a 20 20 69  ltname,"r");.  i
13220 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
13230 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
13240 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74  Can't open the t
13250 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
13260 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61 74 65  s\".\n",template
13270 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  name);.    lemp-
13280 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
13290 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
132a0 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f   return in;.}../
132b0 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e 67  * Print a string
132c0 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e 64   to the file and
132d0 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e 75   keep the linenu
132e0 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74 65 20  mber up to date 
132f0 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
13300 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
13310 65 6d 70 2c 73 74 72 2c 73 74 72 6c 6e 2c 6c 69  emp,str,strln,li
13320 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  neno).FILE *out;
13330 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
13340 65 6d 70 3b 0a 63 68 61 72 20 2a 73 74 72 3b 0a  emp;.char *str;.
13350 69 6e 74 20 73 74 72 6c 6e 3b 0a 69 6e 74 20 2a  int strln;.int *
13360 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 66 28 20  lineno;.{.  if( 
13370 73 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  str==0 ) return;
13380 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
13390 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
133a0 6e 22 2c 73 74 72 6c 6e 2c 6c 65 6d 70 2d 3e 66  n",strln,lemp->f
133b0 69 6c 65 6e 61 6d 65 29 3b 20 28 2a 6c 69 6e 65  ilename); (*line
133c0 6e 6f 29 2b 2b 3b 0a 20 20 77 68 69 6c 65 28 20  no)++;.  while( 
133d0 2a 73 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20  *str ){.    if( 
133e0 2a 73 74 72 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c  *str=='\n' ) (*l
133f0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 70 75  ineno)++;.    pu
13400 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20 20  tc(*str,out);.  
13410 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 66    str++;.  }.  f
13420 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 23 6c  printf(out,"\n#l
13430 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22  ine %d \"%s\"\n"
13440 2c 2a 6c 69 6e 65 6e 6f 2b 32 2c 6c 65 6d 70 2d  ,*lineno+2,lemp-
13450 3e 6f 75 74 6e 61 6d 65 29 3b 20 28 2a 6c 69 6e  >outname); (*lin
13460 65 6e 6f 29 2b 3d 32 3b 0a 20 20 72 65 74 75 72  eno)+=2;.  retur
13470 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  n;.}../*.** The 
13480 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
13490 65 20 65 6d 69 74 73 20 63 6f 64 65 20 66 6f 72  e emits code for
134a0 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
134b0 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62 6f  for the.** symbo
134c0 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d 69  l sp.*/.void emi
134d0 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
134e0 65 28 6f 75 74 2c 73 70 2c 6c 65 6d 70 2c 6c 69  e(out,sp,lemp,li
134f0 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  neno).FILE *out;
13500 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
13510 73 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  sp;.struct lemon
13520 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e   *lemp;.int *lin
13530 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72 20 2a 63 70  eno;.{. char *cp
13540 3b 0a 0a 20 69 6e 74 20 6c 69 6e 65 63 6e 74 20  ;.. int linecnt 
13550 3d 20 30 3b 0a 20 69 66 28 20 73 70 2d 3e 74 79  = 0;. if( sp->ty
13560 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
13570 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f     cp = lemp->to
13580 6b 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28 20  kendest;.   if( 
13590 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
135a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
135b0 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
135c0 6e 7b 22 2c 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64  n{",lemp->tokend
135d0 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65  estln,lemp->file
135e0 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73 65 7b 0a 20  name);. }else{. 
135f0 20 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72    cp = sp->destr
13600 75 63 74 6f 72 3b 0a 20 20 20 69 66 28 20 63 70  uctor;.   if( cp
13610 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
13620 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c   fprintf(out,"#l
13630 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 7b  ine %d \"%s\"\n{
13640 22 2c 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  ",sp->destructor
13650 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  ln,lemp->filenam
13660 65 29 3b 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63  e);. }. for(; *c
13670 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28  p; cp++){.   if(
13680 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b   *cp=='$' && cp[
13690 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20  1]=='$' ){.     
136a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79  fprintf(out,"(yy
136b0 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73  pminor->yy%d)",s
136c0 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20  p->dtnum);.     
136d0 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69  cp++;.     conti
136e0 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28  nue;.   }.   if(
136f0 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e   *cp=='\n' ) lin
13700 65 63 6e 74 2b 2b 3b 0a 20 20 20 66 70 75 74 63  ecnt++;.   fputc
13710 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 28  (*cp,out);. }. (
13720 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b 20  *lineno) += 3 + 
13730 6c 69 6e 65 63 6e 74 3b 0a 20 66 70 72 69 6e 74  linecnt;. fprint
13740 66 28 6f 75 74 2c 22 7d 5c 6e 23 6c 69 6e 65 20  f(out,"}\n#line 
13750 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c 69  %d \"%s\"\n",*li
13760 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
13770 6d 65 29 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a  me);. return;.}.
13780 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
13790 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  UE (non-zero) if
137a0 20 74 68 65 20 67 69 76 65 6e 20 73 79 6d 62 6f   the given symbo
137b0 6c 20 68 61 73 20 61 20 64 69 73 74 72 75 63 74  l has a distruct
137c0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64  or..*/.int has_d
137d0 65 73 74 72 75 63 74 6f 72 28 73 70 2c 20 6c 65  estructor(sp, le
137e0 6d 70 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  mp).struct symbo
137f0 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c 65  l *sp;.struct le
13800 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
13810 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20 73 70  nt ret;.  if( sp
13820 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
13830 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65   ){.    ret = le
13840 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30  mp->tokendest!=0
13850 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
13860 65 74 20 3d 20 73 70 2d 3e 64 65 73 74 72 75 63  et = sp->destruc
13870 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65  tor!=0;.  }.  re
13880 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 20  turn ret;.}../* 
13890 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
138a0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
138b0 20 77 68 65 6e 20 74 68 65 20 72 75 6c 65 20 22   when the rule "
138c0 72 70 22 20 69 73 20 72 65 64 75 63 65 64 2e 20  rp" is reduced. 
138d0 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f   Write.** the co
138e0 64 65 20 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61  de to "out".  Ma
138f0 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73  ke sure lineno s
13900 74 61 79 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e  tays up-to-date.
13910 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
13920 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72   emit_code(out,r
13930 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46  p,lemp,lineno).F
13940 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
13950 20 72 75 6c 65 20 2a 72 70 3b 0a 73 74 72 75 63   rule *rp;.struc
13960 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69  t lemon *lemp;.i
13970 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63  nt *lineno;.{. c
13980 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b 0a 20 69  har *cp, *xp;. i
13990 6e 74 20 6c 69 6e 65 63 6e 74 20 3d 20 30 3b 0a  nt linecnt = 0;.
139a0 20 69 6e 74 20 69 3b 0a 20 63 68 61 72 20 6c 68   int i;. char lh
139b0 73 75 73 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a  sused = 0;    /*
139c0 20 54 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   True if the LHS
139d0 20 65 6c 65 6d 65 6e 74 20 68 61 73 20 62 65 65   element has bee
139e0 6e 20 75 73 65 64 20 2a 2f 0a 20 63 68 61 72 20  n used */. char 
139f0 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20  used[MAXRHS];   
13a00 2f 2a 20 54 72 75 65 20 66 6f 72 20 65 61 63 68  /* True for each
13a10 20 52 48 53 20 65 6c 65 6d 65 6e 74 20 77 68 69   RHS element whi
13a20 63 68 20 69 73 20 75 73 65 64 20 2a 2f 0a 0a 20  ch is used */.. 
13a30 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
13a40 72 68 73 3b 20 69 2b 2b 29 20 75 73 65 64 5b 69  rhs; i++) used[i
13a50 5d 20 3d 20 30 3b 0a 20 6c 68 73 75 73 65 64 20  ] = 0;. lhsused 
13a60 3d 20 30 3b 0a 0a 20 2f 2a 20 47 65 6e 65 72 61  = 0;.. /* Genera
13a70 74 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  te code to do th
13a80 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20  e reduce action 
13a90 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  */. if( rp->code
13aa0 20 29 7b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f   ){.   fprintf(o
13ab0 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25  ut,"#line %d \"%
13ac0 73 5c 22 5c 6e 7b 22 2c 72 70 2d 3e 6c 69 6e 65  s\"\n{",rp->line
13ad0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
13ae0 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e  ;.   for(cp=rp->
13af0 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29  code; *cp; cp++)
13b00 7b 0a 20 20 20 20 20 69 66 28 20 69 73 61 6c 70  {.     if( isalp
13b10 68 61 28 2a 63 70 29 20 26 26 20 28 63 70 3d 3d  ha(*cp) && (cp==
13b20 72 70 2d 3e 63 6f 64 65 20 7c 7c 20 21 69 73 61  rp->code || !isa
13b30 6c 6e 75 6d 28 63 70 5b 2d 31 5d 29 29 20 29 7b  lnum(cp[-1])) ){
13b40 0a 20 20 20 20 20 20 20 63 68 61 72 20 73 61 76  .       char sav
13b50 65 64 3b 0a 20 20 20 20 20 20 20 66 6f 72 28 78  ed;.       for(x
13b60 70 3d 20 26 63 70 5b 31 5d 3b 20 69 73 61 6c 6e  p= &cp[1]; isaln
13b70 75 6d 28 2a 78 70 29 3b 20 78 70 2b 2b 29 3b 0a  um(*xp); xp++);.
13b80 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
13b90 78 70 3b 0a 20 20 20 20 20 20 20 2a 78 70 20 3d  xp;.       *xp =
13ba0 20 30 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72   0;.       if( r
13bb0 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73  p->lhsalias && s
13bc0 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68 73  trcmp(cp,rp->lhs
13bd0 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20 20  alias)==0 ){.   
13be0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13bf0 74 2c 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e 79  t,"yygotominor.y
13c00 79 25 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74  y%d",rp->lhs->dt
13c10 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 63  num);.         c
13c20 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20  p = xp;.        
13c30 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20 20   lhsused = 1;.  
13c40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13c50 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13c60 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
13c70 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
13c80 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26  p->rhsalias[i] &
13c90 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
13ca0 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20  rhsalias[i])==0 
13cb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13cc0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 79 79 6d  fprintf(out,"yym
13cd0 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25  sp[%d].minor.yy%
13ce0 64 22 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c  d",i-rp->nrhs+1,
13cf0 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 64 74 6e 75  rp->rhs[i]->dtnu
13d00 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
13d10 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20   cp = xp;.      
13d20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d         used[i] =
13d30 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
13d40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 7d 0a     }.         }.
13d60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13d70 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a 20 20 20  *xp = saved;.   
13d80 20 20 7d 0a 20 20 20 20 20 69 66 28 20 2a 63 70    }.     if( *cp
13d90 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 63 6e 74  =='\n' ) linecnt
13da0 2b 2b 3b 0a 20 20 20 20 20 66 70 75 74 63 28 2a  ++;.     fputc(*
13db0 63 70 2c 6f 75 74 29 3b 0a 20 20 20 7d 20 2f 2a  cp,out);.   } /*
13dc0 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   End loop */.   
13dd0 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b  (*lineno) += 3 +
13de0 20 6c 69 6e 65 63 6e 74 3b 0a 20 20 20 66 70 72   linecnt;.   fpr
13df0 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 23 6c 69  intf(out,"}\n#li
13e00 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c  ne %d \"%s\"\n",
13e10 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
13e20 74 6e 61 6d 65 29 3b 0a 20 7d 20 2f 2a 20 45 6e  tname);. } /* En
13e30 64 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29  d if( rp->code )
13e40 20 2a 2f 0a 0a 20 2f 2a 20 43 68 65 63 6b 20 74   */.. /* Check t
13e50 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
13e60 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75 73 65  LHS has been use
13e70 64 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 6c 68  d */. if( rp->lh
13e80 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73  salias && !lhsus
13e90 65 64 20 29 7b 0a 20 20 20 45 72 72 6f 72 4d 73  ed ){.   ErrorMs
13ea0 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
13eb0 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20  ,rp->ruleline,. 
13ec0 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c      "Label \"%s\
13ed0 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22  " for \"%s(%s)\"
13ee0 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22   is never used."
13ef0 2c 0a 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73  ,.       rp->lhs
13f00 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e  alias,rp->lhs->n
13f10 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73  ame,rp->lhsalias
13f20 29 3b 0a 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  );.   lemp->erro
13f30 72 63 6e 74 2b 2b 3b 0a 20 7d 0a 0a 20 2f 2a 20  rcnt++;. }.. /* 
13f40 47 65 6e 65 72 61 74 65 20 64 65 73 74 72 75 63  Generate destruc
13f50 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52 48 53  tor code for RHS
13f60 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 61   symbols which a
13f70 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 74  re not used in t
13f80 68 65 0a 20 2a 2a 20 72 65 64 75 63 65 20 63 6f  he. ** reduce co
13f90 64 65 20 2a 2f 0a 20 66 6f 72 28 69 3d 30 3b 20  de */. for(i=0; 
13fa0 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
13fb0 7b 0a 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73  {.   if( rp->rhs
13fc0 61 6c 69 61 73 5b 69 5d 20 26 26 20 21 75 73 65  alias[i] && !use
13fd0 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 45 72 72  d[i] ){.     Err
13fe0 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
13ff0 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
14000 65 2c 0a 20 20 20 20 20 20 20 22 4c 61 62 65 6c  e,.       "Label
14010 20 24 25 73 24 20 66 6f 72 20 5c 22 25 73 28 25   $%s$ for \"%s(%
14020 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73  s)\" is never us
14030 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 72 70 2d  ed.",.       rp-
14040 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d  >rhsalias[i],rp-
14050 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70  >rhs[i]->name,rp
14060 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a  ->rhsalias[i]);.
14070 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
14080 63 6e 74 2b 2b 3b 0a 20 20 20 7d 65 6c 73 65 20  cnt++;.   }else 
14090 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
140a0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 69  [i]==0 ){.     i
140b0 66 28 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f  f( has_destructo
140c0 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d  r(rp->rhs[i],lem
140d0 70 29 20 29 7b 0a 20 20 20 20 20 20 20 66 70 72  p) ){.       fpr
140e0 69 6e 74 66 28 6f 75 74 2c 22 20 20 79 79 5f 64  intf(out,"  yy_d
140f0 65 73 74 72 75 63 74 6f 72 28 25 64 2c 26 79 79  estructor(%d,&yy
14100 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c  msp[%d].minor);\
14110 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 72 70  n",.          rp
14120 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c  ->rhs[i]->index,
14130 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29 3b 20 28  i-rp->nrhs+1); (
14140 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
14150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 66   }else{.       f
14160 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
14170 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73 74 72 75      /* No destru
14180 63 74 6f 72 20 64 65 66 69 6e 65 64 20 66 6f 72  ctor defined for
14190 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
141a0 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e     rp->rhs[i]->n
141b0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 28 2a  ame);.        (*
141c0 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  lineno)++;.     
141d0 7d 0a 20 20 20 7d 0a 20 7d 0a 20 72 65 74 75 72  }.   }. }. retur
141e0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  n;.}../*.** Prin
141f0 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  t the definition
14200 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75 73   of the union us
14210 65 64 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ed for the parse
14220 72 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e 0a  r's data stack..
14230 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f  ** This union co
14240 6e 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66 6f  ntains fields fo
14250 72 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65  r every possible
14260 20 64 61 74 61 20 74 79 70 65 20 66 6f 72 20 74   data type for t
14270 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e  okens.** and non
14280 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74  terminals.  In t
14290 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63 6f  he process of co
142a0 6d 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69 6e  mputing and prin
142b0 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69  ting this.** uni
142c0 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68 65  on, also set the
142d0 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20   ".dtnum" field 
142e0 6f 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e 61  of every termina
142f0 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61  l and nontermina
14300 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a  l.** symbol..*/.
14310 76 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63 6b  void print_stack
14320 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c  _union(out,lemp,
14330 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 0a  plineno,mhflag).
14340 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20  FILE *out;      
14350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14360 68 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d  he output stream
14370 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e   */.struct lemon
14380 20 2a 6c 65 6d 70 3b 20 20 20 20 20 20 20 20 20   *lemp;         
14390 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f  /* The main info
143a0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
143b0 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 69 6e  his parser */.in
143c0 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 20  t *plineno;     
143d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
143e0 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e 65  nter to the line
143f0 20 6e 75 6d 62 65 72 20 2a 2f 0a 69 6e 74 20 6d   number */.int m
14400 68 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20  hflag;          
14410 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14420 66 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b  f generating mak
14430 65 68 65 61 64 65 72 73 20 6f 75 74 70 75 74 20  eheaders output 
14440 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  */.{.  int linen
14450 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20  o = *plineno;   
14460 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d   /* The line num
14470 62 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ber of the outpu
14480 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79  t */.  char **ty
14490 70 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  pes;            
144a0 20 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65   /* A hash table
144b0 20 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f   of datatypes */
144c0 0a 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65  .  int arraysize
144d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
144e0 53 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70  Size of the "typ
144f0 65 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  es" array */.  i
14500 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20  nt maxdtlength; 
14510 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
14520 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e  mum length of an
14530 79 20 22 2e 64 61 74 61 74 79 70 65 22 20 66 69  y ".datatype" fi
14540 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  eld. */.  char *
14550 73 74 64 64 74 3b 20 20 20 20 20 20 20 20 20 20  stddt;          
14560 20 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69      /* Standardi
14570 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64  zed name for a d
14580 61 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74  atatype */.  int
14590 20 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20   i,j;           
145a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
145b0 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
145c0 20 68 61 73 68 3b 20 20 20 20 20 20 20 20 20 20   hash;          
145d0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61         /* For ha
145e0 73 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  shing the name o
145f0 66 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  f a type */.  ch
14600 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
14610 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
14620 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
14630 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
14640 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
14650 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63  ypes[] and alloc
14660 61 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20  ate stddt[] */. 
14670 20 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d   arraysize = lem
14680 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a  p->nsymbol * 2;.
14690 20 20 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a    types = (char*
146a0 2a 29 6d 61 6c 6c 6f 63 28 20 61 72 72 61 79 73  *)malloc( arrays
146b0 69 7a 65 20 2a 20 73 69 7a 65 6f 66 28 63 68 61  ize * sizeof(cha
146c0 72 2a 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  r*) );.  for(i=0
146d0 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
146e0 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30  ++) types[i] = 0
146f0 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  ;.  maxdtlength 
14700 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
14710 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
14720 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
14730 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  en;.    struct s
14740 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
14750 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
14760 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74 79    if( sp->dataty
14770 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pe==0 ) continue
14780 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  ;.    len = strl
14790 65 6e 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29  en(sp->datatype)
147a0 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61  ;.    if( len>ma
147b0 78 64 74 6c 65 6e 67 74 68 20 29 20 6d 61 78 64  xdtlength ) maxd
147c0 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20  tlength = len;. 
147d0 20 7d 0a 20 20 73 74 64 64 74 20 3d 20 28 63 68   }.  stddt = (ch
147e0 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64  ar*)malloc( maxd
147f0 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b  tlength*2 + 1 );
14800 0a 20 20 69 66 28 20 74 79 70 65 73 3d 3d 30 20  .  if( types==0 
14810 7c 7c 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a 20  || stddt==0 ){. 
14820 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
14830 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
14840 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
14850 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 75  1);.  }..  /* Bu
14860 69 6c 64 20 61 20 68 61 73 68 20 74 61 62 6c 65  ild a hash table
14870 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20 54   of datatypes. T
14880 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c  he ".dtnum" fiel
14890 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62 6f 6c  d of each symbol
148a0 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20  .  ** is filled 
148b0 69 6e 20 77 69 74 68 20 74 68 65 20 68 61 73 68  in with the hash
148c0 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e 20 20   index plus 1.  
148d0 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75 65  A ".dtnum" value
148e0 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20 75 73   of 0 is.  ** us
148f0 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 20  ed for terminal 
14900 73 79 6d 62 6f 6c 73 20 61 6e 64 20 66 6f 72 20  symbols and for 
14910 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69  nonterminals whi
14920 63 68 20 64 6f 6e 27 74 20 73 70 65 63 69 66 79  ch don't specify
14930 0a 20 20 2a 2a 20 61 20 64 61 74 61 74 79 70 65  .  ** a datatype
14940 20 75 73 69 6e 67 20 74 68 65 20 25 74 79 70 65   using the %type
14950 20 64 69 72 65 63 74 69 76 65 2e 20 2a 2f 0a 20   directive. */. 
14960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
14970 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
14980 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
14990 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
149a0 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 63  ymbols[i];.    c
149b0 68 61 72 20 2a 63 70 3b 0a 20 20 20 20 69 66 28  har *cp;.    if(
149c0 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65 72 72 73 79   sp==lemp->errsy
149d0 6d 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64  m ){.      sp->d
149e0 74 6e 75 6d 20 3d 20 61 72 72 61 79 73 69 7a 65  tnum = arraysize
149f0 2b 31 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  +1;.      contin
14a00 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
14a10 28 20 73 70 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54  ( sp->type!=NONT
14a20 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64  ERMINAL || sp->d
14a30 61 74 61 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  atatype==0 ){.  
14a40 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
14a50 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
14a60 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20  e;.    }.    cp 
14a70 3d 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a  = sp->datatype;.
14a80 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77      j = 0;.    w
14a90 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 63  hile( isspace(*c
14aa0 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77  p) ) cp++;.    w
14ab0 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64  hile( *cp ) stdd
14ac0 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a  t[j++] = *cp++;.
14ad0 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
14ae0 26 20 69 73 73 70 61 63 65 28 73 74 64 64 74 5b  & isspace(stddt[
14af0 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20  j-1]) ) j--;.   
14b00 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20   stddt[j] = 0;. 
14b10 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20     hash = 0;.   
14b20 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b   for(j=0; stddt[
14b30 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  j]; j++){.      
14b40 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33 20 2b  hash = hash*53 +
14b50 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d   stddt[j];.    }
14b60 0a 20 20 20 20 69 66 28 20 68 61 73 68 3c 30 20  .    if( hash<0 
14b70 29 20 68 61 73 68 20 3d 20 2d 68 61 73 68 3b 0a  ) hash = -hash;.
14b80 20 20 20 20 68 61 73 68 20 3d 20 68 61 73 68 25      hash = hash%
14b90 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20 20 77  arraysize;.    w
14ba0 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61 73 68  hile( types[hash
14bb0 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ] ){.      if( s
14bc0 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61 73 68  trcmp(types[hash
14bd0 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20  ],stddt)==0 ){. 
14be0 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d         sp->dtnum
14bf0 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20   = hash + 1;.   
14c00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14c10 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68 2b 2b    }.      hash++
14c20 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 68  ;.      if( hash
14c30 3e 3d 61 72 72 61 79 73 69 7a 65 20 29 20 68 61  >=arraysize ) ha
14c40 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sh = 0;.    }.  
14c50 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68    if( types[hash
14c60 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70  ]==0 ){.      sp
14c70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b  ->dtnum = hash +
14c80 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73 5b   1;.      types[
14c90 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d  hash] = (char*)m
14ca0 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 73 74  alloc( strlen(st
14cb0 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20  ddt)+1 );.      
14cc0 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d  if( types[hash]=
14cd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
14ce0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75  rintf(stderr,"Ou
14cf0 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29  t of memory.\n")
14d00 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31  ;.        exit(1
14d10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14d20 20 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61   strcpy(types[ha
14d30 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20  sh],stddt);.    
14d40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e  }.  }..  /* Prin
14d50 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69  t out the defini
14d60 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54  tion of YYTOKENT
14d70 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54  YPE and YYMINORT
14d80 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20  YPE */.  name = 
14d90 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d  lemp->name ? lem
14da0 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65  p->name : "Parse
14db0 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70  ";.  lineno = *p
14dc0 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68  lineno;.  if( mh
14dd0 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28  flag ){ fprintf(
14de0 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41  out,"#if INTERFA
14df0 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  CE\n"); lineno++
14e00 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ; }.  fprintf(ou
14e10 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b  t,"#define %sTOK
14e20 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d  ENTYPE %s\n",nam
14e30 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b  e,.    lemp->tok
14e40 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b  entype?lemp->tok
14e50 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b  entype:"void*");
14e60 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
14e70 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69  ( mhflag ){ fpri
14e80 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c  ntf(out,"#endif\
14e90 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
14ea0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
14eb0 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c  typedef union {\
14ec0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
14ed0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
14ee0 25 73 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b  %sTOKENTYPE yy0;
14ef0 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
14f00 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  o++;.  for(i=0; 
14f10 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b  i<arraysize; i++
14f20 29 7b 0a 20 20 20 20 69 66 28 20 74 79 70 65 73  ){.    if( types
14f30 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
14f40 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e;.    fprintf(o
14f50 75 74 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e  ut,"  %s yy%d;\n
14f60 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b  ",types[i],i+1);
14f70 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
14f80 72 65 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20  ree(types[i]);. 
14f90 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
14fa0 2c 22 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22  ,"  int yy%d;\n"
14fb0 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64  ,lemp->errsym->d
14fc0 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  tnum); lineno++;
14fd0 0a 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a  .  free(stddt);.
14fe0 20 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20    free(types);. 
14ff0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20   fprintf(out,"} 
15000 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29  YYMINORTYPE;\n")
15010 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70  ; lineno++;.  *p
15020 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b  lineno = lineno;
15030 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20  .}../* Generate 
15040 43 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f  C source code fo
15050 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  r the parser */.
15060 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65  void ReportTable
15070 28 6c 65 6d 70 2c 20 6d 68 66 6c 61 67 29 0a 73  (lemp, mhflag).s
15080 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
15090 70 3b 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20  p;.int mhflag;  
150a0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20     /* Output in 
150b0 6d 61 6b 65 68 65 61 64 65 72 73 20 66 6f 72 6d  makeheaders form
150c0 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 7b 0a  at if true */.{.
150d0 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e    FILE *out, *in
150e0 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
150f0 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20  NESIZE];.  int  
15100 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74  lineno;.  struct
15110 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
15120 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
15130 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
15140 2a 72 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *rp;.  int i;.  
15150 69 6e 74 20 74 61 62 6c 65 63 6e 74 3b 0a 20 20  int tablecnt;.  
15160 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 0a 20 20 69  char *name;..  i
15170 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65  n = tplt_open(le
15180 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30  mp);.  if( in==0
15190 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74   ) return;.  out
151a0 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d   = file_open(lem
151b0 70 2c 22 2e 63 22 2c 22 77 22 29 3b 0a 20 20 69  p,".c","w");.  i
151c0 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  f( out==0 ){.   
151d0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
151e0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c   return;.  }.  l
151f0 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c  ineno = 1;.  tpl
15200 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
15210 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
15220 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
15230 65 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63 6f  e the include co
15240 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  de, if any */.  
15250 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
15260 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64  emp,lemp->includ
15270 65 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 6c  e,lemp->includel
15280 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66  n,&lineno);.  if
15290 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
152a0 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 66 69 6c  char *name = fil
152b0 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
152c0 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72 69   ".h");.    fpri
152d0 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75 64  ntf(out,"#includ
152e0 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 6e 61 6d  e \"%s\"\n", nam
152f0 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
15300 20 20 66 72 65 65 28 6e 61 6d 65 29 3b 0a 20 20    free(name);.  
15310 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
15320 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
15330 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
15340 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e 65  Generate #define
15350 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73  s for all tokens
15360 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61 67   */.  if( mhflag
15370 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 72   ){.    char *pr
15380 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69 6e 74  efix;.    fprint
15390 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52  f(out,"#if INTER
153a0 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  FACE\n"); lineno
153b0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70  ++;.    if( lemp
153c0 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20  ->tokenprefix ) 
153d0 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74  prefix = lemp->t
153e0 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20 20  okenprefix;.    
153f0 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
15400 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
15410 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31   "";.    for(i=1
15420 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
15430 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nal; i++){.     
15440 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
15450 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32  efine %s%-30s %2
15460 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70  d\n",prefix,lemp
15470 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  ->symbols[i]->na
15480 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69 6e  me,i);.      lin
15490 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  eno++;.    }.   
154a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65   fprintf(out,"#e
154b0 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
154c0 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
154d0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
154e0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
154f0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
15500 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20 20  he defines */.  
15510 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 2f 2a 20  fprintf(out,"/* 
15520 5c 30 30 31 20 2a 2f 5c 6e 22 29 3b 0a 20 20 66  \001 */\n");.  f
15530 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
15540 69 6e 65 20 59 59 43 4f 44 45 54 59 50 45 20 25  ine YYCODETYPE %
15550 73 5c 6e 22 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e  s\n",.    lemp->
15560 6e 73 79 6d 62 6f 6c 3e 32 35 30 3f 22 69 6e 74  nsymbol>250?"int
15570 22 3a 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ":"unsigned char
15580 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ");  lineno++;. 
15590 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
155a0 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25  efine YYNOCODE %
155b0 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  d\n",lemp->nsymb
155c0 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  ol+1);  lineno++
155d0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
155e0 22 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f  "#define YYACTIO
155f0 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20  NTYPE %s\n",.   
15600 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c 65   lemp->nstate+le
15610 6d 70 2d 3e 6e 72 75 6c 65 3e 32 35 30 3f 22 69  mp->nrule>250?"i
15620 6e 74 22 3a 22 75 6e 73 69 67 6e 65 64 20 63 68  nt":"unsigned ch
15630 61 72 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ar");  lineno++;
15640 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75  .  print_stack_u
15650 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c  nion(out,lemp,&l
15660 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20  ineno,mhflag);. 
15670 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63 6b   if( lemp->stack
15680 73 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  size ){.    if( 
15690 61 74 6f 69 28 6c 65 6d 70 2d 3e 73 74 61 63 6b  atoi(lemp->stack
156a0 73 69 7a 65 29 3c 3d 30 20 29 7b 0a 20 20 20 20  size)<=0 ){.    
156b0 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
156c0 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 49 6c  >filename,0,."Il
156d0 6c 65 67 61 6c 20 73 74 61 63 6b 20 73 69 7a 65  legal stack size
156e0 3a 20 5b 25 73 5d 2e 20 20 54 68 65 20 73 74 61  : [%s].  The sta
156f0 63 6b 20 73 69 7a 65 20 73 68 6f 75 6c 64 20 62  ck size should b
15700 65 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  e an integer con
15710 73 74 61 6e 74 2e 22 2c 0a 20 20 20 20 20 20 20  stant.",.       
15720 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65   lemp->stacksize
15730 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  );.      lemp->e
15740 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
15750 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65   lemp->stacksize
15760 20 3d 20 22 31 30 30 22 3b 0a 20 20 20 20 7d 0a   = "100";.    }.
15770 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15780 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b  "#define YYSTACK
15790 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70  DEPTH %s\n",lemp
157a0 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c  ->stacksize);  l
157b0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65  ineno++;.  }else
157c0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
157d0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41  t,"#define YYSTA
157e0 43 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29 3b  CKDEPTH 100\n");
157f0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a    lineno++;.  }.
15800 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a    if( mhflag ){.
15810 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15820 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e  "#if INTERFACE\n
15830 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
15840 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d  }.  name = lemp-
15850 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61  >name ? lemp->na
15860 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20  me : "Parse";.  
15870 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26  if( lemp->arg &&
15880 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b   lemp->arg[0] ){
15890 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
158a0 69 20 3d 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d  i = strlen(lemp-
158b0 3e 61 72 67 29 3b 0a 20 20 20 20 77 68 69 6c 65  >arg);.    while
158c0 28 20 69 3e 3d 31 20 26 26 20 69 73 73 70 61 63  ( i>=1 && isspac
158d0 65 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  e(lemp->arg[i-1]
158e0 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69  ) ) i--;.    whi
158f0 6c 65 28 20 69 3e 3d 31 20 26 26 20 28 69 73 61  le( i>=1 && (isa
15900 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69  lnum(lemp->arg[i
15910 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72  -1]) || lemp->ar
15920 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69  g[i-1]=='_') ) i
15930 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  --;.    fprintf(
15940 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
15950 52 47 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61  RGDECL ,%s\n",na
15960 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  me,&lemp->arg[i]
15970 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
15980 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
15990 64 65 66 69 6e 65 20 25 73 58 41 52 47 44 45 43  define %sXARGDEC
159a0 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65  L %s;\n",name,le
159b0 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e  mp->arg);  linen
159c0 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
159d0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
159e0 41 4e 53 49 41 52 47 44 45 43 4c 20 2c 25 73 5c  ANSIARGDECL ,%s\
159f0 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72  n",name,lemp->ar
15a00 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  g);  lineno++;. 
15a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
15a20 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
15a30 20 25 73 41 52 47 44 45 43 4c 5c 6e 22 2c 6e 61   %sARGDECL\n",na
15a40 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  me);  lineno++;.
15a50 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15a60 22 23 64 65 66 69 6e 65 20 25 73 58 41 52 47 44  "#define %sXARGD
15a70 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c  ECL\n",name);  l
15a80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
15a90 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
15aa0 65 20 25 73 41 4e 53 49 41 52 47 44 45 43 4c 5c  e %sANSIARGDECL\
15ab0 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e  n",name);  linen
15ac0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  o++;.  }.  if( m
15ad0 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70 72  hflag ){.    fpr
15ae0 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66  intf(out,"#endif
15af0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
15b00 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
15b10 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 53 54  t,"#define YYNST
15b20 41 54 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  ATE %d\n",lemp->
15b30 6e 73 74 61 74 65 29 3b 20 20 6c 69 6e 65 6e 6f  nstate);  lineno
15b40 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
15b50 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 52 55  t,"#define YYNRU
15b60 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e  LE %d\n",lemp->n
15b70 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  rule);  lineno++
15b80 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
15b90 22 23 64 65 66 69 6e 65 20 59 59 45 52 52 4f 52  "#define YYERROR
15ba0 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d  SYMBOL %d\n",lem
15bb0 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e 64 65 78  p->errsym->index
15bc0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
15bd0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
15be0 66 69 6e 65 20 59 59 45 52 52 53 59 4d 44 54 20  fine YYERRSYMDT 
15bf0 79 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72  yy%d\n",lemp->er
15c00 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 20 6c  rsym->dtnum);  l
15c10 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f  ineno++;.  tplt_
15c20 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
15c30 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
15c40 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
15c50 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
15c60 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 63 68  ..  **.  ** Each
15c70 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 61 63   entry in the ac
15c80 74 69 6f 6e 20 74 61 62 6c 65 20 69 73 20 61 6e  tion table is an
15c90 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
15ca0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 2a 2a 20  following .  ** 
15cb0 73 74 72 75 63 74 75 72 65 3a 0a 20 20 2a 2a 20  structure:.  ** 
15cc0 20 20 73 74 72 75 63 74 20 79 79 41 63 74 69 6f    struct yyActio
15cd0 6e 45 6e 74 72 79 20 7b 0a 20 20 2a 2a 20 20 20  nEntry {.  **   
15ce0 20 20 20 20 59 59 43 4f 44 45 54 59 50 45 20 20      YYCODETYPE  
15cf0 20 20 20 20 20 20 20 20 20 20 6c 6f 6f 6b 61 68            lookah
15d00 65 61 64 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20  ead;.  **       
15d10 59 59 41 43 54 49 4f 4e 54 59 50 45 20 20 20 20  YYACTIONTYPE    
15d20 20 20 20 20 20 20 61 63 74 69 6f 6e 3b 0a 20 20        action;.  
15d30 2a 2a 20 20 20 20 20 20 20 73 74 72 75 63 74 20  **       struct 
15d40 79 79 41 63 74 69 6f 6e 45 6e 74 72 79 20 2a 6e  yyActionEntry *n
15d50 65 78 74 3b 0a 20 20 2a 2a 20 20 20 7d 0a 20 20  ext;.  **   }.  
15d60 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 6e 74 72  **.  ** The entr
15d70 69 65 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  ies are grouped 
15d80 69 6e 74 6f 20 68 61 73 68 20 74 61 62 6c 65 73  into hash tables
15d90 2c 20 6f 6e 65 20 68 61 73 68 20 74 61 62 6c 65  , one hash table
15da0 20 66 6f 72 20 65 61 63 68 0a 20 20 2a 2a 20 70   for each.  ** p
15db0 61 72 73 65 72 20 73 74 61 74 65 2e 20 20 54 68  arser state.  Th
15dc0 65 20 68 61 73 68 20 74 61 62 6c 65 20 68 61 73  e hash table has
15dd0 20 61 20 73 69 7a 65 20 77 68 69 63 68 20 69 73   a size which is
15de0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 0a 20 20   the smallest.  
15df0 2a 2a 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20  ** power of two 
15e00 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61  needed to hold a
15e10 6c 6c 20 65 6e 74 72 69 65 73 2e 0a 20 20 2a 2f  ll entries..  */
15e20 0a 20 20 74 61 62 6c 65 63 6e 74 20 3d 20 30 3b  .  tablecnt = 0;
15e30 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72  ..  /* Loop over
15e40 20 70 61 72 73 65 72 20 73 74 61 74 65 73 20 2a   parser states *
15e50 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
15e60 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
15e70 29 7b 0a 20 20 20 20 69 6e 74 20 74 61 62 6c 65  ){.    int table
15e80 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
15e90 20 20 20 2f 2a 20 73 69 7a 65 20 6f 66 20 74 68     /* size of th
15ea0 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
15eb0 20 20 20 20 69 6e 74 20 6a 2c 6b 3b 20 20 20 20      int j,k;    
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ed0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
15ee0 2a 2f 0a 20 20 20 20 69 6e 74 20 63 6f 6c 6c 69  */.    int colli
15ef0 64 65 5b 32 30 34 38 5d 3b 20 20 20 20 20 20 20  de[2048];       
15f00 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 69 73     /* The collis
15f10 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 74 68  ion chain for th
15f20 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 73  e table */.    s
15f30 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 74 61  truct action *ta
15f40 62 6c 65 5b 32 30 34 38 5d 3b 20 2f 2a 20 42 75  ble[2048]; /* Bu
15f50 69 6c 64 20 74 68 65 20 68 61 73 68 20 74 61 62  ild the hash tab
15f60 6c 65 20 68 65 72 65 20 2a 2f 0a 0a 20 20 20 20  le here */..    
15f70 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 75 6d 62  /* Find the numb
15f80 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 61 6e  er of actions an
15f90 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
15fa0 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
15fb0 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
15fc0 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74  orted[i];.    st
15fd0 70 2d 3e 74 61 62 73 74 61 72 74 20 3d 20 74 61  p->tabstart = ta
15fe0 62 6c 65 63 6e 74 3b 0a 20 20 20 20 73 74 70 2d  blecnt;.    stp-
15ff0 3e 6e 61 63 74 69 6f 6e 20 3d 20 30 3b 0a 20 20  >naction = 0;.  
16000 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
16010 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
16020 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
16030 2d 3e 73 70 2d 3e 69 6e 64 65 78 21 3d 6c 65 6d  ->sp->index!=lem
16040 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 63 6f  p->nsymbol && co
16050 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d  mpute_action(lem
16060 70 2c 61 70 29 3e 3d 30 20 29 7b 0a 20 20 20 20  p,ap)>=0 ){.    
16070 20 20 20 20 73 74 70 2d 3e 6e 61 63 74 69 6f 6e      stp->naction
16080 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
16090 7d 0a 20 20 20 20 74 61 62 6c 65 73 69 7a 65 20  }.    tablesize 
160a0 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 1;.    while( 
160b0 74 61 62 6c 65 73 69 7a 65 3c 73 74 70 2d 3e 6e  tablesize<stp->n
160c0 61 63 74 69 6f 6e 20 29 20 74 61 62 6c 65 73 69  action ) tablesi
160d0 7a 65 20 2b 3d 20 74 61 62 6c 65 73 69 7a 65 3b  ze += tablesize;
160e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 61 62  .    assert( tab
160f0 6c 65 73 69 7a 65 3c 3d 20 73 69 7a 65 6f 66 28  lesize<= sizeof(
16100 74 61 62 6c 65 29 2f 73 69 7a 65 6f 66 28 74 61  table)/sizeof(ta
16110 62 6c 65 5b 30 5d 29 20 29 3b 0a 20 20 20 20 66  ble[0]) );.    f
16120 6f 72 28 6a 3d 30 3b 20 6a 3c 74 61 62 6c 65 73  or(j=0; j<tables
16130 69 7a 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ize; j++){.     
16140 20 74 61 62 6c 65 5b 6a 5d 20 3d 20 30 3b 0a 20   table[j] = 0;. 
16150 20 20 20 20 20 63 6f 6c 6c 69 64 65 5b 6a 5d 20       collide[j] 
16160 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
16170 20 2f 2a 20 48 61 73 68 20 74 68 65 20 61 63 74   /* Hash the act
16180 69 6f 6e 73 20 69 6e 74 6f 20 74 68 65 20 68 61  ions into the ha
16190 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  sh table */.    
161a0 73 74 70 2d 3e 74 61 62 64 66 6c 74 61 63 74 20  stp->tabdfltact 
161b0 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b  = lemp->nstate +
161c0 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20   lemp->nrule;.  
161d0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
161e0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
161f0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 63  t){.      int ac
16200 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61  tion = compute_a
16210 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3b 0a  ction(lemp,ap);.
16220 20 20 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20        int h;.   
16230 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
16240 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d  ndex==lemp->nsym
16250 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  bol ){.        s
16260 74 70 2d 3e 74 61 62 64 66 6c 74 61 63 74 20 3d  tp->tabdfltact =
16270 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 7d   action;.      }
16280 65 6c 73 65 20 69 66 28 20 61 63 74 69 6f 6e 3e  else if( action>
16290 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 68 20  =0 ){.        h 
162a0 3d 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 20  = ap->sp->index 
162b0 26 20 28 74 61 62 6c 65 73 69 7a 65 2d 31 29 3b  & (tablesize-1);
162c0 0a 20 20 20 20 20 20 20 20 61 70 2d 3e 63 6f 6c  .        ap->col
162d0 6c 69 64 65 20 3d 20 74 61 62 6c 65 5b 68 5d 3b  lide = table[h];
162e0 0a 20 20 20 20 20 20 20 20 74 61 62 6c 65 5b 68  .        table[h
162f0 5d 20 3d 20 61 70 3b 0a 20 20 20 20 20 20 7d 0a  ] = ap;.      }.
16300 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
16310 73 6f 6c 76 65 20 63 6f 6c 6c 69 73 69 6f 6e 73  solve collisions
16320 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 6b 3d   */.    for(j=k=
16330 30 3b 20 6a 3c 74 61 62 6c 65 73 69 7a 65 3b 20  0; j<tablesize; 
16340 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
16350 74 61 62 6c 65 5b 6a 5d 20 26 26 20 74 61 62 6c  table[j] && tabl
16360 65 5b 6a 5d 2d 3e 63 6f 6c 6c 69 64 65 20 29 7b  e[j]->collide ){
16370 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
16380 74 61 62 6c 65 5b 6b 5d 20 29 20 6b 2b 2b 3b 0a  table[k] ) k++;.
16390 20 20 20 20 20 20 20 20 74 61 62 6c 65 5b 6b 5d          table[k]
163a0 20 3d 20 74 61 62 6c 65 5b 6a 5d 2d 3e 63 6f 6c   = table[j]->col
163b0 6c 69 64 65 3b 0a 20 20 20 20 20 20 20 20 63 6f  lide;.        co
163c0 6c 6c 69 64 65 5b 6a 5d 20 3d 20 6b 3b 0a 20 20  llide[j] = k;.  
163d0 20 20 20 20 20 20 74 61 62 6c 65 5b 6a 5d 2d 3e        table[j]->
163e0 63 6f 6c 6c 69 64 65 20 3d 20 30 3b 0a 20 20 20  collide = 0;.   
163f0 20 20 20 20 20 69 66 28 20 6b 3c 6a 20 29 20 6a       if( k<j ) j
16400 20 3d 20 6b 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   = k-1;.      }.
16410 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72      }..    /* Pr
16420 69 6e 74 20 74 68 65 20 68 61 73 68 20 74 61 62  int the hash tab
16430 6c 65 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74  le */.    fprint
16440 66 28 6f 75 74 2c 22 2f 2a 20 53 74 61 74 65 20  f(out,"/* State 
16450 25 64 20 2a 2f 5c 6e 22 2c 73 74 70 2d 3e 69 6e  %d */\n",stp->in
16460 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
16470 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 74      for(j=0; j<t
16480 61 62 6c 65 73 69 7a 65 3b 20 6a 2b 2b 29 7b 0a  ablesize; j++){.
16490 20 20 20 20 20 20 69 66 28 20 74 61 62 6c 65 5b        if( table[
164a0 6a 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  j]==0 ){.       
164b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 0a 20 20   fprintf(out,.  
164c0 20 20 20 20 20 20 20 20 22 20 20 7b 59 59 4e 4f          "  {YYNO
164d0 43 4f 44 45 2c 30 2c 30 7d 2c 20 2f 2a 20 55 6e  CODE,0,0}, /* Un
164e0 75 73 65 64 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20  used */\n");.   
164f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16500 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
16510 20 7b 25 34 64 2c 25 34 64 2c 20 22 2c 0a 20 20   {%4d,%4d, ",.  
16520 20 20 20 20 20 20 20 20 74 61 62 6c 65 5b 6a 5d          table[j]
16530 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 0a 20 20 20  ->sp->index,.   
16540 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 5f 61         compute_a
16550 63 74 69 6f 6e 28 6c 65 6d 70 2c 74 61 62 6c 65  ction(lemp,table
16560 5b 6a 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 69  [j]));.        i
16570 66 28 20 63 6f 6c 6c 69 64 65 5b 6a 5d 3e 3d 30  f( collide[j]>=0
16580 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
16590 72 69 6e 74 66 28 6f 75 74 2c 22 26 79 79 41 63  rintf(out,"&yyAc
165a0 74 69 6f 6e 54 61 62 6c 65 5b 25 34 64 5d 20 7d  tionTable[%4d] }
165b0 2c 20 2f 2a 20 22 2c 0a 20 20 20 20 20 20 20 20  , /* ",.        
165c0 20 20 20 20 63 6f 6c 6c 69 64 65 5b 6a 5d 20 2b      collide[j] +
165d0 20 74 61 62 6c 65 63 6e 74 29 3b 0a 20 20 20 20   tablecnt);.    
165e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
165f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
16600 2c 22 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ,"0             
16610 20 20 20 20 20 20 20 7d 2c 20 2f 2a 20 22 29 3b         }, /* ");
16620 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16630 20 20 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 74     PrintAction(t
16640 61 62 6c 65 5b 6a 5d 2c 6f 75 74 2c 32 32 29 3b  able[j],out,22);
16650 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
16660 28 6f 75 74 2c 22 20 2a 2f 5c 6e 22 29 3b 20 0a  (out," */\n"); .
16670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 69        }.      li
16680 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  neno++;.    }.. 
16690 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
166a0 20 74 61 62 6c 65 20 63 6f 75 6e 74 20 2a 2f 0a   table count */.
166b0 20 20 20 20 74 61 62 6c 65 63 6e 74 20 2b 3d 20      tablecnt += 
166c0 74 61 62 6c 65 73 69 7a 65 3b 0a 20 20 7d 0a 20  tablesize;.  }. 
166d0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
166e0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
166f0 6e 65 6e 6f 29 3b 0a 20 20 6c 65 6d 70 2d 3e 74  neno);.  lemp->t
16700 61 62 6c 65 73 69 7a 65 20 3d 20 74 61 62 6c 65  ablesize = table
16710 63 6e 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  cnt;..  /* Gener
16720 61 74 65 20 74 68 65 20 73 74 61 74 65 20 74 61  ate the state ta
16730 62 6c 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  ble.  **.  ** Ea
16740 63 68 20 65 6e 74 72 79 20 69 73 20 61 6e 20 65  ch entry is an e
16750 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f  lement of the fo
16760 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
16770 65 3a 0a 20 20 2a 2a 20 20 20 20 73 74 72 75 63  e:.  **    struc
16780 74 20 79 79 53 74 61 74 65 45 6e 74 72 79 20 7b  t yyStateEntry {
16790 0a 20 20 2a 2a 20 20 20 20 20 20 73 74 72 75 63  .  **      struc
167a0 74 20 79 79 41 63 74 69 6f 6e 45 6e 74 72 79 20  t yyActionEntry 
167b0 2a 68 61 73 68 74 62 6c 3b 0a 20 20 2a 2a 20 20  *hashtbl;.  **  
167c0 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20      int mask;.  
167d0 2a 2a 20 20 20 20 20 20 59 59 41 43 54 49 4f 4e  **      YYACTION
167e0 54 59 50 45 20 61 63 74 69 6f 6e 44 65 66 61 75  TYPE actionDefau
167f0 6c 74 3b 0a 20 20 2a 2a 20 20 20 20 7d 0a 20 20  lt;.  **    }.  
16800 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
16810 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
16820 2b 29 7b 0a 20 20 20 20 69 6e 74 20 74 61 62 6c  +){.    int tabl
16830 65 73 69 7a 65 3b 0a 20 20 20 20 73 74 70 20 3d  esize;.    stp =
16840 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
16850 3b 0a 20 20 20 20 74 61 62 6c 65 73 69 7a 65 20  ;.    tablesize 
16860 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 1;.    while( 
16870 74 61 62 6c 65 73 69 7a 65 3c 73 74 70 2d 3e 6e  tablesize<stp->n
16880 61 63 74 69 6f 6e 20 29 20 74 61 62 6c 65 73 69  action ) tablesi
16890 7a 65 20 2b 3d 20 74 61 62 6c 65 73 69 7a 65 3b  ze += tablesize;
168a0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
168b0 2c 22 20 20 7b 20 26 79 79 41 63 74 69 6f 6e 54  ,"  { &yyActionT
168c0 61 62 6c 65 5b 25 64 5d 2c 20 25 64 2c 20 25 64  able[%d], %d, %d
168d0 7d 2c 5c 6e 22 2c 0a 20 20 20 20 20 20 73 74 70  },\n",.      stp
168e0 2d 3e 74 61 62 73 74 61 72 74 2c 0a 20 20 20 20  ->tabstart,.    
168f0 20 20 74 61 62 6c 65 73 69 7a 65 20 2d 20 31 2c    tablesize - 1,
16900 0a 20 20 20 20 20 20 73 74 70 2d 3e 74 61 62 64  .      stp->tabd
16910 66 6c 74 61 63 74 29 3b 20 6c 69 6e 65 6e 6f 2b  fltact); lineno+
16920 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
16930 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
16940 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
16950 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
16960 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
16970 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
16980 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62  me of every symb
16990 6f 6c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ol */.  for(i=0;
169a0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
169b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69  ; i++){.    spri
169c0 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22  ntf(line,"\"%s\"
169d0 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ,",lemp->symbols
169e0 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
169f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
16a00 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20  -15s",line);.   
16a10 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20 29 7b   if( (i&3)==3 ){
16a20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
16a30 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
16a40 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33 29 21    }.  if( (i&3)!
16a50 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75  =0 ){ fprintf(ou
16a60 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  t,"\n"); lineno+
16a70 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  +; }.  tplt_xfer
16a80 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
16a90 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
16aa0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
16ab0 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
16ac0 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d  every time a sym
16ad0 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72  bol is popped fr
16ae0 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63  om.  ** the stac
16af0 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  k while processi
16b00 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69  ng errors or whi
16b10 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68  le destroying th
16b20 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20  e parser. .  ** 
16b30 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
16b40 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25 64   generate the %d
16b50 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e  estructor action
16b60 73 29 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  s) */.  if( lemp
16b70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20  ->tokendest ){. 
16b80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
16b90 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
16ba0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
16bb0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
16bc0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
16bd0 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c       if( sp==0 |
16be0 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d  | sp->type!=TERM
16bf0 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  INAL ) continue;
16c00 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
16c10 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
16c20 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20  \n",sp->index); 
16c30 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
16c40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
16c50 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20  emp->nsymbol && 
16c60 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
16c70 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
16c80 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  ; i++);.    if( 
16c90 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  i<lemp->nsymbol 
16ca0 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65  ){.      emit_de
16cb0 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
16cc0 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  t,lemp->symbols[
16cd0 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  i],lemp,&lineno)
16ce0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
16cf0 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
16d00 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
16d10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
16d20 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
16d30 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
16d40 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
16d50 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
16d60 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
16d70 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65  p==0 || sp->type
16d80 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70  ==TERMINAL || sp
16d90 2d 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20  ->destructor==0 
16da0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
16db0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
16dc0 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d   case %d:\n",sp-
16dd0 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
16de0 2b 3b 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74  +;.    emit_dest
16df0 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c  ructor_code(out,
16e00 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
16e10 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
16e20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
16e30 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
16e40 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
16e50 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
16e60 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
16e70 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
16e80 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
16e90 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
16ea0 65 76 65 72 20 74 68 65 20 70 61 72 73 65 72 20  ever the parser 
16eb0 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20  stack overflows 
16ec0 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
16ed0 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f  out,lemp,lemp->o
16ee0 76 65 72 66 6c 6f 77 2c 6c 65 6d 70 2d 3e 6f 76  verflow,lemp->ov
16ef0 65 72 66 6c 6f 77 6c 6e 2c 26 6c 69 6e 65 6e 6f  erflowln,&lineno
16f00 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
16f10 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
16f20 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
16f30 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61   Generate the ta
16f40 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f  ble of rule info
16f50 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20  rmation .  **.  
16f60 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f  ** Note: This co
16f70 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
16f80 65 20 66 61 63 74 20 74 68 61 74 20 72 75 6c 65  e fact that rule
16f90 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a  s are number.  *
16fa0 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20 62  * sequentually b
16fb0 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e  eginning with 0.
16fc0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  .  */.  for(rp=l
16fd0 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
16fe0 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
16ff0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
17000 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72  { %d, %d },\n",r
17010 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70  p->lhs->index,rp
17020 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b  ->nrhs); lineno+
17030 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
17040 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
17050 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
17060 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
17070 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 69  de which executi
17080 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20 52  on during each R
17090 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  EDUCE action */.
170a0 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
170b0 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
170c0 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e  next){.    fprin
170d0 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61  tf(out,"      ca
170e0 73 65 20 25 64 3a 5c 6e 22 2c 72 70 2d 3e 69 6e  se %d:\n",rp->in
170f0 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
17100 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17110 22 20 20 20 20 20 20 20 20 59 59 54 52 41 43 45  "        YYTRACE
17120 28 5c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c  (\"%s ::=",rp->l
17130 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66  hs->name);.    f
17140 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
17150 68 73 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74 66  hs; i++) fprintf
17160 28 6f 75 74 2c 22 20 25 73 22 2c 72 70 2d 3e 72  (out," %s",rp->r
17170 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  hs[i]->name);.  
17180 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
17190 22 29 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ")\n"); lineno++
171a0 3b 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65 28  ;.    emit_code(
171b0 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e  out,rp,lemp,&lin
171c0 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  eno);.    fprint
171d0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62  f(out,"        b
171e0 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
171f0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
17200 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
17210 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
17220 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17230 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
17240 74 65 73 20 69 66 20 61 20 70 61 72 73 65 20 66  tes if a parse f
17250 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  ails */.  tplt_p
17260 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
17270 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 6c 65 6d 70  mp->failure,lemp
17280 2d 3e 66 61 69 6c 75 72 65 6c 6e 2c 26 6c 69 6e  ->failureln,&lin
17290 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
172a0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
172b0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
172c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
172d0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
172e0 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78 20 65   when a syntax e
172f0 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20  rror occurs */. 
17300 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
17310 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72  lemp,lemp->error
17320 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 6c 6e 2c 26  ,lemp->errorln,&
17330 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
17340 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
17350 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
17360 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17370 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
17380 74 65 73 20 77 68 65 6e 20 74 68 65 20 70 61 72  tes when the par
17390 73 65 72 20 61 63 63 65 70 74 73 20 69 74 73 20  ser accepts its 
173a0 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f  input */.  tplt_
173b0 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
173c0 65 6d 70 2d 3e 61 63 63 65 70 74 2c 6c 65 6d 70  emp->accept,lemp
173d0 2d 3e 61 63 63 65 70 74 6c 6e 2c 26 6c 69 6e 65  ->acceptln,&line
173e0 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
173f0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
17400 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
17410 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64  /* Append any ad
17420 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20  dition code the 
17430 75 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a  user desires */.
17440 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
17450 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72  ,lemp,lemp->extr
17460 61 63 6f 64 65 2c 6c 65 6d 70 2d 3e 65 78 74 72  acode,lemp->extr
17470 61 63 6f 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29  acodeln,&lineno)
17480 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  ;..  fclose(in);
17490 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a  .  fclose(out);.
174a0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
174b0 47 65 6e 65 72 61 74 65 20 61 20 68 65 61 64 65  Generate a heade
174c0 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  r file for the p
174d0 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65  arser */.void Re
174e0 70 6f 72 74 48 65 61 64 65 72 28 6c 65 6d 70 29  portHeader(lemp)
174f0 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
17500 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f  emp;.{.  FILE *o
17510 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ut, *in;.  char 
17520 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61 72 20  *prefix;.  char 
17530 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  line[LINESIZE];.
17540 20 20 63 68 61 72 20 70 61 74 74 65 72 6e 5b 4c    char pattern[L
17550 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  INESIZE];.  int 
17560 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  i;..  if( lemp->
17570 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72  tokenprefix ) pr
17580 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b  efix = lemp->tok
17590 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c 73 65  enprefix;.  else
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175b0 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b      prefix = "";
175c0 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65  .  in = file_ope
175d0 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 22 29  n(lemp,".h","r")
175e0 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20  ;.  if( in ){.  
175f0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d    for(i=1; i<lem
17600 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20  p->nterminal && 
17610 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53  fgets(line,LINES
17620 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20  IZE,in); i++){. 
17630 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 61 74       sprintf(pat
17640 74 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73  tern,"#define %s
17650 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65  %-30s %2d\n",pre
17660 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  fix,lemp->symbol
17670 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20  s[i]->name,i);. 
17680 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
17690 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20 29 20  line,pattern) ) 
176a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
176b0 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
176c0 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74   if( i==lemp->nt
176d0 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20  erminal ){.     
176e0 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e   /* No change in
176f0 20 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27   the file.  Don'
17700 74 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f  t rewrite it. */
17710 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
17720 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d     }.  }.  out =
17730 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
17740 22 2e 68 22 2c 22 77 22 29 3b 0a 20 20 69 66 28  ".h","w");.  if(
17750 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28   out ){.    for(
17760 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
17770 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
17780 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17790 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
177a0 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %2d\n",prefix,l
177b0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
177c0 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a  >name,i);.    }.
177d0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
177e0 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b    .  }.  return;
177f0 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68  .}../* Reduce th
17800 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63  e size of the ac
17810 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20  tion tables, if 
17820 70 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b  possible, by mak
17830 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65  ing use.** of de
17840 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  faults..**.** In
17850 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 69   this version, i
17860 66 20 61 6c 6c 20 52 45 44 55 43 45 20 61 63 74  f all REDUCE act
17870 69 6f 6e 73 20 75 73 65 20 74 68 65 20 73 61 6d  ions use the sam
17880 65 20 72 75 6c 65 2c 20 6d 61 6b 65 0a 2a 2a 20  e rule, make.** 
17890 74 68 65 6d 20 74 68 65 20 64 65 66 61 75 6c 74  them the default
178a0 2e 20 20 4f 6e 6c 79 20 64 65 66 61 75 6c 74 20  .  Only default 
178b0 74 68 65 6d 20 69 66 20 74 68 65 72 65 20 61 72  them if there ar
178c0 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 2e  e more than one.
178d0 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73  .*/.void Compres
178e0 73 54 61 62 6c 65 73 28 6c 65 6d 70 29 0a 73 74  sTables(lemp).st
178f0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
17900 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ;.{.  struct sta
17910 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
17920 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
17930 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
17940 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
17950 63 6e 74 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  cnt;..  for(i=0;
17960 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
17970 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
17980 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
17990 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ;..    /* Find t
179a0 68 65 20 66 69 72 73 74 20 52 45 44 55 43 45 20  he first REDUCE 
179b0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 66 6f  action */.    fo
179c0 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
179d0 20 26 26 20 61 70 2d 3e 74 79 70 65 21 3d 52 45   && ap->type!=RE
179e0 44 55 43 45 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  DUCE; ap=ap->nex
179f0 74 29 3b 0a 20 20 20 20 69 66 28 20 61 70 3d 3d  t);.    if( ap==
17a00 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  0 ) continue;.. 
17a10 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
17a20 68 65 20 72 75 6c 65 20 75 73 65 64 20 2a 2f 0a  he rule used */.
17a30 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72      rp = ap->x.r
17a40 70 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  p;..    /* See i
17a50 66 20 61 6c 6c 20 6f 74 68 65 72 20 52 45 44 55  f all other REDU
17a60 43 45 20 61 63 69 74 6f 6e 73 20 75 73 65 20 74  CE acitons use t
17a70 68 65 20 73 61 6d 65 20 72 75 6c 65 20 2a 2f 0a  he same rule */.
17a80 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
17a90 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78 74   for(ap=ap->next
17aa0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
17ab0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
17ac0 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29  ->type==REDUCE )
17ad0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  {.        if( ap
17ae0 2d 3e 78 2e 72 70 21 3d 72 70 20 29 20 62 72 65  ->x.rp!=rp ) bre
17af0 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b  ak;.        cnt+
17b00 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
17b10 0a 20 20 20 20 69 66 28 20 61 70 20 7c 7c 20 63  .    if( ap || c
17b20 6e 74 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65  nt==1 ) continue
17b30 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  ;..    /* Combin
17b40 65 20 61 6c 6c 20 52 45 44 55 43 45 20 61 63 74  e all REDUCE act
17b50 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  ions into a sing
17b60 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20  le default */.  
17b70 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
17b80 3b 20 61 70 20 26 26 20 61 70 2d 3e 74 79 70 65  ; ap && ap->type
17b90 21 3d 52 45 44 55 43 45 3b 20 61 70 3d 61 70 2d  !=REDUCE; ap=ap-
17ba0 3e 6e 65 78 74 29 3b 0a 20 20 20 20 61 73 73 65  >next);.    asse
17bb0 72 74 28 20 61 70 20 29 3b 0a 20 20 20 20 61 70  rt( ap );.    ap
17bc0 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  ->sp = Symbol_ne
17bd0 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a  w("{default}");.
17be0 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e      for(ap=ap->n
17bf0 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  ext; ap; ap=ap->
17c00 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
17c10 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
17c20 45 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20 4e  E ) ap->type = N
17c30 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  OT_USED;.    }. 
17c40 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74     stp->ap = Act
17c50 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70  ion_sort(stp->ap
17c60 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  );.  }.}./******
17c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
17c80 20 74 68 65 20 66 69 6c 65 20 22 73 65 74 2e 63   the file "set.c
17c90 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
17ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17cb0 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65  ******/./*.** Se
17cc0 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72  t manipulation r
17cd0 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68 65 20  outines for the 
17ce0 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
17cf0 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74  erator..*/..stat
17d00 69 63 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b  ic int size = 0;
17d10 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 73 65 74  ../* Set the set
17d20 20 73 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65   size */.void Se
17d30 74 53 69 7a 65 28 6e 29 0a 69 6e 74 20 6e 3b 0a  tSize(n).int n;.
17d40 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a  {.  size = n+1;.
17d50 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  }../* Allocate a
17d60 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63 68 61 72   new set */.char
17d70 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20 20 63 68   *SetNew(){.  ch
17d80 61 72 20 2a 73 3b 0a 20 20 69 6e 74 20 69 3b 0a  ar *s;.  int i;.
17d90 20 20 73 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c    s = (char*)mal
17da0 6c 6f 63 28 20 73 69 7a 65 20 29 3b 0a 20 20 69  loc( size );.  i
17db0 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20 65  f( s==0 ){.    e
17dc0 78 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72  xtern void memor
17dd0 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 6d  y_error();.    m
17de0 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20  emory_error();. 
17df0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
17e00 73 69 7a 65 3b 20 69 2b 2b 29 20 73 5b 69 5d 20  size; i++) s[i] 
17e10 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b  = 0;.  return s;
17e20 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  .}../* Deallocat
17e30 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20  e a set */.void 
17e40 53 65 74 46 72 65 65 28 73 29 0a 63 68 61 72 20  SetFree(s).char 
17e50 2a 73 3b 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b  *s;.{.  free(s);
17e60 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77  .}../* Add a new
17e70 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
17e80 73 65 74 2e 20 20 52 65 74 75 72 6e 20 54 52 55  set.  Return TRU
17e90 45 20 69 66 20 74 68 65 20 65 6c 65 6d 65 6e 74  E if the element
17ea0 20 77 61 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e   was added.** an
17eb0 64 20 46 41 4c 53 45 20 69 66 20 69 74 20 77 61  d FALSE if it wa
17ec0 73 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 2e  s already there.
17ed0 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 73   */.int SetAdd(s
17ee0 2c 65 29 0a 63 68 61 72 20 2a 73 3b 0a 69 6e 74  ,e).char *s;.int
17ef0 20 65 3b 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a   e;.{.  int rv;.
17f00 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73    rv = s[e];.  s
17f10 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  [e] = 1;.  retur
17f20 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  n !rv;.}../* Add
17f30 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
17f40 66 20 73 32 20 74 6f 20 73 31 2e 20 20 52 65 74  f s2 to s1.  Ret
17f50 75 72 6e 20 54 52 55 45 20 69 66 20 73 31 20 63  urn TRUE if s1 c
17f60 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53  hanges. */.int S
17f70 65 74 55 6e 69 6f 6e 28 73 31 2c 73 32 29 0a 63  etUnion(s1,s2).c
17f80 68 61 72 20 2a 73 31 3b 0a 63 68 61 72 20 2a 73  har *s1;.char *s
17f90 32 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72  2;.{.  int i, pr
17fa0 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f 67 72 65  ogress;.  progre
17fb0 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ss = 0;.  for(i=
17fc0 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b  0; i<size; i++){
17fd0 0a 20 20 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d  .    if( s2[i]==
17fe0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
17ff0 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29    if( s1[i]==0 )
18000 7b 0a 20 20 20 20 20 20 70 72 6f 67 72 65 73 73  {.      progress
18010 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 31 5b 69   = 1;.      s1[i
18020 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 1;.    }.  }
18030 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 67 72 65  .  return progre
18040 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ss;.}./*********
18050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
18060 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62  om the file "tab
18070 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le.c" **********
18080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18090 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  **/./*.** All co
180a0 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
180b0 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74  has been automat
180c0 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
180d0 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69  .** from a speci
180e0 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  fication in the 
180f0 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
18100 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a       "table.q".*
18110 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69 61  * by the associa
18120 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65 20  tive array code 
18130 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d  building program
18140 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20   "aagen"..** Do 
18150 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66 69  not edit this fi
18160 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64  le!  Instead, ed
18170 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63 61  it the specifica
18180 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  tion.** file, th
18190 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a  en rerun aagen..
181a0 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
181b0 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62  r processing tab
181c0 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  les in the LEMON
181d0 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
181e0 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20 69  r..*/..PRIVATE i
181f0 6e 74 20 73 74 72 68 61 73 68 28 78 29 0a 63 68  nt strhash(x).ch
18200 61 72 20 2a 78 3b 0a 7b 0a 20 20 69 6e 74 20 68  ar *x;.{.  int h
18210 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = 0;.  while( *
18220 78 29 20 68 20 3d 20 68 2a 31 33 20 2b 20 2a 28  x) h = h*13 + *(
18230 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20 68  x++);.  return h
18240 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69  ;.}../* Works li
18250 6b 65 20 73 74 72 64 75 70 2c 20 73 6f 72 74 20  ke strdup, sort 
18260 6f 66 2e 20 20 53 61 76 65 20 61 20 73 74 72 69  of.  Save a stri
18270 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d  ng in malloced m
18280 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20 6b 65  emory, but.** ke
18290 65 70 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20  ep strings in a 
182a0 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68  table so that th
182b0 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 69 73  e same string is
182c0 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20   not in more.** 
182d0 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65 2e 0a  than one place..
182e0 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65  */.char *Strsafe
182f0 28 79 29 0a 63 68 61 72 20 2a 79 3b 0a 7b 0a 20  (y).char *y;.{. 
18300 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 7a 20 3d   char *z;..  z =
18310 20 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29   Strsafe_find(y)
18320 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20  ;.  if( z==0 && 
18330 28 7a 3d 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65  (z=malloc( strle
18340 6e 28 79 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a  n(y)+1 ))!=0 ){.
18350 20 20 20 20 73 74 72 63 70 79 28 7a 2c 79 29 3b      strcpy(z,y);
18360 0a 20 20 20 20 53 74 72 73 61 66 65 5f 69 6e 73  .    Strsafe_ins
18370 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65  ert(z);.  }.  Me
18380 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20  moryCheck(z);.  
18390 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20  return z;.}../* 
183a0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
183b0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
183c0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
183d0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
183e0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
183f0 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a  f type "x1"..*/.
18400 73 74 72 75 63 74 20 73 5f 78 31 20 7b 0a 20 20  struct s_x1 {.  
18410 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
18420 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
18430 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
18440 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18460 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
18470 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
18480 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
18490 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
184b0 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
184c0 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
184d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
184e0 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
184f0 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
18500 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
18510 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
18520 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
18530 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
18540 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x1node **ht;  /
18550 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
18560 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
18570 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
18580 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
18590 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
185a0 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
185b0 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
185c0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
185d0 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79  type "x1"..*/.ty
185e0 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
185f0 31 6e 6f 64 65 20 7b 0a 20 20 63 68 61 72 20 2a  1node {.  char *
18600 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
18610 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
18620 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ta */.  struct s
18630 5f 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x1node *next;  
18640 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
18650 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
18660 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
18670 78 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x1node **from;  
18680 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
18690 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f   */.} x1node;../
186a0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
186b0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
186c0 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
186d0 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
186e0 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
186f0 63 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f  ct s_x1 *x1a;../
18700 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
18710 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
18720 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61  ay */.void Strsa
18730 66 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28  fe_init(){.  if(
18740 20 78 31 61 20 29 20 72 65 74 75 72 6e 3b 0a 20   x1a ) return;. 
18750 20 78 31 61 20 3d 20 28 73 74 72 75 63 74 20 73   x1a = (struct s
18760 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  _x1*)malloc( siz
18770 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 31 29  eof(struct s_x1)
18780 20 29 3b 0a 20 20 69 66 28 20 78 31 61 20 29 7b   );.  if( x1a ){
18790 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d  .    x1a->size =
187a0 20 31 30 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e   1024;.    x1a->
187b0 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  count = 0;.    x
187c0 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64  1a->tbl = (x1nod
187d0 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20  e*)malloc( .    
187e0 20 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65    (sizeof(x1node
187f0 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64  ) + sizeof(x1nod
18800 65 2a 29 29 2a 31 30 32 34 20 29 3b 0a 20 20 20  e*))*1024 );.   
18810 20 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30   if( x1a->tbl==0
18820 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
18830 31 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20 3d  1a);.      x1a =
18840 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
18850 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
18860 20 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e    x1a->ht = (x1n
18870 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c  ode**)&(x1a->tbl
18880 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20 66  [1024]);.      f
18890 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20  or(i=0; i<1024; 
188a0 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20  i++) x1a->ht[i] 
188b0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
188c0 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
188d0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
188e0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
188f0 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
18900 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
18910 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
18920 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
18930 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74  ritten */.int St
18940 72 73 61 66 65 5f 69 6e 73 65 72 74 28 64 61 74  rsafe_insert(dat
18950 61 29 0a 63 68 61 72 20 2a 64 61 74 61 3b 0a 7b  a).char *data;.{
18960 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x1node *np;. 
18970 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68   int h;.  int ph
18980 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20  ;..  if( x1a==0 
18990 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
189a0 20 3d 20 73 74 72 68 61 73 68 28 64 61 74 61 29   = strhash(data)
189b0 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31  ;.  h = ph & (x1
189c0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
189d0 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x1a->ht[h];. 
189e0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
189f0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
18a00 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29  >data,data)==0 )
18a10 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
18a20 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
18a30 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
18a40 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
18a50 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
18a60 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
18a70 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
18a80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18a90 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
18aa0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
18ab0 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61   x1a->count>=x1a
18ac0 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
18ad0 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
18ae0 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
18af0 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
18b00 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  ,size;.    struc
18b10 74 20 73 5f 78 31 20 61 72 72 61 79 3b 0a 20 20  t s_x1 array;.  
18b20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73    array.size = s
18b30 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a  ize = x1a->size*
18b40 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
18b50 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b  nt = x1a->count;
18b60 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
18b70 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x1node*)malloc
18b80 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28  (.      (sizeof(
18b90 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x1node) + sizeof
18ba0 28 78 31 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20  (x1node*))*size 
18bb0 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
18bc0 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
18bd0 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
18be0 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
18bf0 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
18c00 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
18c10 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d  (array.tbl[size]
18c20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
18c30 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  i<size; i++) arr
18c40 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
18c50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61    for(i=0; i<x1a
18c60 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
18c70 20 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64       x1node *old
18c80 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
18c90 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d    oldnp = &(x1a-
18ca0 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
18cb0 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e  h = strhash(oldn
18cc0 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65  p->data) & (size
18cd0 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
18ce0 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
18cf0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
18d00 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
18d10 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
18d20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
18d30 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
18d40 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
18d50 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
18d60 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
18d70 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
18d80 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
18d90 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
18da0 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
18db0 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
18dc0 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x1a->tbl);.    *
18dd0 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x1a = array;.  }
18de0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
18df0 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
18e00 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69   = ph & (x1a->si
18e10 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
18e20 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f  x1a->tbl[x1a->co
18e30 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64  unt++]);.  np->d
18e40 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
18e50 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x1a->ht[h] ) x
18e60 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  1a->ht[h]->from 
18e70 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
18e80 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d   np->next = x1a-
18e90 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68  >ht[h];.  x1a->h
18ea0 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
18eb0 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68  >from = &(x1a->h
18ec0 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
18ed0 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
18ee0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
18ef0 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
18f00 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
18f10 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
18f20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
18f30 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66 69  char *Strsafe_fi
18f40 6e 64 28 6b 65 79 29 0a 63 68 61 72 20 2a 6b 65  nd(key).char *ke
18f50 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  y;.{.  int h;.  
18f60 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69  x1node *np;..  i
18f70 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75  f( x1a==0 ) retu
18f80 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68  rn 0;.  h = strh
18f90 61 73 68 28 6b 65 79 29 20 26 20 28 78 31 61 2d  ash(key) & (x1a-
18fa0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
18fb0 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x1a->ht[h];.  w
18fc0 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
18fd0 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64  if( strcmp(np->d
18fe0 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72  ata,key)==0 ) br
18ff0 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
19000 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
19010 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
19020 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
19030 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19040 6f 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c 20  o the (terminal 
19050 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20  or nonterminal) 
19060 73 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43  symbol "x"..** C
19070 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
19080 6f 6c 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ol if this is th
19090 65 20 66 69 72 73 74 20 74 69 6d 65 20 22 78 22  e first time "x"
190a0 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a   has been seen..
190b0 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
190c0 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 0a   *Symbol_new(x).
190d0 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 73 74 72  char *x;.{.  str
190e0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
190f0 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66  .  sp = Symbol_f
19100 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73 70  ind(x);.  if( sp
19110 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  ==0 ){.    sp = 
19120 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
19130 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
19140 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 29 20 29  struct symbol) )
19150 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63  ;.    MemoryChec
19160 6b 28 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e  k(sp);.    sp->n
19170 61 6d 65 20 3d 20 53 74 72 73 61 66 65 28 78 29  ame = Strsafe(x)
19180 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70 65 20 3d  ;.    sp->type =
19190 20 69 73 75 70 70 65 72 28 2a 78 29 20 3f 20 54   isupper(*x) ? T
191a0 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52  ERMINAL : NONTER
191b0 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72  MINAL;.    sp->r
191c0 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  ule = 0;.    sp-
191d0 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20  >prec = -1;.    
191e0 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b  sp->assoc = UNK;
191f0 0a 20 20 20 20 73 70 2d 3e 66 69 72 73 74 73 65  .    sp->firstse
19200 74 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c  t = 0;.    sp->l
19210 61 6d 62 64 61 20 3d 20 46 41 4c 53 45 3b 0a 20  ambda = FALSE;. 
19220 20 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f     sp->destructo
19230 72 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64  r = 0;.    sp->d
19240 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  atatype = 0;.   
19250 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73   Symbol_insert(s
19260 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d  p,sp->name);.  }
19270 0a 20 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a  .  return sp;.}.
19280 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
19290 73 79 6d 62 6f 6c 73 20 2a 2f 0a 69 6e 74 20 53  symbols */.int S
192a0 79 6d 62 6f 6c 63 6d 70 70 28 61 2c 62 29 0a 73  ymbolcmpp(a,b).s
192b0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61  truct symbol **a
192c0 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  ;.struct symbol 
192d0 2a 2a 62 3b 0a 7b 0a 20 20 72 65 74 75 72 6e 20  **b;.{.  return 
192e0 73 74 72 63 6d 70 28 28 2a 2a 61 29 2e 6e 61 6d  strcmp((**a).nam
192f0 65 2c 28 2a 2a 62 29 2e 6e 61 6d 65 29 3b 0a 7d  e,(**b).name);.}
19300 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
19310 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
19320 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
19330 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
19340 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
19350 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22  ray of type "x2"
19360 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 32  ..*/.struct s_x2
19370 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
19380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19390 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
193a0 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
193b0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
193c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
193d0 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
193e0 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
193f0 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
19400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19410 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
19420 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
19430 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
19440 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
19450 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
19460 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
19470 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x2node *tbl;  
19480 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
19490 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
194a0 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 68  uct s_x2node **h
194b0 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
194c0 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
194d0 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
194e0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
194f0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
19500 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
19510 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
19520 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
19530 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a  y of type "x2"..
19540 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19550 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20 73  t s_x2node {.  s
19560 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61  truct symbol *da
19570 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
19580 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
19590 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6b 65 79 3b   */.  char *key;
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195b0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
195c0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
195d0 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
195e0 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
195f0 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
19600 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
19610 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
19620 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
19630 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x2node;../* The
19640 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
19650 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
19660 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
19670 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
19680 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
19690 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c  x2 *x2a;../* All
196a0 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
196b0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
196c0 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69  .void Symbol_ini
196d0 74 28 29 7b 0a 20 20 69 66 28 20 78 32 61 20 29  t(){.  if( x2a )
196e0 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20 3d   return;.  x2a =
196f0 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29 6d   (struct s_x2*)m
19700 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
19710 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20 20  ruct s_x2) );.  
19720 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20 78  if( x2a ){.    x
19730 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a  2a->size = 128;.
19740 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3d      x2a->count =
19750 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62 6c   0;.    x2a->tbl
19760 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x2node*)mall
19770 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
19780 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x2node) + siz
19790 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 31 32  eof(x2node*))*12
197a0 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 32 61  8 );.    if( x2a
197b0 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
197c0 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20 20    free(x2a);.   
197d0 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20 20     x2a = 0;.    
197e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
197f0 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e 68   i;.      x2a->h
19800 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28  t = (x2node**)&(
19810 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a  x2a->tbl[128]);.
19820 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
19830 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e  <128; i++) x2a->
19840 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
19850 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
19860 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
19870 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
19880 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
19890 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
198a0 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
198b0 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
198c0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
198d0 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72  int Symbol_inser
198e0 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72 75  t(data,key).stru
198f0 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b  ct symbol *data;
19900 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20  .char *key;.{.  
19910 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e  x2node *np;.  in
19920 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a  t h;.  int ph;..
19930 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72    if( x2a==0 ) r
19940 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
19950 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20 20  strhash(key);.  
19960 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73  h = ph & (x2a->s
19970 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
19980 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  2a->ht[h];.  whi
19990 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
199a0 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79  ( strcmp(np->key
199b0 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,key)==0 ){.    
199c0 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
199d0 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
199e0 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
199f0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
19a00 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
19a10 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
19a20 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
19a30 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
19a40 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
19a50 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e  .  }.  if( x2a->
19a60 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65  count>=x2a->size
19a70 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
19a80 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
19a90 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
19aa0 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  .    int i,size;
19ab0 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 32  .    struct s_x2
19ac0 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
19ad0 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20  y.size = size = 
19ae0 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x2a->size*2;.   
19af0 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
19b00 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  2a->count;.    a
19b10 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e 6f  rray.tbl = (x2no
19b20 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20  de*)malloc(.    
19b30 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65    (sizeof(x2node
19b40 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64  ) + sizeof(x2nod
19b50 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20  e*))*size );.   
19b60 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
19b70 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
19b80 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
19b90 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
19ba0 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
19bb0 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x2node**)&(array
19bc0 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20  .tbl[size]);.   
19bd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
19be0 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
19bf0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
19c00 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f 75 6e  i=0; i<x2a->coun
19c10 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
19c20 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  2node *oldnp, *n
19c30 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
19c40 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 69  p = &(x2a->tbl[i
19c50 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74  ]);.      h = st
19c60 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79  rhash(oldnp->key
19c70 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
19c80 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
19c90 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
19ca0 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
19cb0 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
19cc0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
19cd0 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
19ce0 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
19cf0 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
19d00 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64  newnp->key = old
19d10 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e  np->key;.      n
19d20 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64  ewnp->data = old
19d30 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20  np->data;.      
19d40 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  newnp->from = &(
19d50 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20  array.ht[h]);.  
19d60 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20      array.ht[h] 
19d70 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20  = newnp;.    }. 
19d80 20 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62 6c     free(x2a->tbl
19d90 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61 72  );.    *x2a = ar
19da0 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e  ray;.  }.  /* In
19db0 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74  sert the new dat
19dc0 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20  a */.  h = ph & 
19dd0 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x2a->size-1);. 
19de0 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c   np = &(x2a->tbl
19df0 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b  [x2a->count++]);
19e00 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79  .  np->key = key
19e10 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
19e20 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e  ata;.  if( x2a->
19e30 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b  ht[h] ) x2a->ht[
19e40 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
19e50 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
19e60 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b  xt = x2a->ht[h];
19e70 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x2a->ht[h] = 
19e80 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
19e90 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x2a->ht[h]);.
19ea0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
19eb0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
19ec0 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
19ed0 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
19ee0 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
19ef0 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
19f00 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
19f10 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66  symbol *Symbol_f
19f20 69 6e 64 28 6b 65 79 29 0a 63 68 61 72 20 2a 6b  ind(key).char *k
19f30 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey;.{.  int h;. 
19f40 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x2node *np;..  
19f50 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74  if( x2a==0 ) ret
19f60 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72  urn 0;.  h = str
19f70 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 32 61  hash(key) & (x2a
19f80 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
19f90 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
19fa0 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
19fb0 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
19fc0 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72  key,key)==0 ) br
19fd0 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
19fe0 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
19ff0 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
1a000 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
1a010 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20 64 61  turn the n-th da
1a020 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ta.  Return NULL
1a030 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f 66 20   if n is out of 
1a040 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74  range. */.struct
1a050 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
1a060 4e 74 68 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a  Nth(n).int n;.{.
1a070 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1a080 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61  *data;.  if( x2a
1a090 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32   && n>0 && n<=x2
1a0a0 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20  a->count ){.    
1a0b0 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b  data = x2a->tbl[
1a0c0 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c  n-1].data;.  }el
1a0d0 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 30  se{.    data = 0
1a0e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
1a0f0 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  ata;.}../* Retur
1a100 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1a110 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53  e array */.int S
1a120 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a  ymbol_count().{.
1a130 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f 20 78    return x2a ? x
1a140 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d  2a->count : 0;.}
1a150 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  ../* Return an a
1a160 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
1a170 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20   to all data in 
1a180 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  the table..** Th
1a190 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
1a1a0 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
1a1b0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
1a1c0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1a1d0 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20  on.** problems, 
1a1e0 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20  or if the array 
1a1f0 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72  is empty. */.str
1a200 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d  uct symbol **Sym
1a210 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a  bol_arrayof().{.
1a220 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1a230 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69  **array;.  int i
1a240 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 32 61  ,size;.  if( x2a
1a250 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1a260 20 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 63 6f    size = x2a->co
1a270 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28  unt;.  array = (
1a280 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
1a290 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
1a2a0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29  struct symbol *)
1a2b0 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 61  *size );.  if( a
1a2c0 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  rray ){.    for(
1a2d0 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
1a2e0 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 32 61  ) array[i] = x2a
1a2f0 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20  ->tbl[i].data;. 
1a300 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61   }.  return arra
1a310 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  y;.}../* Compare
1a320 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61 74 69   two configurati
1a330 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69  ons */.int Confi
1a340 67 63 6d 70 28 61 2c 62 29 0a 73 74 72 75 63 74  gcmp(a,b).struct
1a350 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75   config *a;.stru
1a360 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a  ct config *b;.{.
1a370 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61    int x;.  x = a
1a380 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d  ->rp->index - b-
1a390 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66  >rp->index;.  if
1a3a0 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e  ( x==0 ) x = a->
1a3b0 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20  dot - b->dot;.  
1a3c0 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20  return x;.}../* 
1a3d0 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74  Compare two stat
1a3e0 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e  es */.PRIVATE in
1a3f0 74 20 73 74 61 74 65 63 6d 70 28 61 2c 62 29 0a  t statecmp(a,b).
1a400 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
1a410 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
1a420 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *b;.{.  int rc;.
1a430 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d    for(rc=0; rc==
1a440 30 20 26 26 20 61 20 26 26 20 62 3b 20 20 61 3d  0 && a && b;  a=
1a450 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b  a->bp, b=b->bp){
1a460 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d  .    rc = a->rp-
1a470 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e  >index - b->rp->
1a480 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 72  index;.    if( r
1a490 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e 64  c==0 ) rc = a->d
1a4a0 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d  ot - b->dot;.  }
1a4b0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
1a4c0 20 20 20 20 69 66 28 20 61 20 29 20 72 63 20 3d      if( a ) rc =
1a4d0 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29 20   1;.    if( b ) 
1a4e0 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  rc = -1;.  }.  r
1a4f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1a500 48 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f 0a  Hash a state */.
1a510 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74  PRIVATE int stat
1a520 65 68 61 73 68 28 61 29 0a 73 74 72 75 63 74 20  ehash(a).struct 
1a530 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20 69  config *a;.{.  i
1a540 6e 74 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28  nt h=0;.  while(
1a550 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a   a ){.    h = h*
1a560 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
1a570 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
1a580 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20      a = a->bp;. 
1a590 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d   }.  return h;.}
1a5a0 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
1a5b0 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74  new state struct
1a5c0 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73 74  ure */.struct st
1a5d0 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29  ate *State_new()
1a5e0 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
1a5f0 65 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d 20  e *new;.  new = 
1a600 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29  (struct state *)
1a610 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
1a620 74 72 75 63 74 20 73 74 61 74 65 29 20 29 3b 0a  truct state) );.
1a630 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65    MemoryCheck(ne
1a640 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  w);.  return new
1a650 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  ;.}../* There is
1a660 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1a670 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1a680 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
1a690 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65  h.** associative
1a6a0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
1a6b0 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  x3"..*/.struct s
1a6c0 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65  _x3 {.  int size
1a6d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a6e0 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
1a6f0 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73   available slots
1a700 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a720 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f  *   Must be a po
1a730 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72  wer of 2 greater
1a740 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20   than or */.    
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c        /*   equal
1a770 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63   to 1 */.  int c
1a780 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
1a790 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a7a0 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20  currently slots 
1a7b0 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75  filled */.  stru
1a7c0 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74 62 6c  ct s_x3node *tbl
1a7d0 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73  ;  /* The data s
1a7e0 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
1a7f0 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
1a800 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74  **ht;  /* Hash t
1a810 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73  able for lookups
1a820 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65   */.};../* There
1a830 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
1a840 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
1a850 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  re for every dat
1a860 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20  a element.** in 
1a870 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  an associative a
1a880 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 33  rray of type "x3
1a890 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  "..*/.typedef st
1a8a0 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 7b 0a  ruct s_x3node {.
1a8b0 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1a8c0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
1a8d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1a8e0 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  ta */.  struct c
1a8f0 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20 20 20  onfig *key;     
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a910 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74   The key */.  st
1a920 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 6e  ruct s_x3node *n
1a930 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
1a940 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
1a950 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
1a960 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 66  uct s_x3node **f
1a970 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
1a980 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e 6f  s link */.} x3no
1a990 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
1a9a0 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
1a9b0 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
1a9c0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
1a9d0 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
1a9e0 63 20 73 74 72 75 63 74 20 73 5f 78 33 20 2a 78  c struct s_x3 *x
1a9f0 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  3a;../* Allocate
1aa00 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
1aa10 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
1aa20 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b 0a 20   State_init(){. 
1aa30 20 69 66 28 20 78 33 61 20 29 20 72 65 74 75 72   if( x3a ) retur
1aa40 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74 72 75  n;.  x3a = (stru
1aa50 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28  ct s_x3*)malloc(
1aa60 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
1aa70 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20 78 33  _x3) );.  if( x3
1aa80 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73 69  a ){.    x3a->si
1aa90 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 33  ze = 128;.    x3
1aaa0 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
1aab0 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78 33    x3a->tbl = (x3
1aac0 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20  node*)malloc( . 
1aad0 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e       (sizeof(x3n
1aae0 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33  ode) + sizeof(x3
1aaf0 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20  node*))*128 );. 
1ab00 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d     if( x3a->tbl=
1ab10 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
1ab20 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33 61  (x3a);.      x3a
1ab30 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1ab40 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1ab50 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78      x3a->ht = (x
1ab60 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74  3node**)&(x3a->t
1ab70 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20  bl[128]);.      
1ab80 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20  for(i=0; i<128; 
1ab90 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20  i++) x3a->ht[i] 
1aba0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
1abb0 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
1abc0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
1abd0 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
1abe0 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
1abf0 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
1ac00 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
1ac10 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
1ac20 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74  ritten */.int St
1ac30 61 74 65 5f 69 6e 73 65 72 74 28 64 61 74 61 2c  ate_insert(data,
1ac40 6b 65 79 29 0a 73 74 72 75 63 74 20 73 74 61 74  key).struct stat
1ac50 65 20 2a 64 61 74 61 3b 0a 73 74 72 75 63 74 20  e *data;.struct 
1ac60 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20  config *key;.{. 
1ac70 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x3node *np;.  i
1ac80 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
1ac90 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
1aca0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
1acb0 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 3b   statehash(key);
1acc0 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61  .  h = ph & (x3a
1acd0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
1ace0 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
1acf0 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
1ad00 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70   if( statecmp(np
1ad10 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b  ->key,key)==0 ){
1ad20 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
1ad30 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
1ad40 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
1ad50 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
1ad60 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
1ad70 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
1ad80 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
1ad90 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1ada0 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
1adb0 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
1adc0 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d  x3a->count>=x3a-
1add0 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
1ade0 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
1adf0 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
1ae00 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
1ae10 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
1ae20 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20 20 20   s_x3 array;.   
1ae30 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
1ae40 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32  ze = x3a->size*2
1ae50 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
1ae60 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x3a->count;.
1ae70 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
1ae80 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x3node*)malloc(
1ae90 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
1aea0 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  3node) + sizeof(
1aeb0 78 33 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x3node*))*size )
1aec0 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
1aed0 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
1aee0 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
1aef0 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
1af00 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
1af10 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28  t = (x3node**)&(
1af20 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
1af30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1af40 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
1af50 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
1af60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 33 61 2d   for(i=0; i<x3a-
1af70 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
1af80 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e      x3node *oldn
1af90 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
1afa0 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33 61 2d 3e   oldnp = &(x3a->
1afb0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
1afc0 20 3d 20 73 74 61 74 65 68 61 73 68 28 6f 6c 64   = statehash(old
1afd0 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65  np->key) & (size
1afe0 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
1aff0 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
1b000 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
1b010 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
1b020 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
1b030 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
1b040 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
1b050 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
1b060 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65  .      newnp->ke
1b070 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a  y = oldnp->key;.
1b080 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
1b090 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
1b0a0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
1b0b0 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
1b0c0 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
1b0d0 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
1b0e0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
1b0f0 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  3a->tbl);.    *x
1b100 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  3a = array;.  }.
1b110 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
1b120 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
1b130 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a  = ph & (x3a->siz
1b140 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
1b150 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75  3a->tbl[x3a->cou
1b160 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65  nt++]);.  np->ke
1b170 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64  y = key;.  np->d
1b180 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
1b190 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x3a->ht[h] ) x
1b1a0 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  3a->ht[h]->from 
1b1b0 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
1b1c0 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d   np->next = x3a-
1b1d0 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68  >ht[h];.  x3a->h
1b1e0 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
1b1f0 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68  >from = &(x3a->h
1b200 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
1b210 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
1b220 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
1b230 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
1b240 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
1b250 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
1b260 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
1b270 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74  struct state *St
1b280 61 74 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74  ate_find(key).st
1b290 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
1b2a0 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ;.{.  int h;.  x
1b2b0 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  3node *np;..  if
1b2c0 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x3a==0 ) retur
1b2d0 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61 74 65  n 0;.  h = state
1b2e0 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 33 61  hash(key) & (x3a
1b2f0 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
1b300 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
1b310 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
1b320 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70   if( statecmp(np
1b330 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20  ->key,key)==0 ) 
1b340 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
1b350 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
1b360 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
1b370 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
1b380 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20  Return an array 
1b390 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  of pointers to a
1b3a0 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  ll data in the t
1b3b0 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72  able..** The arr
1b3c0 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ay is obtained f
1b3d0 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74  rom malloc.  Ret
1b3e0 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f  urn NULL if memo
1b3f0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a  ry allocation.**
1b400 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66   problems, or if
1b410 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65 6d   the array is em
1b420 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  pty. */.struct s
1b430 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72  tate **State_arr
1b440 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63  ayof().{.  struc
1b450 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61 79 3b  t state **array;
1b460 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20  .  int i,size;. 
1b470 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65   if( x3a==0 ) re
1b480 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d  turn 0;.  size =
1b490 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61   x3a->count;.  a
1b4a0 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73  rray = (struct s
1b4b0 74 61 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20  tate **)malloc( 
1b4c0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74  sizeof(struct st
1b4d0 61 74 65 20 2a 29 2a 73 69 7a 65 20 29 3b 0a 20  ate *)*size );. 
1b4e0 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20   if( array ){.  
1b4f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1b500 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d  e; i++) array[i]
1b510 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64   = x3a->tbl[i].d
1b520 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ata;.  }.  retur
1b530 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48  n array;.}../* H
1b540 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72 61 74  ash a configurat
1b550 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 69  ion */.PRIVATE i
1b560 6e 74 20 63 6f 6e 66 69 67 68 61 73 68 28 61 29  nt confighash(a)
1b570 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1b580 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a  a;.{.  int h=0;.
1b590 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d    h = h*571 + a-
1b5a0 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20  >rp->index*37 + 
1b5b0 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e  a->dot;.  return
1b5c0 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20   h;.}../* There 
1b5d0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
1b5e0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1b5f0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
1b600 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
1b610 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
1b620 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x4"..*/.struct
1b630 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73 69   s_x4 {.  int si
1b640 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1b650 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1b660 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
1b670 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
1b6a0 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
1b6b0 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6d0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
1b6e0 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
1b6f0 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
1b700 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b710 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
1b720 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
1b730 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74  ruct s_x4node *t
1b740 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
1b750 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
1b760 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
1b770 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
1b780 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
1b790 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
1b7a0 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1b7b0 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
1b7c0 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
1b7d0 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
1b7e0 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
1b7f0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
1b800 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x4"..*/.typedef 
1b810 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
1b820 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
1b830 67 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  g *data;        
1b840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b850 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63   data */.  struc
1b860 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74  t s_x4node *next
1b870 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
1b880 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
1b890 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
1b8a0 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x4node **from
1b8b0 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
1b8c0 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b  ink */.} x4node;
1b8d0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1b8e0 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
1b8f0 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
1b900 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
1b910 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
1b920 74 72 75 63 74 20 73 5f 78 34 20 2a 78 34 61 3b  truct s_x4 *x4a;
1b930 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
1b940 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
1b950 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f  array */.void Co
1b960 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29  nfigtable_init()
1b970 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20 72 65  {.  if( x4a ) re
1b980 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28 73  turn;.  x4a = (s
1b990 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c 6c  truct s_x4*)mall
1b9a0 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
1b9b0 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69 66 28  t s_x4) );.  if(
1b9c0 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34 61 2d   x4a ){.    x4a-
1b9d0 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20 20  >size = 64;.    
1b9e0 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x4a->count = 0;.
1b9f0 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20 28      x4a->tbl = (
1ba00 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20  x4node*)malloc( 
1ba10 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
1ba20 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  4node) + sizeof(
1ba30 78 34 6e 6f 64 65 2a 29 29 2a 36 34 20 29 3b 0a  x4node*))*64 );.
1ba40 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c      if( x4a->tbl
1ba50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
1ba60 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34  e(x4a);.      x4
1ba70 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
1ba80 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1ba90 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28       x4a->ht = (
1baa0 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e  x4node**)&(x4a->
1bab0 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20  tbl[64]);.      
1bac0 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69  for(i=0; i<64; i
1bad0 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x4a->ht[i] =
1bae0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
1baf0 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
1bb00 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
1bb10 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
1bb20 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
1bb30 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
1bb40 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
1bb50 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
1bb60 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e  itten */.int Con
1bb70 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
1bb80 64 61 74 61 29 0a 73 74 72 75 63 74 20 63 6f 6e  data).struct con
1bb90 66 69 67 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78  fig *data;.{.  x
1bba0 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74  4node *np;.  int
1bbb0 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20   h;.  int ph;.. 
1bbc0 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65   if( x4a==0 ) re
1bbd0 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63  turn 0;.  ph = c
1bbe0 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61 29 3b  onfighash(data);
1bbf0 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 34 61  .  h = ph & (x4a
1bc00 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
1bc10 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x4a->ht[h];.  
1bc20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
1bc30 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 6e   if( Configcmp(n
1bc40 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30  p->data,data)==0
1bc50 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
1bc60 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
1bc70 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
1bc80 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
1bc90 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
1bca0 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
1bcb0 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
1bcc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1bcd0 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
1bce0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
1bcf0 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x4a->count>=x
1bd00 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  4a->size ){.    
1bd10 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
1bd20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
1bd30 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
1bd40 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72   i,size;.    str
1bd50 75 63 74 20 73 5f 78 34 20 61 72 72 61 79 3b 0a  uct s_x4 array;.
1bd60 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d      array.size =
1bd70 20 73 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a   size = x4a->siz
1bd80 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
1bd90 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e  ount = x4a->coun
1bda0 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
1bdb0 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x4node*)mall
1bdc0 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f  oc(.      (sizeo
1bdd0 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x4node) + size
1bde0 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 73 69 7a  of(x4node*))*siz
1bdf0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  e );.    if( arr
1be00 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
1be10 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
1be20 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
1be30 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
1be40 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a  y.ht = (x4node**
1be50 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a  )&(array.tbl[siz
1be60 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
1be70 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
1be80 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
1be90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
1bea0 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  4a->count; i++){
1beb0 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20 2a 6f  .      x4node *o
1bec0 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
1bed0 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 34      oldnp = &(x4
1bee0 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
1bef0 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68    h = confighash
1bf00 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20  (oldnp->data) & 
1bf10 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  (size-1);.      
1bf20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
1bf30 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
1bf40 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
1bf50 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
1bf60 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
1bf70 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
1bf80 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
1bf90 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
1bfa0 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
1bfb0 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
1bfc0 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
1bfd0 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
1bfe0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
1bff0 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
1c000 66 72 65 65 28 78 34 61 2d 3e 74 62 6c 29 3b 0a  free(x4a->tbl);.
1c010 20 20 20 20 2a 78 34 61 20 3d 20 61 72 72 61 79      *x4a = array
1c020 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
1c030 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
1c040 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 34  /.  h = ph & (x4
1c050 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1c060 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 78 34   = &(x4a->tbl[x4
1c070 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
1c080 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
1c090 0a 20 20 69 66 28 20 78 34 61 2d 3e 68 74 5b 68  .  if( x4a->ht[h
1c0a0 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x4a->ht[h]->
1c0b0 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
1c0c0 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
1c0d0 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x4a->ht[h];.  x
1c0e0 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  4a->ht[h] = np;.
1c0f0 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
1c100 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  4a->ht[h]);.  re
1c110 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
1c120 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1c130 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
1c140 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
1c150 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
1c160 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
1c170 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  . */.struct conf
1c180 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ig *Configtable_
1c190 66 69 6e 64 28 6b 65 79 29 0a 73 74 72 75 63 74  find(key).struct
1c1a0 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a   config *key;.{.
1c1b0 20 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f 64    int h;.  x4nod
1c1c0 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 34  e *np;..  if( x4
1c1d0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1c1e0 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73  .  h = confighas
1c1f0 68 28 6b 65 79 29 20 26 20 28 78 34 61 2d 3e 73  h(key) & (x4a->s
1c200 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
1c210 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  4a->ht[h];.  whi
1c220 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
1c230 28 20 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d 3e  ( Configcmp(np->
1c240 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62  data,key)==0 ) b
1c250 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
1c260 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
1c270 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
1c280 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
1c290 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66  emove all data f
1c2a0 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20 20  rom the table.  
1c2b0 50 61 73 73 20 65 61 63 68 20 64 61 74 61 20 74  Pass each data t
1c2c0 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22  o the function "
1c2d0 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73 20 72  f".** as it is r
1c2e0 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20 6d 61  emoved.  ("f" ma
1c2f0 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76 6f  y be null to avo
1c300 69 64 20 74 68 69 73 20 73 74 65 70 2e 29 20 2a  id this step.) *
1c310 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62  /.void Configtab
1c320 6c 65 5f 63 6c 65 61 72 28 66 29 0a 69 6e 74 28  le_clear(f).int(
1c330 2a 66 29 28 2f 2a 20 73 74 72 75 63 74 20 63 6f  *f)(/* struct co
1c340 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 7b 0a 20 20  nfig * */);.{.  
1c350 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 78 34 61  int i;.  if( x4a
1c360 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e  ==0 || x4a->coun
1c370 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1c380 20 69 66 28 20 66 20 29 20 66 6f 72 28 69 3d 30   if( f ) for(i=0
1c390 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x4a->count; 
1c3a0 69 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d 3e 74  i++) (*f)(x4a->t
1c3b0 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20 20 66  bl[i].data);.  f
1c3c0 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 73  or(i=0; i<x4a->s
1c3d0 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68  ize; i++) x4a->h
1c3e0 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34 61 2d  t[i] = 0;.  x4a-
1c3f0 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 72 65  >count = 0;.  re
1c400 74 75 72 6e 3b 0a 7d 0a                          turn;.}.