/ Hex Artifact Content
Login

Artifact e007bfdbc79a51a4cd7c8a5f81f517cebd121150:


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 69 6e 20 74 68 65 20 73 6f 75 72  EMON in the sour
0100: 63 65 20 74 72 65 65 0a 2a 2a 20 61 6e 64 20 4d  ce tree.** and M
0110: 61 6b 65 66 69 6c 65 20 6f 66 20 61 6e 6f 74 68  akefile of anoth
0120: 65 72 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  er program..**.*
0130: 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69  * This program i
0140: 73 20 66 72 65 65 20 73 6f 66 74 77 61 72 65 3b  s free software;
0150: 20 79 6f 75 20 63 61 6e 20 72 65 64 69 73 74 72   you can redistr
0160: 69 62 75 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a  ibute it and/or.
0170: 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20 75 6e 64  ** modify it und
0180: 65 72 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  er the terms of 
0190: 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c 20  the GNU General 
01a0: 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73  Public.** Licens
01b0: 65 20 61 73 20 70 75 62 6c 69 73 68 65 64 20 62  e as published b
01c0: 79 20 74 68 65 20 46 72 65 65 20 53 6f 66 74 77  y the Free Softw
01d0: 61 72 65 20 46 6f 75 6e 64 61 74 69 6f 6e 3b 20  are Foundation; 
01e0: 65 69 74 68 65 72 0a 2a 2a 20 76 65 72 73 69 6f  either.** versio
01f0: 6e 20 32 20 6f 66 20 74 68 65 20 4c 69 63 65 6e  n 2 of the Licen
0200: 73 65 2c 20 6f 72 20 28 61 74 20 79 6f 75 72 20  se, or (at your 
0210: 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c 61 74 65  option) any late
0220: 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  r version..**.**
0230: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0240: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
0250: 74 68 65 20 68 6f 70 65 20 74 68 61 74 20 69 74  the hope that it
0260: 20 77 69 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c   will be useful,
0270: 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f 55 54 20  .** but WITHOUT 
0280: 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 77 69  ANY WARRANTY; wi
0290: 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 20 69  thout even the i
02a0: 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79 20  mplied warranty 
02b0: 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e 54 41 42  of.** MERCHANTAB
02c0: 49 4c 49 54 59 20 6f 72 20 46 49 54 4e 45 53 53  ILITY or FITNESS
02d0: 20 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41   FOR A PARTICULA
02e0: 52 20 50 55 52 50 4f 53 45 2e 20 20 53 65 65 20  R PURPOSE.  See 
02f0: 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65 6e 65 72  the GNU.** Gener
0300: 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73  al Public Licens
0310: 65 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69  e for more detai
0320: 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73  ls..** .** You s
0330: 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65 69  hould have recei
0340: 76 65 64 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ved a copy of th
0350: 65 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75  e GNU General Pu
0360: 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20  blic.** License 
0370: 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 69 73 20  along with this 
0380: 6c 69 62 72 61 72 79 3b 20 69 66 20 6e 6f 74 2c  library; if not,
0390: 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 2a 2a   write to the.**
03a0: 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46   Free Software F
03b0: 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c  oundation, Inc.,
03c0: 20 35 39 20 54 65 6d 70 6c 65 20 50 6c 61 63 65   59 Temple Place
03d0: 20 2d 20 53 75 69 74 65 20 33 33 30 2c 0a 2a 2a   - Suite 330,.**
03e0: 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20 30 32 31   Boston, MA  021
03f0: 31 31 2d 31 33 30 37 2c 20 55 53 41 2e 0a 2a 2a  11-1307, USA..**
0400: 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f 6e 74 61  .** Author conta
0410: 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a  ct information:.
0420: 2a 2a 20 20 20 64 72 68 40 61 63 6d 2e 6f 72 67  **   drh@acm.org
0430: 0a 2a 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77  .**   http://www
0440: 2e 68 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a  .hwaci.com/drh/.
0450: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  */.#include <std
0460: 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  io.h>.#include <
0470: 76 61 72 61 72 67 73 2e 68 3e 0a 23 69 6e 63 6c  varargs.h>.#incl
0480: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23  ude <string.h>.#
0490: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
04a0: 3e 0a 0a 65 78 74 65 72 6e 20 76 6f 69 64 20 71  >..extern void q
04b0: 73 6f 72 74 28 29 3b 0a 65 78 74 65 72 6e 20 64  sort();.extern d
04c0: 6f 75 62 6c 65 20 73 74 72 74 6f 64 28 29 3b 0a  ouble strtod();.
04d0: 65 78 74 65 72 6e 20 6c 6f 6e 67 20 73 74 72 74  extern long strt
04e0: 6f 6c 28 29 3b 0a 65 78 74 65 72 6e 20 76 6f 69  ol();.extern voi
04f0: 64 20 66 72 65 65 28 29 3b 0a 65 78 74 65 72 6e  d free();.extern
0500: 20 69 6e 74 20 61 63 63 65 73 73 28 29 3b 0a 65   int access();.e
0510: 78 74 65 72 6e 20 69 6e 74 20 61 74 6f 69 28 29  xtern int atoi()
0520: 3b 0a 0a 23 69 66 6e 64 65 66 20 5f 5f 57 49 4e  ;..#ifndef __WIN
0530: 33 32 5f 5f 0a 23 20 20 20 69 66 20 64 65 66 69  32__.#   if defi
0540: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
0550: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 09  efined(WIN32).#.
0560: 64 65 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f  define __WIN32__
0570: 0a 23 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  .#   endif.#endi
0580: 66 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 52  f../* #define PR
0590: 49 56 41 54 45 20 73 74 61 74 69 63 20 2a 2f 0a  IVATE static */.
05a0: 23 64 65 66 69 6e 65 20 50 52 49 56 41 54 45 0a  #define PRIVATE.
05b0: 0a 23 69 66 64 65 66 20 54 45 53 54 0a 23 64 65  .#ifdef TEST.#de
05c0: 66 69 6e 65 20 4d 41 58 52 48 53 20 35 20 20 20  fine MAXRHS 5   
05d0: 20 20 20 20 2f 2a 20 53 65 74 20 6c 6f 77 20 74      /* Set low t
05e0: 6f 20 65 78 65 72 63 69 73 65 20 65 78 63 65 70  o exercise excep
05f0: 74 69 6f 6e 20 63 6f 64 65 20 2a 2f 0a 23 65 6c  tion code */.#el
0600: 73 65 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48  se.#define MAXRH
0610: 53 20 31 30 30 30 0a 23 65 6e 64 69 66 0a 0a 63  S 1000.#endif..c
0620: 68 61 72 20 2a 6d 73 6f 72 74 28 29 3b 0a 65 78  har *msort();.ex
0630: 74 65 72 6e 20 76 6f 69 64 20 2a 6d 61 6c 6c 6f  tern void *mallo
0640: 63 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 20  c();../******** 
0650: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61  From the file "a
0660: 63 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  ction.h" *******
0670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0690: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
06a0: 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 73 74 72  ction_new();.str
06b0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69  uct action *Acti
06c0: 6f 6e 5f 73 6f 72 74 28 29 3b 0a 76 6f 69 64 20  on_sort();.void 
06d0: 41 63 74 69 6f 6e 5f 61 64 64 28 29 3b 0a 0a 2f  Action_add();../
06e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
06f0: 68 65 20 66 69 6c 65 20 22 61 73 73 65 72 74 2e  he file "assert.
0700: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
0710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0720: 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 6d 79  *******/.void my
0730: 61 73 73 65 72 74 28 29 3b 0a 23 69 66 6e 64 65  assert();.#ifnde
0740: 66 20 4e 44 45 42 55 47 0a 23 20 20 64 65 66 69  f NDEBUG.#  defi
0750: 6e 65 20 61 73 73 65 72 74 28 58 29 20 69 66 28  ne assert(X) if(
0760: 21 28 58 29 29 6d 79 61 73 73 65 72 74 28 5f 5f  !(X))myassert(__
0770: 46 49 4c 45 5f 5f 2c 5f 5f 4c 49 4e 45 5f 5f 29  FILE__,__LINE__)
0780: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
0790: 20 61 73 73 65 72 74 28 58 29 0a 23 65 6e 64 69   assert(X).#endi
07a0: 66 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  f../********** F
07b0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75  rom the file "bu
07c0: 69 6c 64 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ild.h" *********
07d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69  ***********/.voi
07f0: 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64  d FindRulePreced
0800: 65 6e 63 65 73 28 29 3b 0a 76 6f 69 64 20 46 69  ences();.void Fi
0810: 6e 64 46 69 72 73 74 53 65 74 73 28 29 3b 0a 76  ndFirstSets();.v
0820: 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 29  oid FindStates()
0830: 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73  ;.void FindLinks
0840: 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c  ();.void FindFol
0850: 6c 6f 77 53 65 74 73 28 29 3b 0a 76 6f 69 64 20  lowSets();.void 
0860: 46 69 6e 64 41 63 74 69 6f 6e 73 28 29 3b 0a 0a  FindActions();..
0870: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  /********* From 
0880: 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67  the file "config
0890: 6c 69 73 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  list.h" ********
08a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20  *********/.void 
08c0: 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28  Configlist_init(
08d0: 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72  /* void */);.str
08e0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
08f0: 69 67 6c 69 73 74 5f 61 64 64 28 2f 2a 20 73 74  iglist_add(/* st
0900: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
0910: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e   */);.struct con
0920: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
0930: 61 64 64 62 61 73 69 73 28 2f 2a 20 73 74 72 75  addbasis(/* stru
0940: 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74 20 2a  ct rule *, int *
0950: 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c  /);.void Configl
0960: 69 73 74 5f 63 6c 6f 73 75 72 65 28 2f 2a 20 76  ist_closure(/* v
0970: 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f  oid */);.void Co
0980: 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 2f 2a  nfiglist_sort(/*
0990: 20 76 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69 64 20   void */);.void 
09a0: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62  Configlist_sortb
09b0: 61 73 69 73 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  asis(/* void */)
09c0: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
09d0: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75  *Configlist_retu
09e0: 72 6e 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  rn(/* void */);.
09f0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
0a00: 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28  onfiglist_basis(
0a10: 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69  /* void */);.voi
0a20: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74  d Configlist_eat
0a30: 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69  (/* struct confi
0a40: 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f  g * */);.void Co
0a50: 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 2f  nfiglist_reset(/
0a60: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a  * void */);../**
0a70: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
0a80: 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 68 22 20   file "error.h" 
0a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ab0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 45 72  *******/.void Er
0ac0: 72 6f 72 4d 73 67 28 20 2f 2a 20 63 68 61 72 20  rorMsg( /* char 
0ad0: 2a 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 2c 20  *, int, char *, 
0ae0: 2e 2e 2e 20 2a 2f 20 29 3b 0a 0a 2f 2a 2a 2a 2a  ... */ );../****
0af0: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0b00: 20 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a   "option.h" ****
0b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b30: 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 73  ******/.struct s
0b40: 5f 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75  _options {.  enu
0b50: 6d 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c 20  m { OPT_FLAG=1, 
0b60: 20 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f 44   OPT_INT,  OPT_D
0b70: 42 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20 20  BL,  OPT_STR,.  
0b80: 20 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41 47         OPT_FFLAG
0b90: 2c 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54 5f  , OPT_FINT, OPT_
0ba0: 46 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d 20  FDBL, OPT_FSTR} 
0bb0: 74 79 70 65 3b 0a 20 20 63 68 61 72 20 2a 6c 61  type;.  char *la
0bc0: 62 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67  bel;.  char *arg
0bd0: 3b 0a 20 20 63 68 61 72 20 2a 6d 65 73 73 61 67  ;.  char *messag
0be0: 65 3b 0a 7d 3b 0a 69 6e 74 20 20 20 20 4f 70 74  e;.};.int    Opt
0bf0: 49 6e 69 74 28 2f 2a 20 63 68 61 72 2a 2a 2c 73  Init(/* char**,s
0c00: 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 2a  truct s_options*
0c10: 2c 46 49 4c 45 2a 20 2a 2f 29 3b 0a 69 6e 74 20  ,FILE* */);.int 
0c20: 20 20 20 4f 70 74 4e 41 72 67 73 28 2f 2a 20 76     OptNArgs(/* v
0c30: 6f 69 64 20 2a 2f 29 3b 0a 63 68 61 72 20 20 2a  oid */);.char  *
0c40: 4f 70 74 41 72 67 28 2f 2a 20 69 6e 74 20 2a 2f  OptArg(/* int */
0c50: 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45 72 72  );.void   OptErr
0c60: 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69  (/* int */);.voi
0c70: 64 20 20 20 4f 70 74 50 72 69 6e 74 28 2f 2a 20  d   OptPrint(/* 
0c80: 76 6f 69 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a  void */);../****
0c90: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
0ca0: 6c 65 20 22 70 61 72 73 65 2e 68 22 20 2a 2a 2a  le "parse.h" ***
0cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0cd0: 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 50 61 72  ******/.void Par
0ce0: 73 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d  se(/* struct lem
0cf0: 6f 6e 20 2a 6c 65 6d 70 20 2a 2f 29 3b 0a 0a 2f  on *lemp */);../
0d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
0d10: 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68  he file "plink.h
0d20: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
0d30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63  *********/.struc
0d50: 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
0d60: 65 77 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  ew(/* void */);.
0d70: 76 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 2f  void Plink_add(/
0d80: 2a 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  * struct plink *
0d90: 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  *, struct config
0da0: 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69   * */);.void Pli
0db0: 6e 6b 5f 63 6f 70 79 28 2f 2a 20 73 74 72 75 63  nk_copy(/* struc
0dc0: 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75  t plink **, stru
0dd0: 63 74 20 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a  ct plink * */);.
0de0: 76 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74  void Plink_delet
0df0: 65 28 2f 2a 20 73 74 72 75 63 74 20 70 6c 69 6e  e(/* struct plin
0e00: 6b 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  k * */);../*****
0e10: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
0e20: 69 6c 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a  ile "report.h" *
0e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e50: 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69  ****/.void Repri
0e60: 6e 74 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d  nt(/* struct lem
0e70: 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52  on * */);.void R
0e80: 65 70 6f 72 74 4f 75 74 70 75 74 28 2f 2a 20 73  eportOutput(/* s
0e90: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f  truct lemon * */
0ea0: 29 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61  );.void ReportTa
0eb0: 62 6c 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65  ble(/* struct le
0ec0: 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20  mon * */);.void 
0ed0: 52 65 70 6f 72 74 48 65 61 64 65 72 28 2f 2a 20  ReportHeader(/* 
0ee0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a  struct lemon * *
0ef0: 2f 29 3b 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73  /);.void Compres
0f00: 73 54 61 62 6c 65 73 28 2f 2a 20 73 74 72 75 63  sTables(/* struc
0f10: 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 0a  t lemon * */);..
0f20: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  /********** From
0f30: 20 74 68 65 20 66 69 6c 65 20 22 73 65 74 2e 68   the file "set.h
0f40: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
0f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64  **********/.void
0f70: 20 20 53 65 74 53 69 7a 65 28 2f 2a 20 69 6e 74    SetSize(/* int
0f80: 20 4e 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20   N */);         
0f90: 20 20 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20      /* All sets 
0fa0: 77 69 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65 20  will be of size 
0fb0: 4e 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65  N */.char *SetNe
0fc0: 77 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 20 20  w(/* void */);  
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0fe0: 41 20 6e 65 77 20 73 65 74 20 66 6f 72 20 65 6c  A new set for el
0ff0: 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a 2f 0a 76 6f  ement 0..N */.vo
1000: 69 64 20 20 53 65 74 46 72 65 65 28 2f 2a 20 63  id  SetFree(/* c
1010: 68 61 72 2a 20 2a 2f 29 3b 20 20 20 20 20 20 20  har* */);       
1020: 20 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63        /* Dealloc
1030: 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 0a 69 6e  ate a set */..in
1040: 74 20 53 65 74 41 64 64 28 2f 2a 20 63 68 61 72  t SetAdd(/* char
1050: 2a 2c 69 6e 74 20 2a 2f 29 3b 20 20 20 20 20 20  *,int */);      
1060: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 65 6c 65        /* Add ele
1070: 6d 65 6e 74 20 74 6f 20 61 20 73 65 74 20 2a 2f  ment to a set */
1080: 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 2f 2a  .int SetUnion(/*
1090: 20 63 68 61 72 20 2a 41 2c 63 68 61 72 20 2a 42   char *A,char *B
10a0: 20 2a 2f 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d   */);    /* A <-
10b0: 20 41 20 55 20 42 2c 20 74 68 72 75 20 65 6c 65   A U B, thru ele
10c0: 6d 65 6e 74 20 4e 20 2a 2f 0a 0a 23 64 65 66 69  ment N */..#defi
10d0: 6e 65 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20  ne SetFind(X,Y) 
10e0: 28 58 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20  (X[Y])       /* 
10f0: 54 72 75 65 20 69 66 20 59 20 69 73 20 69 6e 20  True if Y is in 
1100: 73 65 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  set X */../*****
1110: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1120: 69 6c 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a  ile "struct.h" *
1130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1150: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ****/./*.** Prin
1160: 63 69 70 61 6c 20 64 61 74 61 20 73 74 72 75 63  cipal data struc
1170: 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45  tures for the LE
1180: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
1190: 61 74 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65  ator..*/..typede
11a0: 66 20 65 6e 75 6d 20 7b 46 41 4c 53 45 3d 30 2c  f enum {FALSE=0,
11b0: 20 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e 3b 0a   TRUE} Boolean;.
11c0: 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74 65 72  ./* Symbols (ter
11d0: 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65  minals and nonte
11e0: 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68 65 20  rminals) of the 
11f0: 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74 6f 72  grammar are stor
1200: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  ed.** in the fol
1210: 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73 74 72 75 63  lowing: */.struc
1220: 74 20 73 79 6d 62 6f 6c 20 7b 0a 20 20 63 68 61  t symbol {.  cha
1230: 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
1240: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1250: 20 74 68 65 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20   the symbol */. 
1260: 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20   int index;     
1270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1280: 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ex number for th
1290: 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65  is symbol */.  e
12a0: 6e 75 6d 20 7b 0a 20 20 20 20 54 45 52 4d 49 4e  num {.    TERMIN
12b0: 41 4c 2c 0a 20 20 20 20 4e 4f 4e 54 45 52 4d 49  AL,.    NONTERMI
12c0: 4e 41 4c 0a 20 20 7d 20 74 79 70 65 3b 20 20 20  NAL.  } type;   
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12e0: 2a 20 53 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c  * Symbols are al
12f0: 6c 20 65 69 74 68 65 72 20 54 45 52 4d 49 4e 41  l either TERMINA
1300: 4c 53 20 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73  LS or NTs */.  s
1310: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65  truct rule *rule
1320: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65  ;       /* Linke
1330: 64 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73 20  d list of rules 
1340: 6f 66 20 74 68 69 73 20 28 69 66 20 61 6e 20 4e  of this (if an N
1350: 54 29 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63  T) */.  int prec
1360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1370: 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69   /* Precedence i
1380: 66 20 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74  f defined (-1 ot
1390: 68 65 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e  herwise) */.  en
13a0: 75 6d 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20  um e_assoc {.   
13b0: 20 4c 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54   LEFT,.    RIGHT
13c0: 2c 0a 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20  ,.    NONE,.    
13d0: 55 4e 4b 0a 20 20 7d 20 61 73 73 6f 63 3b 20 20  UNK.  } assoc;  
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f0: 2a 20 41 73 73 6f 63 69 61 74 69 76 69 74 79 20  * Associativity 
1400: 69 66 20 70 72 65 64 65 63 65 6e 63 65 20 69 73  if predecence is
1410: 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 63 68   defined */.  ch
1420: 61 72 20 2a 66 69 72 73 74 73 65 74 3b 20 20 20  ar *firstset;   
1430: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 2d         /* First-
1440: 73 65 74 20 66 6f 72 20 61 6c 6c 20 72 75 6c 65  set for all rule
1450: 73 20 6f 66 20 74 68 69 73 20 73 79 6d 62 6f 6c  s of this symbol
1460: 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 6c 61   */.  Boolean la
1470: 6d 62 64 61 3b 20 20 20 20 20 20 20 20 20 20 2f  mbda;          /
1480: 2a 20 54 72 75 65 20 69 66 20 4e 54 20 61 6e 64  * True if NT and
1490: 20 63 61 6e 20 67 65 6e 65 72 61 74 65 20 61 6e   can generate an
14a0: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f   empty string */
14b0: 0a 20 20 63 68 61 72 20 2a 64 65 73 74 72 75 63  .  char *destruc
14c0: 74 6f 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  tor;        /* C
14d0: 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
14e0: 65 73 20 77 68 65 6e 65 76 65 72 20 74 68 69 73  es whenever this
14f0: 20 73 79 6d 62 6f 6c 20 69 73 0a 20 20 20 20 20   symbol is.     
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 2a 2a 20 70 6f 70 70 65 64 20        ** popped 
1520: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 64  from the stack d
1530: 75 72 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63  uring error proc
1540: 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  essing */.  int 
1550: 64 65 73 74 72 75 63 74 6f 72 6c 6e 3b 20 20 20  destructorln;   
1560: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
1570: 62 65 72 20 6f 66 20 64 65 73 74 72 75 63 74 6f  ber of destructo
1580: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72  r code */.  char
1590: 20 2a 64 61 74 61 74 79 70 65 3b 20 20 20 20 20   *datatype;     
15a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
15b0: 20 74 79 70 65 20 6f 66 20 69 6e 66 6f 72 6d 61   type of informa
15c0: 74 69 6f 6e 20 68 65 6c 64 20 62 79 20 74 68 69  tion held by thi
15d0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
15f0: 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79 20 75 73 65  object. Only use
1600: 64 20 69 66 20 74 79 70 65 3d 3d 4e 4f 4e 54 45  d if type==NONTE
1610: 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69 6e 74 20  RMINAL */.  int 
1620: 64 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  dtnum;          
1630: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1640: 20 74 79 70 65 20 6e 75 6d 62 65 72 2e 20 20 49   type number.  I
1650: 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68  n the parser, th
1660: 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20  e value.        
1670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1680: 20 20 20 2a 2a 20 73 74 61 63 6b 20 69 73 20 61     ** stack is a
1690: 20 75 6e 69 6f 6e 2e 20 20 54 68 65 20 2e 79 79   union.  The .yy
16a0: 25 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  %d element of th
16b0: 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  is.             
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
16d0: 20 75 6e 69 6f 6e 20 69 73 20 74 68 65 20 63 6f   union is the co
16e0: 72 72 65 63 74 20 64 61 74 61 20 74 79 70 65 20  rrect data type 
16f0: 66 6f 72 20 74 68 69 73 20 6f 62 6a 65 63 74 20  for this object 
1700: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70  */.};../* Each p
1710: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69  roduction rule i
1720: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73  n the grammar is
1730: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66   stored in the f
1740: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75  ollowing.** stru
1750: 63 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63  cture.  */.struc
1760: 74 20 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63  t rule {.  struc
1770: 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20  t symbol *lhs;  
1780: 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64      /* Left-hand
1790: 20 73 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c   side of the rul
17a0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 68 73  e */.  char *lhs
17b0: 61 6c 69 61 73 3b 20 20 20 20 20 20 20 20 20 20  alias;          
17c0: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65  /* Alias for the
17d0: 20 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f   LHS (NULL if no
17e0: 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 72 75 6c  ne) */.  int rul
17f0: 65 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  eline;          
1800: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
1810: 20 66 6f 72 20 74 68 65 20 72 75 6c 65 20 2a 2f   for the rule */
1820: 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20  .  int nrhs;    
1830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1840: 75 6d 62 65 72 20 6f 66 20 52 48 53 20 73 79 6d  umber of RHS sym
1850: 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  bols */.  struct
1860: 20 73 79 6d 62 6f 6c 20 2a 2a 72 68 73 3b 20 20   symbol **rhs;  
1870: 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 73 79     /* The RHS sy
1880: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20  mbols */.  char 
1890: 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20 20 20  **rhsalias;     
18a0: 20 20 20 20 2f 2a 20 41 6e 20 61 6c 69 61 73 20      /* An alias 
18b0: 66 6f 72 20 65 61 63 68 20 52 48 53 20 73 79 6d  for each RHS sym
18c0: 62 6f 6c 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e  bol (NULL if non
18d0: 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 69 6e 65  e) */.  int line
18e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18f0: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
1900: 61 74 20 77 68 69 63 68 20 63 6f 64 65 20 62 65  at which code be
1910: 67 69 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  gins */.  char *
1920: 63 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  code;           
1930: 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 65     /* The code e
1940: 78 65 63 75 74 65 64 20 77 68 65 6e 20 74 68 69  xecuted when thi
1950: 73 20 72 75 6c 65 20 69 73 20 72 65 64 75 63 65  s rule is reduce
1960: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  d */.  struct sy
1970: 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d 3b 20 20  mbol *precsym;  
1980: 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 73 79  /* Precedence sy
1990: 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73 20 72 75  mbol for this ru
19a0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65  le */.  int inde
19b0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
19c0: 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6e 75 6d   /* An index num
19d0: 62 65 72 20 66 6f 72 20 74 68 69 73 20 72 75 6c  ber for this rul
19e0: 65 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63  e */.  Boolean c
19f0: 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20  anReduce;       
1a00: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1a10: 72 75 6c 65 20 69 73 20 65 76 65 72 20 72 65 64  rule is ever red
1a20: 75 63 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  uced */.  struct
1a30: 20 72 75 6c 65 20 2a 6e 65 78 74 6c 68 73 3b 20   rule *nextlhs; 
1a40: 20 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20     /* Next rule 
1a50: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 4c 48  with the same LH
1a60: 53 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  S */.  struct ru
1a70: 6c 65 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 20  le *next;       
1a80: 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20 69 6e 20  /* Next rule in 
1a90: 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20  the global list 
1aa0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 20 63 6f 6e 66  */.};../* A conf
1ab0: 69 67 75 72 61 74 69 6f 6e 20 69 73 20 61 20 70  iguration is a p
1ac0: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 6f  roduction rule o
1ad0: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 74 6f  f the grammar to
1ae0: 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 61  gether with.** a
1af0: 20 6d 61 72 6b 20 28 64 6f 74 29 20 73 68 6f 77   mark (dot) show
1b00: 69 6e 67 20 68 6f 77 20 6d 75 63 68 20 6f 66 20  ing how much of 
1b10: 74 68 61 74 20 72 75 6c 65 20 68 61 73 20 62 65  that rule has be
1b20: 65 6e 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20  en processed so 
1b30: 66 61 72 2e 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  far..** Configur
1b40: 61 74 69 6f 6e 73 20 61 6c 73 6f 20 63 6f 6e 74  ations also cont
1b50: 61 69 6e 20 61 20 66 6f 6c 6c 6f 77 2d 73 65 74  ain a follow-set
1b60: 20 77 68 69 63 68 20 69 73 20 61 20 6c 69 73 74   which is a list
1b70: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20   of terminal.** 
1b80: 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 61 72  symbols which ar
1b90: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 69 6d 6d  e allowed to imm
1ba0: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 20  ediately follow 
1bb0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
1bc0: 75 6c 65 2e 0a 2a 2a 20 45 76 65 72 79 20 63 6f  ule..** Every co
1bd0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 72  nfiguration is r
1be0: 65 63 6f 72 64 65 64 20 61 73 20 61 6e 20 69 6e  ecorded as an in
1bf0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1c00: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73 74 72 75  llowing: */.stru
1c10: 63 74 20 63 6f 6e 66 69 67 20 7b 0a 20 20 73 74  ct config {.  st
1c20: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20  ruct rule *rp;  
1c30: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 75         /* The ru
1c40: 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20 74 68  le upon which th
1c50: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
1c60: 69 73 20 62 61 73 65 64 20 2a 2f 0a 20 20 69 6e  is based */.  in
1c70: 74 20 64 6f 74 3b 20 20 20 20 20 20 20 20 20 20  t dot;          
1c80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1c90: 72 73 65 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 63  rse point */.  c
1ca0: 68 61 72 20 2a 66 77 73 3b 20 20 20 20 20 20 20  har *fws;       
1cb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f          /* Follo
1cc0: 77 2d 73 65 74 20 66 6f 72 20 74 68 69 73 20 63  w-set for this c
1cd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 6e 6c  onfiguration onl
1ce0: 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70 6c  y */.  struct pl
1cf0: 69 6e 6b 20 2a 66 70 6c 70 3b 20 20 20 20 20 20  ink *fplp;      
1d00: 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f  /* Follow-set fo
1d10: 72 77 61 72 64 20 70 72 6f 70 61 67 61 74 69 6f  rward propagatio
1d20: 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72  n links */.  str
1d30: 75 63 74 20 70 6c 69 6e 6b 20 2a 62 70 6c 70 3b  uct plink *bplp;
1d40: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
1d50: 73 65 74 20 62 61 63 6b 77 61 72 64 73 20 70 72  set backwards pr
1d60: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20  opagation links 
1d70: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  */.  struct stat
1d80: 65 20 2a 73 74 70 3b 20 20 20 20 20 20 20 2f 2a  e *stp;       /*
1d90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 61 74   Pointer to stat
1da0: 65 20 77 68 69 63 68 20 63 6f 6e 74 61 69 6e 73  e which contains
1db0: 20 74 68 69 73 20 2a 2f 0a 20 20 65 6e 75 6d 20   this */.  enum 
1dc0: 7b 0a 20 20 20 20 43 4f 4d 50 4c 45 54 45 2c 20  {.    COMPLETE, 
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de0: 54 68 65 20 73 74 61 74 75 73 20 69 73 20 75 73  The status is us
1df0: 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c 6f 77  ed during follow
1e00: 73 65 74 20 61 6e 64 20 2a 2f 0a 20 20 20 20 49  set and */.    I
1e10: 4e 43 4f 4d 50 4c 45 54 45 20 20 20 20 20 20 20  NCOMPLETE       
1e20: 20 20 20 20 20 20 2f 2a 20 20 20 20 73 68 69 66        /*    shif
1e30: 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 73 20 2a  t computations *
1e40: 2f 0a 20 20 7d 20 73 74 61 74 75 73 3b 0a 20 20  /.  } status;.  
1e50: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
1e60: 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74  ext;     /* Next
1e70: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69   configuration i
1e80: 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f 0a 20  n the state */. 
1e90: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
1ea0: 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  bp;       /* The
1eb0: 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f 6e 66   next basis conf
1ec0: 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a  iguration */.};.
1ed0: 0a 2f 2a 20 45 76 65 72 79 20 73 68 69 66 74 20  ./* Every shift 
1ee0: 6f 72 20 72 65 64 75 63 65 20 6f 70 65 72 61 74  or reduce operat
1ef0: 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20 61 73  ion is stored as
1f00: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c   one of the foll
1f10: 6f 77 69 6e 67 20 2a 2f 0a 73 74 72 75 63 74 20  owing */.struct 
1f20: 61 63 74 69 6f 6e 20 7b 0a 20 20 73 74 72 75 63  action {.  struc
1f30: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20  t symbol *sp;   
1f40: 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d      /* The look-
1f50: 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a  ahead symbol */.
1f60: 20 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20    enum e_action 
1f70: 7b 0a 20 20 20 20 53 48 49 46 54 2c 0a 20 20 20  {.    SHIFT,.   
1f80: 20 41 43 43 45 50 54 2c 0a 20 20 20 20 52 45 44   ACCEPT,.    RED
1f90: 55 43 45 2c 0a 20 20 20 20 45 52 52 4f 52 2c 0a  UCE,.    ERROR,.
1fa0: 20 20 20 20 43 4f 4e 46 4c 49 43 54 2c 20 20 20      CONFLICT,   
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc0: 57 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75  Was a reduce, bu
1fd0: 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66  t part of a conf
1fe0: 6c 69 63 74 20 2a 2f 0a 20 20 20 20 53 48 5f 52  lict */.    SH_R
1ff0: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
2000: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68       /* Was a sh
2010: 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65  ift.  Precedence
2020: 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69   resolved confli
2030: 63 74 20 2a 2f 0a 20 20 20 20 52 44 5f 52 45 53  ct */.    RD_RES
2040: 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20  OLVED,          
2050: 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65     /* Was reduce
2060: 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72 65  .  Precedence re
2070: 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20  solved conflict 
2080: 2a 2f 0a 20 20 20 20 4e 4f 54 5f 55 53 45 44 20  */.    NOT_USED 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 2f 2a 20 44 65 6c 65 74 65 64 20 62 79 20 63 6f  /* Deleted by co
20b0: 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 7d  mpression */.  }
20c0: 20 74 79 70 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b   type;.  union {
20d0: 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
20e0: 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54  e *stp;     /* T
20f0: 68 65 20 6e 65 77 20 73 74 61 74 65 2c 20 69 66  he new state, if
2100: 20 61 20 73 68 69 66 74 20 2a 2f 0a 20 20 20 20   a shift */.    
2110: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
2120: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 75         /* The ru
2130: 6c 65 2c 20 69 66 20 61 20 72 65 64 75 63 65 20  le, if a reduce 
2140: 2a 2f 0a 20 20 7d 20 78 3b 0a 20 20 73 74 72 75  */.  } x;.  stru
2150: 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b  ct action *next;
2160: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74       /* Next act
2170: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61  ion for this sta
2180: 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61  te */.  struct a
2190: 63 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20  ction *collide; 
21a0: 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20   /* Next action 
21b0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
21c0: 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63  sh */.};../* Eac
21d0: 68 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 67  h state of the g
21e0: 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 27  enerated parser'
21f0: 73 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  s finite state m
2200: 61 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63  achine.** is enc
2210: 6f 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61  oded as an insta
2220: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2230: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  wing structure. 
2240: 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
2250: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
2260: 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20  g *bp;       /* 
2270: 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  The basis config
2280: 75 72 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69  urations for thi
2290: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
22a0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
22b0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e        /* All con
22c0: 66 69 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74  figurations in t
22d0: 68 69 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  his set */.  int
22e0: 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20   index;         
22f0: 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 63        /* Sequenc
2300: 69 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ial number for t
2310: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
2320: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
2330: 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ;       /* Array
2340: 20 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f 72 20   of actions for 
2350: 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20  this state */.  
2360: 69 6e 74 20 6e 61 63 74 69 6f 6e 3b 20 20 20 20  int naction;    
2370: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2380: 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f  er of actions fo
2390: 72 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a  r this state */.
23a0: 20 20 69 6e 74 20 74 61 62 73 74 61 72 74 3b 20    int tabstart; 
23b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
23c0: 72 73 74 20 69 6e 64 65 78 20 6f 66 20 74 68 65  rst index of the
23d0: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f   action table */
23e0: 0a 20 20 69 6e 74 20 74 61 62 64 66 6c 74 61 63  .  int tabdfltac
23f0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  t;          /* D
2400: 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 2a 2f  efault action */
2410: 0a 7d 3b 0a 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77  .};../* A follow
2420: 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  set propagation 
2430: 6c 69 6e 6b 20 69 6e 64 69 63 61 74 65 73 20 74  link indicates t
2440: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
2450: 20 6f 66 20 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69   of one.** confi
2460: 67 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73  guration follows
2470: 65 74 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f  et should be pro
2480: 70 61 67 61 74 65 64 20 74 6f 20 61 6e 6f 74 68  pagated to anoth
2490: 65 72 20 77 68 65 6e 65 76 65 72 0a 2a 2a 20 74  er whenever.** t
24a0: 68 65 20 66 69 72 73 74 20 63 68 61 6e 67 65 73  he first changes
24b0: 2e 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e  . */.struct plin
24c0: 6b 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  k {.  struct con
24d0: 66 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f  fig *cfp;      /
24e0: 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74  * The configurat
24f0: 69 6f 6e 20 74 6f 20 77 68 69 63 68 20 6c 69 6e  ion to which lin
2500: 6b 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ked */.  struct 
2510: 70 6c 69 6e 6b 20 2a 6e 65 78 74 3b 20 20 20 20  plink *next;    
2520: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 72    /* The next pr
2530: 6f 70 61 67 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a  opagate link */.
2540: 7d 3b 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65  };../* The state
2550: 20 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20   vector for the 
2560: 65 6e 74 69 72 65 20 70 61 72 73 65 72 20 67 65  entire parser ge
2570: 6e 65 72 61 74 6f 72 20 69 73 20 72 65 63 6f 72  nerator is recor
2580: 64 65 64 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77  ded as.** follow
2590: 73 2e 20 20 28 4c 45 4d 4f 4e 20 75 73 65 73 20  s.  (LEMON uses 
25a0: 6e 6f 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  no global variab
25b0: 6c 65 73 20 61 6e 64 20 6d 61 6b 65 73 20 6c 69  les and makes li
25c0: 74 74 6c 65 20 75 73 65 20 6f 66 0a 2a 2a 20 73  ttle use of.** s
25d0: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 2e  tatic variables.
25e0: 20 20 46 69 65 6c 64 73 20 69 6e 20 74 68 65 20    Fields in the 
25f0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2600: 75 72 65 20 63 61 6e 20 62 65 20 74 68 6f 75 67  ure can be thoug
2610: 68 74 0a 2a 2a 20 6f 66 20 61 73 20 62 65 67 69  ht.** of as begi
2620: 6e 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  n global variabl
2630: 65 73 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61  es in the progra
2640: 6d 2e 29 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65  m.) */.struct le
2650: 6d 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73  mon {.  struct s
2660: 74 61 74 65 20 2a 2a 73 6f 72 74 65 64 3b 20 20  tate **sorted;  
2670: 20 2f 2a 20 54 61 62 6c 65 20 6f 66 20 73 74 61   /* Table of sta
2680: 74 65 73 20 73 6f 72 74 65 64 20 62 79 20 73 74  tes sorted by st
2690: 61 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ate number */.  
26a0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c  struct rule *rul
26b0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  e;       /* List
26c0: 20 6f 66 20 61 6c 6c 20 72 75 6c 65 73 20 2a 2f   of all rules */
26d0: 0a 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20  .  int nstate;  
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26f0: 75 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20  umber of states 
2700: 2a 2f 0a 20 20 69 6e 74 20 6e 72 75 6c 65 3b 20  */.  int nrule; 
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2720: 20 4e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73   Number of rules
2730: 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f   */.  int nsymbo
2740: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
2750: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
2760: 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d  inal and nonterm
2770: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  inal symbols */.
2780: 20 20 69 6e 74 20 6e 74 65 72 6d 69 6e 61 6c 3b    int nterminal;
2790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27a0: 6d 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c  mber of terminal
27b0: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74   symbols */.  st
27c0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 79  ruct symbol **sy
27d0: 6d 62 6f 6c 73 3b 20 2f 2a 20 53 6f 72 74 65 64  mbols; /* Sorted
27e0: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
27f0: 72 73 20 74 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f  rs to symbols */
2800: 0a 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b  .  int errorcnt;
2810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2820: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
2830: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
2840: 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a  ol *errsym;   /*
2850: 20 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f   The error symbo
2860: 6c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d  l */.  char *nam
2870: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2880: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 67  /* Name of the g
2890: 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20  enerated parser 
28a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 20  */.  char *arg; 
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28c0: 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20   Declaration of 
28d0: 74 68 65 20 33 74 68 20 61 72 67 75 6d 65 6e 74  the 3th argument
28e0: 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a 20 20   to parser */.  
28f0: 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70 65 3b  char *tokentype;
2900: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
2910: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d   of terminal sym
2920: 62 6f 6c 73 20 69 6e 20 74 68 65 20 70 61 72 73  bols in the pars
2930: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  er stack */.  ch
2940: 61 72 20 2a 76 61 72 74 79 70 65 3b 20 20 20 20  ar *vartype;    
2950: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 65         /* The de
2960: 66 61 75 6c 74 20 74 79 70 65 20 6f 66 20 6e 6f  fault type of no
2970: 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  n-terminal symbo
2980: 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74  ls */.  char *st
2990: 61 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  art;            
29a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
29b0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 66 6f 72  start symbol for
29c0: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a   the grammar */.
29d0: 20 20 63 68 61 72 20 2a 73 74 61 63 6b 73 69 7a    char *stacksiz
29e0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69  e;         /* Si
29f0: 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  ze of the parser
2a00: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72   stack */.  char
2a10: 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20 20 20   *include;      
2a20: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
2a30: 70 75 74 20 61 74 20 74 68 65 20 73 74 61 72 74  put at the start
2a40: 20 6f 66 20 74 68 65 20 43 20 66 69 6c 65 20 2a   of the C file *
2a50: 2f 0a 20 20 69 6e 74 20 20 69 6e 63 6c 75 64 65  /.  int  include
2a60: 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ln;          /* 
2a70: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
2a80: 73 74 61 72 74 20 6f 66 20 69 6e 63 6c 75 64 65  start of include
2a90: 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20   code */.  char 
2aa0: 2a 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  *error;         
2ab0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
2ac0: 78 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65  xecute when an e
2ad0: 72 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a  rror is seen */.
2ae0: 20 20 69 6e 74 20 20 65 72 72 6f 72 6c 6e 3b 20    int  errorln; 
2af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
2b00: 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74  ne number for st
2b10: 61 72 74 20 6f 66 20 65 72 72 6f 72 20 63 6f 64  art of error cod
2b20: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65  e */.  char *ove
2b30: 72 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20  rflow;          
2b40: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
2b50: 74 65 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76  te on a stack ov
2b60: 65 72 66 6c 6f 77 20 2a 2f 0a 20 20 69 6e 74 20  erflow */.  int 
2b70: 20 6f 76 65 72 66 6c 6f 77 6c 6e 3b 20 20 20 20   overflowln;    
2b80: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d       /* Line num
2b90: 62 65 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66  ber for start of
2ba0: 20 6f 76 65 72 66 6c 6f 77 20 63 6f 64 65 20 2a   overflow code *
2bb0: 2f 0a 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72  /.  char *failur
2bc0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2bd0: 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20  Code to execute 
2be0: 6f 6e 20 70 61 72 73 65 72 20 66 61 69 6c 75 72  on parser failur
2bf0: 65 20 2a 2f 0a 20 20 69 6e 74 20 20 66 61 69 6c  e */.  int  fail
2c00: 75 72 65 6c 6e 3b 20 20 20 20 20 20 20 20 20 20  ureln;          
2c10: 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66  /* Line number f
2c20: 6f 72 20 73 74 61 72 74 20 6f 66 20 66 61 69 6c  or start of fail
2c30: 75 72 65 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  ure code */.  ch
2c40: 61 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20  ar *accept;     
2c50: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
2c60: 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 74  o execute when t
2c70: 68 65 20 70 61 72 73 65 72 20 65 78 63 65 70 74  he parser except
2c80: 73 20 2a 2f 0a 20 20 69 6e 74 20 20 61 63 63 65  s */.  int  acce
2c90: 70 74 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 20  ptln;           
2ca0: 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66  /* Line number f
2cb0: 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
2cc0: 61 63 63 65 70 74 20 63 6f 64 65 20 2a 2f 0a 20  accept code */. 
2cd0: 20 63 68 61 72 20 2a 65 78 74 72 61 63 6f 64 65   char *extracode
2ce0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64  ;         /* Cod
2cf0: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
2d00: 65 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c 65  e generated file
2d10: 20 2a 2f 0a 20 20 69 6e 74 20 20 65 78 74 72 61   */.  int  extra
2d20: 63 6f 64 65 6c 6e 3b 20 20 20 20 20 20 20 20 2f  codeln;        /
2d30: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
2d40: 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
2d50: 68 65 20 65 78 74 72 61 20 63 6f 64 65 20 2a 2f  he extra code */
2d60: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65  .  char *tokende
2d70: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
2d80: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74  ode to execute t
2d90: 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20  o destroy token 
2da0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 20 74  data */.  int  t
2db0: 6f 6b 65 6e 64 65 73 74 6c 6e 3b 20 20 20 20 20  okendestln;     
2dc0: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
2dd0: 72 20 66 6f 72 20 74 6f 6b 65 6e 20 64 65 73 74  r for token dest
2de0: 72 6f 79 65 72 20 63 6f 64 65 20 2a 2f 0a 20 20  royer code */.  
2df0: 63 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20  char *vardest;  
2e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2e10: 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74   for the default
2e20: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65   non-terminal de
2e30: 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 69 6e  structor */.  in
2e40: 74 20 20 76 61 72 64 65 73 74 6c 6e 3b 20 20 20  t  vardestln;   
2e50: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
2e60: 75 6d 62 65 72 20 66 6f 72 20 64 65 66 61 75 6c  umber for defaul
2e70: 74 20 6e 6f 6e 2d 74 65 72 6d 20 64 65 73 74 72  t non-term destr
2e80: 75 63 74 6f 72 20 63 6f 64 65 2a 2f 0a 20 20 63  uctor code*/.  c
2e90: 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20  har *filename;  
2ea0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2eb0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
2ec0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74  e */.  char *out
2ed0: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
2ee0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
2ef0: 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69  urrent output fi
2f00: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  le */.  char *to
2f10: 6b 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20  kenprefix;      
2f20: 20 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64   /* A prefix add
2f30: 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65  ed to token name
2f40: 73 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65  s in the .h file
2f50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c   */.  int nconfl
2f60: 69 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ict;           /
2f70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73  * Number of pars
2f80: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f  ing conflicts */
2f90: 0a 20 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65  .  int tablesize
2fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
2fb0: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ize of the parse
2fc0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74   tables */.  int
2fd0: 20 62 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20   basisflag;     
2fe0: 20 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f        /* Print o
2ff0: 6e 6c 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67  nly basis config
3000: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68  urations */.  ch
3010: 61 72 20 2a 61 72 67 76 30 3b 20 20 20 20 20 20  ar *argv0;      
3020: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3030: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f  f the program */
3040: 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 4d 65 6d  .};..#define Mem
3050: 6f 72 79 43 68 65 63 6b 28 58 29 20 69 66 28 28  oryCheck(X) if((
3060: 58 29 3d 3d 30 29 7b 20 5c 0a 20 20 65 78 74 65  X)==0){ \.  exte
3070: 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65  rn void memory_e
3080: 72 72 6f 72 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f  rror(); \.  memo
3090: 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a  ry_error(); \.}.
30a0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
30b0: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
30c0: 20 22 74 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a   "table.h" *****
30d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
30f0: 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20  .** All code in 
3100: 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65  this file has be
3110: 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  en automatically
3120: 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72   generated.** fr
3130: 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69  om a specificati
3140: 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a  on in the file.*
3150: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  *              "
3160: 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74  table.q".** by t
3170: 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  he associative a
3180: 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69  rray code buildi
3190: 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65  ng program "aage
31a0: 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64  n"..** Do not ed
31b0: 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49  it this file!  I
31c0: 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65  nstead, edit the
31d0: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a   specification.*
31e0: 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72  * file, then rer
31f0: 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a  un aagen..*/./*.
3200: 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63  ** Code for proc
3210: 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e  essing tables in
3220: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
3230: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
3240: 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72  ./* Routines for
3250: 20 68 61 6e 64 6c 69 6e 67 20 61 20 73 74 72 69   handling a stri
3260: 6e 67 73 20 2a 2f 0a 0a 63 68 61 72 20 2a 53 74  ngs */..char *St
3270: 72 73 61 66 65 28 29 3b 0a 0a 76 6f 69 64 20 53  rsafe();..void S
3280: 74 72 73 61 66 65 5f 69 6e 69 74 28 2f 2a 20 76  trsafe_init(/* v
3290: 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20 53 74 72  oid */);.int Str
32a0: 73 61 66 65 5f 69 6e 73 65 72 74 28 2f 2a 20 63  safe_insert(/* c
32b0: 68 61 72 20 2a 20 2a 2f 29 3b 0a 63 68 61 72 20  har * */);.char 
32c0: 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28 2f 2a  *Strsafe_find(/*
32d0: 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a   char * */);../*
32e0: 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61   Routines for ha
32f0: 6e 64 6c 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f  ndling symbols o
3300: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  f the grammar */
3310: 0a 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  ..struct symbol 
3320: 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 29 3b 0a 69  *Symbol_new();.i
3330: 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 2f 2a  nt Symbolcmpp(/*
3340: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
3350: 2a 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  *, struct symbol
3360: 20 2a 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 53 79   ** */);.void Sy
3370: 6d 62 6f 6c 5f 69 6e 69 74 28 2f 2a 20 76 6f 69  mbol_init(/* voi
3380: 64 20 2a 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f  d */);.int Symbo
3390: 6c 5f 69 6e 73 65 72 74 28 2f 2a 20 73 74 72 75  l_insert(/* stru
33a0: 63 74 20 73 79 6d 62 6f 6c 20 2a 2c 20 63 68 61  ct symbol *, cha
33b0: 72 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  r * */);.struct 
33c0: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66  symbol *Symbol_f
33d0: 69 6e 64 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f  ind(/* char * */
33e0: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
33f0: 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 2f 2a 20   *Symbol_Nth(/* 
3400: 69 6e 74 20 2a 2f 29 3b 0a 69 6e 74 20 53 79 6d  int */);.int Sym
3410: 62 6f 6c 5f 63 6f 75 6e 74 28 2f 2a 20 20 2a 2f  bol_count(/*  */
3420: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
3430: 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f   **Symbol_arrayo
3440: 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52  f(/*  */);../* R
3450: 6f 75 74 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67  outines to manag
3460: 65 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  e the state tabl
3470: 65 20 2a 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67  e */..int Config
3480: 63 6d 70 28 2f 2a 20 73 74 72 75 63 74 20 63 6f  cmp(/* struct co
3490: 6e 66 69 67 20 2a 2c 20 73 74 72 75 63 74 20 63  nfig *, struct c
34a0: 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72  onfig * */);.str
34b0: 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74 65  uct state *State
34c0: 5f 6e 65 77 28 29 3b 0a 76 6f 69 64 20 53 74 61  _new();.void Sta
34d0: 74 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20  te_init(/* void 
34e0: 2a 2f 29 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69  */);.int State_i
34f0: 6e 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74 20  nsert(/* struct 
3500: 73 74 61 74 65 20 2a 2c 20 73 74 72 75 63 74 20  state *, struct 
3510: 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74  config * */);.st
3520: 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
3530: 65 5f 66 69 6e 64 28 2f 2a 20 73 74 72 75 63 74  e_find(/* struct
3540: 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73   config * */);.s
3550: 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74  truct state **St
3560: 61 74 65 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20  ate_arrayof(/*  
3570: 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65  */);../* Routine
3580: 73 20 75 73 65 64 20 66 6f 72 20 65 66 66 69 63  s used for effic
3590: 69 65 6e 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c  iency in Configl
35a0: 69 73 74 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64  ist_add */..void
35b0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
35c0: 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69  t(/* void */);.i
35d0: 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  nt Configtable_i
35e0: 6e 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74 20  nsert(/* struct 
35f0: 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74  config * */);.st
3600: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
3610: 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 2f 2a  figtable_find(/*
3620: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
3630: 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69   */);.void Confi
3640: 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 2f 2a 20  gtable_clear(/* 
3650: 69 6e 74 28 2a 29 28 73 74 72 75 63 74 20 63 6f  int(*)(struct co
3660: 6e 66 69 67 20 2a 29 20 2a 2f 29 3b 0a 2f 2a 2a  nfig *) */);./**
3670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3680: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
3690: 61 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a  action.c" ******
36a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
36c0: 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73   Routines proces
36d0: 73 69 6e 67 20 70 61 72 73 65 72 20 61 63 74 69  sing parser acti
36e0: 6f 6e 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  ons in the LEMON
36f0: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
3700: 72 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  r..*/../* Alloca
3710: 74 65 20 61 20 6e 65 77 20 70 61 72 73 65 72 20  te a new parser 
3720: 61 63 74 69 6f 6e 20 2a 2f 0a 73 74 72 75 63 74  action */.struct
3730: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
3740: 6e 65 77 28 29 7b 0a 20 20 73 74 61 74 69 63 20  new(){.  static 
3750: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 66  struct action *f
3760: 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73  reelist = 0;.  s
3770: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65  truct action *ne
3780: 77 3b 0a 0a 20 20 69 66 28 20 66 72 65 65 6c 69  w;..  if( freeli
3790: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
37a0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
37b0: 3d 20 31 30 30 3b 0a 20 20 20 20 66 72 65 65 6c  = 100;.    freel
37c0: 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 61 63  ist = (struct ac
37d0: 74 69 6f 6e 20 2a 29 6d 61 6c 6c 6f 63 28 20 73  tion *)malloc( s
37e0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 61 63 74  izeof(struct act
37f0: 69 6f 6e 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20  ion)*amt );.    
3800: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
3810: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
3820: 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20  (stderr,"Unable 
3830: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
3840: 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61 72  ry for a new par
3850: 73 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20  ser action.");. 
3860: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
3870: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
3880: 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66   i<amt-1; i++) f
3890: 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20  reelist[i].next 
38a0: 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d  = &freelist[i+1]
38b0: 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61  ;.    freelist[a
38c0: 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
38d0: 20 20 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65 65    }.  new = free
38e0: 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74  list;.  freelist
38f0: 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78   = freelist->nex
3900: 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b  t;.  return new;
3910: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74  .}../* Compare t
3920: 77 6f 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74  wo actions */.st
3930: 61 74 69 63 20 69 6e 74 20 61 63 74 69 6f 6e 63  atic int actionc
3940: 6d 70 28 61 70 31 2c 61 70 32 29 0a 73 74 72 75  mp(ap1,ap2).stru
3950: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 3b 0a  ct action *ap1;.
3960: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
3970: 70 32 3b 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  p2;.{.  int rc;.
3980: 20 20 72 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e    rc = ap1->sp->
3990: 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d  index - ap2->sp-
39a0: 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 72 63  >index;.  if( rc
39b0: 3d 3d 30 20 29 20 72 63 20 3d 20 28 69 6e 74 29  ==0 ) rc = (int)
39c0: 61 70 31 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74  ap1->type - (int
39d0: 29 61 70 32 2d 3e 74 79 70 65 3b 0a 20 20 69 66  )ap2->type;.  if
39e0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ( rc==0 ){.    a
39f0: 73 73 65 72 74 28 20 61 70 31 2d 3e 74 79 70 65  ssert( ap1->type
3a00: 3d 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 31 2d  ==REDUCE || ap1-
3a10: 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56  >type==RD_RESOLV
3a20: 45 44 20 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d  ED || ap1->type=
3a30: 3d 43 4f 4e 46 4c 49 43 54 29 3b 0a 20 20 20 20  =CONFLICT);.    
3a40: 61 73 73 65 72 74 28 20 61 70 32 2d 3e 74 79 70  assert( ap2->typ
3a50: 65 3d 3d 52 45 44 55 43 45 20 7c 7c 20 61 70 32  e==REDUCE || ap2
3a60: 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c  ->type==RD_RESOL
3a70: 56 45 44 20 7c 7c 20 61 70 32 2d 3e 74 79 70 65  VED || ap2->type
3a80: 3d 3d 43 4f 4e 46 4c 49 43 54 29 3b 0a 20 20 20  ==CONFLICT);.   
3a90: 20 72 63 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d   rc = ap1->x.rp-
3aa0: 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e  >index - ap2->x.
3ab0: 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rp->index;.  }. 
3ac0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
3ad0: 2a 20 53 6f 72 74 20 70 61 72 73 65 72 20 61 63  * Sort parser ac
3ae0: 74 69 6f 6e 73 20 2a 2f 0a 73 74 72 75 63 74 20  tions */.struct 
3af0: 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73  action *Action_s
3b00: 6f 72 74 28 61 70 29 0a 73 74 72 75 63 74 20 61  ort(ap).struct a
3b10: 63 74 69 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20 61  ction *ap;.{.  a
3b20: 70 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69  p = (struct acti
3b30: 6f 6e 20 2a 29 6d 73 6f 72 74 28 61 70 2c 26 61  on *)msort(ap,&a
3b40: 70 2d 3e 6e 65 78 74 2c 61 63 74 69 6f 6e 63 6d  p->next,actioncm
3b50: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b  p);.  return ap;
3b60: 0a 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f  .}..void Action_
3b70: 61 64 64 28 61 70 70 2c 74 79 70 65 2c 73 70 2c  add(app,type,sp,
3b80: 61 72 67 29 0a 73 74 72 75 63 74 20 61 63 74 69  arg).struct acti
3b90: 6f 6e 20 2a 2a 61 70 70 3b 0a 65 6e 75 6d 20 65  on **app;.enum e
3ba0: 5f 61 63 74 69 6f 6e 20 74 79 70 65 3b 0a 73 74  _action type;.st
3bb0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
3bc0: 0a 63 68 61 72 20 2a 61 72 67 3b 0a 7b 0a 20 20  .char *arg;.{.  
3bd0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e  struct action *n
3be0: 65 77 3b 0a 20 20 6e 65 77 20 3d 20 41 63 74 69  ew;.  new = Acti
3bf0: 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d  on_new();.  new-
3c00: 3e 6e 65 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20  >next = *app;.  
3c10: 2a 61 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65  *app = new;.  ne
3c20: 77 2d 3e 74 79 70 65 20 3d 20 74 79 70 65 3b 0a  w->type = type;.
3c30: 20 20 6e 65 77 2d 3e 73 70 20 3d 20 73 70 3b 0a    new->sp = sp;.
3c40: 20 20 69 66 28 20 74 79 70 65 3d 3d 53 48 49 46    if( type==SHIF
3c50: 54 20 29 7b 0a 20 20 20 20 6e 65 77 2d 3e 78 2e  T ){.    new->x.
3c60: 73 74 70 20 3d 20 28 73 74 72 75 63 74 20 73 74  stp = (struct st
3c70: 61 74 65 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c  ate *)arg;.  }el
3c80: 73 65 7b 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 72  se{.    new->x.r
3c90: 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65  p = (struct rule
3ca0: 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a   *)arg;.  }.}./*
3cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cc0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
3cd0: 69 6c 65 20 22 61 73 73 65 72 74 2e 63 22 20 2a  ile "assert.c" *
3ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
3d00: 2a 2a 20 41 20 6d 6f 72 65 20 65 66 66 69 63 69  ** A more effici
3d10: 65 6e 74 20 77 61 79 20 6f 66 20 68 61 6e 64 6c  ent way of handl
3d20: 69 6e 67 20 61 73 73 65 72 74 69 6f 6e 73 2e 0a  ing assertions..
3d30: 2a 2f 0a 76 6f 69 64 20 6d 79 61 73 73 65 72 74  */.void myassert
3d40: 28 66 69 6c 65 2c 6c 69 6e 65 29 0a 63 68 61 72  (file,line).char
3d50: 20 2a 66 69 6c 65 3b 0a 69 6e 74 20 6c 69 6e 65   *file;.int line
3d60: 3b 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  ;.{.  fprintf(st
3d70: 64 65 72 72 2c 22 41 73 73 65 72 74 69 6f 6e 20  derr,"Assertion 
3d80: 66 61 69 6c 65 64 20 6f 6e 20 6c 69 6e 65 20 25  failed on line %
3d90: 64 20 6f 66 20 66 69 6c 65 20 5c 22 25 73 5c 22  d of file \"%s\"
3da0: 5c 6e 22 2c 6c 69 6e 65 2c 66 69 6c 65 29 3b 0a  \n",line,file);.
3db0: 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 2f 2a 2a    exit(1);.}./**
3dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3dd0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
3de0: 6c 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a  le "build.c" ***
3df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
3e10: 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f  * Routines to co
3e20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66  nstruction the f
3e30: 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63 68  inite state mach
3e40: 69 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  ine for the LEMO
3e50: 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65  N.** parser gene
3e60: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69  rator..*/../* Fi
3e70: 6e 64 20 61 20 70 72 65 63 65 64 65 6e 63 65 20  nd a precedence 
3e80: 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20  symbol of every 
3e90: 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d  rule in the gram
3ea0: 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73  mar..** .** Thos
3eb0: 65 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61  e rules which ha
3ec0: 76 65 20 61 20 70 72 65 63 65 64 65 6e 63 65 20  ve a precedence 
3ed0: 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20  symbol coded in 
3ee0: 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61  the input.** gra
3ef0: 6d 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20 22  mmar using the "
3f00: 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72  [symbol]" constr
3f10: 75 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79  uct will already
3f20: 20 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d   have the.** rp-
3f30: 3e 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66  >precsym field f
3f40: 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75  illed.  Other ru
3f50: 6c 65 73 20 74 61 6b 65 20 61 73 20 74 68 65 69  les take as thei
3f60: 72 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20  r precedence.** 
3f70: 73 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74  symbol the first
3f80: 20 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68   RHS symbol with
3f90: 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65   a defined prece
3fa0: 64 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65  dence.  If there
3fb0: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20  .** are not RHS 
3fc0: 73 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64  symbols with a d
3fd0: 65 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63  efined precedenc
3fe0: 65 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e 63  e, the precedenc
3ff0: 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c  e.** symbol fiel
4000: 64 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e  d is left blank.
4010: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c  .*/.void FindRul
4020: 65 50 72 65 63 65 64 65 6e 63 65 73 28 78 70 29  ePrecedences(xp)
4030: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78  .struct lemon *x
4040: 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75  p;.{.  struct ru
4050: 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70  le *rp;.  for(rp
4060: 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  =xp->rule; rp; r
4070: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
4080: 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d   if( rp->precsym
4090: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
40a0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
40b0: 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
40c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
40d0: 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 70 72 65   rp->rhs[i]->pre
40e0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
40f0: 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20    rp->precsym = 
4100: 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
4110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a        break;..}.
4120: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4130: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
4140: 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65  * Find all nonte
4150: 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 77 69  rminals which wi
4160: 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  ll generate the 
4170: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  empty string..**
4180: 20 54 68 65 6e 20 67 6f 20 62 61 63 6b 20 61 6e   Then go back an
4190: 64 20 63 6f 6d 70 75 74 65 20 74 68 65 20 66 69  d compute the fi
41a0: 72 73 74 20 73 65 74 73 20 6f 66 20 65 76 65 72  rst sets of ever
41b0: 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a  y nonterminal..*
41c0: 2a 20 54 68 65 20 66 69 72 73 74 20 73 65 74 20  * The first set 
41d0: 69 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c  is the set of al
41e0: 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f  l terminal symbo
41f0: 6c 73 20 77 68 69 63 68 20 63 61 6e 20 62 65 67  ls which can beg
4200: 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20 67  in.** a string g
4210: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 61 74  enerated by that
4220: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f   nonterminal..*/
4230: 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53  .void FindFirstS
4240: 65 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  ets(lemp).struct
4250: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
4260: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
4270: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e  t rule *rp;.  in
4280: 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66  t progress;..  f
4290: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
42a0: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
42b0: 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73     lemp->symbols
42c0: 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 46 41  [i]->lambda = FA
42d0: 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  LSE;.  }.  for(i
42e0: 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  =lemp->nterminal
42f0: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
4300: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d  l; i++){.    lem
4310: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66  p->symbols[i]->f
4320: 69 72 73 74 73 65 74 20 3d 20 53 65 74 4e 65 77  irstset = SetNew
4330: 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ();.  }..  /* Fi
4340: 72 73 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20  rst compute all 
4350: 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f 7b  lambdas */.  do{
4360: 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20  .    progress = 
4370: 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65  0;.    for(rp=le
4380: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
4390: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
43a0: 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c    if( rp->lhs->l
43b0: 61 6d 62 64 61 20 29 20 63 6f 6e 74 69 6e 75 65  ambda ) continue
43c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
43d0: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
43e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 69 66 28 20  ){.         if( 
43f0: 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6c 61 6d 62  rp->rhs[i]->lamb
4400: 64 61 3d 3d 46 41 4c 53 45 20 29 20 62 72 65 61  da==FALSE ) brea
4410: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
4420: 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73   if( i==rp->nrhs
4430: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70 2d 3e   ){.        rp->
4440: 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 54 52  lhs->lambda = TR
4450: 55 45 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 67  UE;.        prog
4460: 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ress = 1;.      
4470: 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  }.    }.  }while
4480: 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20  ( progress );.. 
4490: 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20   /* Now compute 
44a0: 61 6c 6c 20 66 69 72 73 74 20 73 65 74 73 20 2a  all first sets *
44b0: 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 73 74 72 75  /.  do{.    stru
44c0: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a  ct symbol *s1, *
44d0: 73 32 3b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  s2;.    progress
44e0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70   = 0;.    for(rp
44f0: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
4500: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
4510: 20 20 20 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68       s1 = rp->lh
4520: 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  s;.      for(i=0
4530: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
4540: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 32 20 3d  +){.        s2 =
4550: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
4560: 20 20 20 20 20 69 66 28 20 73 32 2d 3e 74 79 70       if( s2->typ
4570: 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  e==TERMINAL ){. 
4580: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
4590: 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e  s += SetAdd(s1->
45a0: 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64  firstset,s2->ind
45b0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ex);.          b
45c0: 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 20 69 66 28  reak;..}else if(
45d0: 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20 20 20 20   s1==s2 ){.     
45e0: 20 20 20 20 20 69 66 28 20 73 31 2d 3e 6c 61 6d       if( s1->lam
45f0: 62 64 61 3d 3d 46 41 4c 53 45 20 29 20 62 72 65  bda==FALSE ) bre
4600: 61 6b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20  ak;..}else{.    
4610: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
4620: 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d 3e 66  = SetUnion(s1->f
4630: 69 72 73 74 73 65 74 2c 73 32 2d 3e 66 69 72 73  irstset,s2->firs
4640: 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tset);.         
4650: 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64 61 3d   if( s2->lambda=
4660: 3d 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a  =FALSE ) break;.
4670: 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .}.      }.    }
4680: 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72  .  }while( progr
4690: 65 73 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b  ess );.  return;
46a0: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61  .}../* Compute a
46b0: 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 20  ll LR(0) states 
46c0: 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 2e  for the grammar.
46d0: 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61    Links.** are a
46e0: 64 64 65 64 20 74 6f 20 62 65 74 77 65 65 6e 20  dded to between 
46f0: 73 6f 6d 65 20 73 74 61 74 65 73 20 73 6f 20 74  some states so t
4700: 68 61 74 20 74 68 65 20 4c 52 28 31 29 20 66 6f  hat the LR(1) fo
4710: 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e  llow sets.** can
4720: 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74   be computed lat
4730: 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73  er..*/.PRIVATE s
4740: 74 72 75 63 74 20 73 74 61 74 65 20 2a 67 65 74  truct state *get
4750: 73 74 61 74 65 28 2f 2a 20 73 74 72 75 63 74 20  state(/* struct 
4760: 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 20 20 2f 2a  lemon * */);  /*
4770: 20 66 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   forward referen
4780: 63 65 20 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 53  ce */.void FindS
4790: 74 61 74 65 73 28 6c 65 6d 70 29 0a 73 74 72 75  tates(lemp).stru
47a0: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
47b0: 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
47c0: 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20  l *sp;.  struct 
47d0: 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e  rule *rp;..  Con
47e0: 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a  figlist_init();.
47f0: 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73  .  /* Find the s
4800: 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20  tart symbol */. 
4810: 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74   if( lemp->start
4820: 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d   ){.    sp = Sym
4830: 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73  bol_find(lemp->s
4840: 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tart);.    if( s
4850: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72  p==0 ){.      Er
4860: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
4870: 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70  ename,0,."The sp
4880: 65 63 69 66 69 65 64 20 73 74 61 72 74 20 73 79  ecified start sy
4890: 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e  mbol \"%s\" is n
48a0: 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72  ot \.in a nonter
48b0: 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72 61  minal of the gra
48c0: 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77 69  mmar.  \"%s\" wi
48d0: 6c 6c 20 62 65 20 75 73 65 64 20 61 73 20 74 68  ll be used as th
48e0: 65 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c  e start \.symbol
48f0: 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d   instead.",lemp-
4900: 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 72 75 6c  >start,lemp->rul
4910: 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  e->lhs->name);. 
4920: 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
4930: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 70 20  cnt++;.      sp 
4940: 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  = lemp->rule->lh
4950: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
4960: 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d  {.    sp = lemp-
4970: 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a  >rule->lhs;.  }.
4980: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
4990: 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  the start symbol
49a0: 20 64 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f   doesn't occur o
49b0: 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
49c0: 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e   side of.  ** an
49d0: 79 20 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20  y rule.  Report 
49e0: 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 64  an error if it d
49f0: 6f 65 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c  oes.  (YACC woul
4a00: 64 20 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77  d generate a new
4a10: 0a 20 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62  .  ** start symb
4a20: 6f 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ol in this case.
4a30: 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  ) */.  for(rp=le
4a40: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
4a50: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
4a60: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
4a70: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
4a80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4a90: 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29  rp->rhs[i]==sp )
4aa0: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
4ab0: 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
4ac0: 65 2c 30 2c 0a 22 54 68 65 20 73 74 61 72 74 20  e,0,."The start 
4ad0: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63  symbol \"%s\" oc
4ae0: 63 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69  curs on the \.ri
4af0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
4b00: 20 61 20 72 75 6c 65 2e 20 54 68 69 73 20 77 69   a rule. This wi
4b10: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 20 70  ll result in a p
4b20: 61 72 73 65 72 20 77 68 69 63 68 20 5c 0a 64 6f  arser which \.do
4b30: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70  es not work prop
4b40: 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29  erly.",sp->name)
4b50: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ;.        lemp->
4b60: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
4b70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
4b80: 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f   /* The basis co
4b90: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 20  nfiguration set 
4ba0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 73 74  for the first st
4bb0: 61 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20  ate.  ** is all 
4bc0: 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65  rules which have
4bd0: 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f   the start symbo
4be0: 6c 20 61 73 20 74 68 65 69 72 0a 20 20 2a 2a 20  l as their.  ** 
4bf0: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 2a  left-hand side *
4c00: 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72  /.  for(rp=sp->r
4c10: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
4c20: 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20 73 74  nextlhs){.    st
4c30: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
4c40: 63 66 70 3b 0a 20 20 20 20 6e 65 77 63 66 70 20  cfp;.    newcfp 
4c50: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
4c60: 62 61 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20  basis(rp,0);.   
4c70: 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e   SetAdd(newcfp->
4c80: 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  fws,0);.  }..  /
4c90: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69  * Compute the fi
4ca0: 72 73 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20  rst state.  All 
4cb0: 6f 74 68 65 72 20 73 74 61 74 65 73 20 77 69 6c  other states wil
4cc0: 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74  l be.  ** comput
4cd0: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
4ce0: 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70   during the comp
4cf0: 75 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  utation of the f
4d00: 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54  irst one..  ** T
4d10: 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
4d20: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ter to the first
4d30: 20 73 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73   state is not us
4d40: 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ed. */.  (void)g
4d50: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20  etstate(lemp);. 
4d60: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
4d70: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
4d80: 74 6f 20 61 20 73 74 61 74 65 20 77 68 69 63 68  to a state which
4d90: 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79   is described by
4da0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
4db0: 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68  on.** list which
4dc0: 20 68 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20   has been built 
4dd0: 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f  from calls to Co
4de0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f  nfiglist_add..*/
4df0: 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75  .PRIVATE void bu
4e00: 69 6c 64 73 68 69 66 74 73 28 2f 2a 20 73 74 72  ildshifts(/* str
4e10: 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72  uct lemon *, str
4e20: 75 63 74 20 73 74 61 74 65 20 2a 20 2a 2f 29 3b  uct state * */);
4e30: 20 2f 2a 20 46 6f 72 77 64 20 72 65 66 20 2a 2f   /* Forwd ref */
4e40: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
4e50: 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28  state *getstate(
4e60: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
4e70: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
4e80: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
4e90: 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75 63 74 20  , *bp;.  struct 
4ea0: 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20 20 2f  state *stp;..  /
4eb0: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6f  * Extract the so
4ec0: 72 74 65 64 20 62 61 73 69 73 20 6f 66 20 74 68  rted basis of th
4ed0: 65 20 6e 65 77 20 73 74 61 74 65 2e 20 20 54 68  e new state.  Th
4ee0: 65 20 62 61 73 69 73 20 77 61 73 20 63 6f 6e 73  e basis was cons
4ef0: 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 62 79 20  tructed.  ** by 
4f00: 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 22  prior calls to "
4f10: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
4f20: 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e  sis()". */.  Con
4f30: 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69  figlist_sortbasi
4f40: 73 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f 6e 66  s();.  bp = Conf
4f50: 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 3b 0a  iglist_basis();.
4f60: 0a 20 20 2f 2a 20 47 65 74 20 61 20 73 74 61 74  .  /* Get a stat
4f70: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
4f80: 62 61 73 69 73 20 2a 2f 0a 20 20 73 74 70 20 3d  basis */.  stp =
4f90: 20 53 74 61 74 65 5f 66 69 6e 64 28 62 70 29 3b   State_find(bp);
4fa0: 0a 20 20 69 66 28 20 73 74 70 20 29 7b 0a 20 20  .  if( stp ){.  
4fb0: 20 20 2f 2a 20 41 20 73 74 61 74 65 20 77 69 74    /* A state wit
4fc0: 68 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73  h the same basis
4fd0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 21   already exists!
4fe0: 20 20 43 6f 70 79 20 61 6c 6c 20 74 68 65 20 66    Copy all the f
4ff0: 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20 2a 2a  ollow-set.    **
5000: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
5010: 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ks from the stat
5020: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
5030: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20  tion into the.  
5040: 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67    ** preexisting
5050: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 72 65 74   state, then ret
5060: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
5070: 20 74 68 65 20 70 72 65 65 78 69 73 74 69 6e 67   the preexisting
5080: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74   state */.    st
5090: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 78 2c 20  ruct config *x, 
50a0: 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d 62 70  *y;.    for(x=bp
50b0: 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78 20 26  , y=stp->bp; x &
50c0: 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20 79 3d  & y; x=x->bp, y=
50d0: 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20 50 6c  y->bp){.      Pl
50e0: 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62 70 6c  ink_copy(&y->bpl
50f0: 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20 20 20  p,x->bplp);.    
5100: 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 78    Plink_delete(x
5110: 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20 20 78  ->fplp);.      x
5120: 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70 6c 70  ->fplp = x->bplp
5130: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
5140: 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfp = Configlist
5150: 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20 20 20 43  _return();.    C
5160: 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 63 66  onfiglist_eat(cf
5170: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
5180: 20 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c 79 20   /* This really 
5190: 69 73 20 61 20 6e 65 77 20 73 74 61 74 65 2e 20  is a new state. 
51a0: 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 74   Construct all t
51b0: 68 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a 20 20  he details */.  
51c0: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f    Configlist_clo
51d0: 73 75 72 65 28 6c 65 6d 70 29 3b 20 20 20 20 2f  sure(lemp);    /
51e0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
51f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73  nfiguration clos
5200: 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69  ure */.    Confi
5210: 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20 20 20  glist_sort();   
5220: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 20          /* Sort 
5230: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
5240: 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20  n closure */.   
5250: 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73   cfp = Configlis
5260: 74 5f 72 65 74 75 72 6e 28 29 3b 20 20 20 2f 2a  t_return();   /*
5270: 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74   Get a pointer t
5280: 6f 20 74 68 65 20 63 6f 6e 66 69 67 20 6c 69 73  o the config lis
5290: 74 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 53  t */.    stp = S
52a0: 74 61 74 65 5f 6e 65 77 28 29 3b 20 20 20 20 20  tate_new();     
52b0: 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73        /* A new s
52c0: 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20 2a  tate structure *
52d0: 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63  /.    MemoryChec
52e0: 6b 28 73 74 70 29 3b 0a 20 20 20 20 73 74 70 2d  k(stp);.    stp-
52f0: 3e 62 70 20 3d 20 62 70 3b 20 20 20 20 20 20 20  >bp = bp;       
5300: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65           /* Reme
5310: 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75  mber the configu
5320: 72 61 74 69 6f 6e 20 62 61 73 69 73 20 2a 2f 0a  ration basis */.
5330: 20 20 20 20 73 74 70 2d 3e 63 66 70 20 3d 20 63      stp->cfp = c
5340: 66 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fp;             
5350: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
5360: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
5370: 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 73 74  losure */.    st
5380: 70 2d 3e 69 6e 64 65 78 20 3d 20 6c 65 6d 70 2d  p->index = lemp-
5390: 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a 20 45 76  >nstate++; /* Ev
53a0: 65 72 79 20 73 74 61 74 65 20 67 65 74 73 20 61  ery state gets a
53b0: 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65 72   sequence number
53c0: 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20   */.    stp->ap 
53d0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
53e0: 20 20 20 20 20 2f 2a 20 4e 6f 20 61 63 74 69 6f       /* No actio
53f0: 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a 20 20 20 20  ns, yet. */.    
5400: 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74 70  State_insert(stp
5410: 2c 73 74 70 2d 3e 62 70 29 3b 20 20 20 2f 2a 20  ,stp->bp);   /* 
5420: 41 64 64 20 74 6f 20 74 68 65 20 73 74 61 74 65  Add to the state
5430: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 62 75   table */.    bu
5440: 69 6c 64 73 68 69 66 74 73 28 6c 65 6d 70 2c 73  ildshifts(lemp,s
5450: 74 70 29 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  tp);       /* Re
5460: 63 75 72 73 69 76 65 6c 79 20 63 6f 6d 70 75 74  cursively comput
5470: 65 20 73 75 63 63 65 73 73 6f 72 20 73 74 61 74  e successor stat
5480: 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  es */.  }.  retu
5490: 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f  rn stp;.}../* Co
54a0: 6e 73 74 72 75 63 74 20 61 6c 6c 20 73 75 63 63  nstruct all succ
54b0: 65 73 73 6f 72 20 73 74 61 74 65 73 20 74 6f 20  essor states to 
54c0: 74 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 2e  the given state.
54d0: 20 20 41 20 22 73 75 63 63 65 73 73 6f 72 22 0a    A "successor".
54e0: 2a 2a 20 73 74 61 74 65 20 69 73 20 61 6e 79 20  ** state is any 
54f0: 73 74 61 74 65 20 77 68 69 63 68 20 63 61 6e 20  state which can 
5500: 62 65 20 72 65 61 63 68 65 64 20 62 79 20 61 20  be reached by a 
5510: 73 68 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f  shift action..*/
5520: 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75  .PRIVATE void bu
5530: 69 6c 64 73 68 69 66 74 73 28 6c 65 6d 70 2c 73  ildshifts(lemp,s
5540: 74 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  tp).struct lemon
5550: 20 2a 6c 65 6d 70 3b 0a 73 74 72 75 63 74 20 73   *lemp;.struct s
5560: 74 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f  tate *stp;     /
5570: 2a 20 54 68 65 20 73 74 61 74 65 20 66 72 6f 6d  * The state from
5580: 20 77 68 69 63 68 20 73 75 63 63 65 73 73 6f 72   which successor
5590: 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 20 2a  s are computed *
55a0: 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  /.{.  struct con
55b0: 66 69 67 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f  fig *cfp;  /* Fo
55c0: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 75 20 74  r looping thru t
55d0: 68 65 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72  he config closur
55e0: 65 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20  e of "stp" */.  
55f0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
5600: 63 66 70 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20  cfp; /* For the 
5610: 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f  inner loop on co
5620: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
5630: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
5640: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 3b 20 20  t config *new;  
5650: 2f 2a 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  /* */.  struct s
5660: 79 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20  ymbol *sp;   /* 
5670: 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67  Symbol following
5680: 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66   the dot in conf
5690: 69 67 75 72 61 74 69 6f 6e 20 22 63 66 70 22 20  iguration "cfp" 
56a0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
56b0: 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d  ol *bsp;  /* Sym
56c0: 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  bol following th
56d0: 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75  e dot in configu
56e0: 72 61 74 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f  ration "bcfp" */
56f0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
5700: 2a 6e 65 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f  *newstp; /* A po
5710: 69 6e 74 65 72 20 74 6f 20 61 20 73 75 63 63 65  inter to a succe
5720: 73 73 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20  ssor state */.. 
5730: 20 2f 2a 20 45 61 63 68 20 63 6f 6e 66 69 67 75   /* Each configu
5740: 72 61 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63  ration becomes c
5750: 6f 6d 70 6c 65 74 65 20 61 66 74 65 72 20 69 74  omplete after it
5760: 20 63 6f 6e 74 69 62 75 74 65 73 20 74 6f 20 61   contibutes to a
5770: 20 73 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20   successor.  ** 
5780: 73 74 61 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c  state.  Initiall
5790: 79 2c 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61  y, all configura
57a0: 74 69 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70  tions are incomp
57b0: 6c 65 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66  lete */.  for(cf
57c0: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
57d0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20   cfp=cfp->next) 
57e0: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e  cfp->status = IN
57f0: 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20  COMPLETE;..  /* 
5800: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c  Loop through all
5810: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
5820: 6f 66 20 74 68 65 20 73 74 61 74 65 20 22 73 74  of the state "st
5830: 70 22 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d  p" */.  for(cfp=
5840: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
5850: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
5860: 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74     if( cfp->stat
5870: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
5880: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41  ontinue;    /* A
5890: 6c 72 65 61 64 79 20 75 73 65 64 20 62 79 20 69  lready used by i
58a0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nner loop */.   
58b0: 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63   if( cfp->dot>=c
58c0: 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63  fp->rp->nrhs ) c
58d0: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e  ontinue;  /* Can
58e0: 27 74 20 73 68 69 66 74 20 74 68 69 73 20 63 6f  't shift this co
58f0: 6e 66 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66  nfig */.    Conf
5900: 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 3b 20  iglist_reset(); 
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68       /* Reset th
5930: 65 20 6e 65 77 20 63 6f 6e 66 69 67 20 73 65 74  e new config set
5940: 20 2a 2f 0a 20 20 20 20 73 70 20 3d 20 63 66 70   */.    sp = cfp
5950: 2d 3e 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64  ->rp->rhs[cfp->d
5960: 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  ot];            
5970: 20 2f 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65 72   /* Symbol after
5980: 20 74 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20   the dot */..   
5990: 20 2f 2a 20 46 6f 72 20 65 76 65 72 79 20 63 6f   /* For every co
59a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74  nfiguration in t
59b0: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77  he state "stp" w
59c0: 68 69 63 68 20 68 61 73 20 74 68 65 20 73 79 6d  hich has the sym
59d0: 62 6f 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a 20  bol "sp".    ** 
59e0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f  following its do
59f0: 74 2c 20 61 64 64 20 74 68 65 20 73 61 6d 65 20  t, add the same 
5a00: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
5a10: 20 74 68 65 20 62 61 73 69 73 20 73 65 74 20 75   the basis set u
5a20: 6e 64 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  nder.    ** cons
5a30: 74 72 75 63 74 69 6f 6e 20 62 75 74 20 77 69 74  truction but wit
5a40: 68 20 74 68 65 20 64 6f 74 20 73 68 69 66 74 65  h the dot shifte
5a50: 64 20 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20  d one symbol to 
5a60: 74 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  the right. */.  
5a70: 20 20 66 6f 72 28 62 63 66 70 3d 63 66 70 3b 20    for(bcfp=cfp; 
5a80: 62 63 66 70 3b 20 62 63 66 70 3d 62 63 66 70 2d  bcfp; bcfp=bcfp-
5a90: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
5aa0: 28 20 62 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  ( bcfp->status==
5ab0: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
5ac0: 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61  nue;    /* Alrea
5ad0: 64 79 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  dy used */.     
5ae0: 20 69 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d   if( bcfp->dot>=
5af0: 62 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29  bcfp->rp->nrhs )
5b00: 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61   continue; /* Ca
5b10: 6e 27 74 20 73 68 69 66 74 20 74 68 69 73 20 6f  n't shift this o
5b20: 6e 65 20 2a 2f 0a 20 20 20 20 20 20 62 73 70 20  ne */.      bsp 
5b30: 3d 20 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b  = bcfp->rp->rhs[
5b40: 62 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20  bcfp->dot];     
5b50: 20 20 20 20 20 20 2f 2a 20 47 65 74 20 73 79 6d        /* Get sym
5b60: 62 6f 6c 20 61 66 74 65 72 20 64 6f 74 20 2a 2f  bol after dot */
5b70: 0a 20 20 20 20 20 20 69 66 28 20 62 73 70 21 3d  .      if( bsp!=
5b80: 73 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  sp ) continue;  
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 20 2f 2a 20 4d 75 73 74 20 62 65 20 73 61 6d 65   /* Must be same
5bb0: 20 61 73 20 66 6f 72 20 22 63 66 70 22 20 2a 2f   as for "cfp" */
5bc0: 0a 20 20 20 20 20 20 62 63 66 70 2d 3e 73 74 61  .      bcfp->sta
5bd0: 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20  tus = COMPLETE; 
5be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bf0: 20 2f 2a 20 4d 61 72 6b 20 74 68 69 73 20 63 6f   /* Mark this co
5c00: 6e 66 69 67 20 61 73 20 75 73 65 64 20 2a 2f 0a  nfig as used */.
5c10: 20 20 20 20 20 20 6e 65 77 20 3d 20 43 6f 6e 66        new = Conf
5c20: 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28  iglist_addbasis(
5c30: 62 63 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64  bcfp->rp,bcfp->d
5c40: 6f 74 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69  ot+1);.      Pli
5c50: 6e 6b 5f 61 64 64 28 26 6e 65 77 2d 3e 62 70 6c  nk_add(&new->bpl
5c60: 70 2c 62 63 66 70 29 3b 0a 20 20 20 20 7d 0a 0a  p,bcfp);.    }..
5c70: 20 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69      /* Get a poi
5c80: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 74 61 74  nter to the stat
5c90: 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74  e described by t
5ca0: 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  he basis configu
5cb0: 72 61 74 69 6f 6e 20 73 65 74 0a 20 20 20 20 2a  ration set.    *
5cc0: 2a 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  * constructed in
5cd0: 20 74 68 65 20 70 72 65 63 65 64 69 6e 67 20 6c   the preceding l
5ce0: 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e 65 77 73 74  oop */.    newst
5cf0: 70 20 3d 20 67 65 74 73 74 61 74 65 28 6c 65 6d  p = getstate(lem
5d00: 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  p);..    /* The 
5d10: 73 74 61 74 65 20 22 6e 65 77 73 74 70 22 20 69  state "newstp" i
5d20: 73 20 72 65 61 63 68 65 64 20 66 72 6f 6d 20 74  s reached from t
5d30: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 62  he state "stp" b
5d40: 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e  y a shift action
5d50: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73  .    ** on the s
5d60: 79 6d 62 6f 6c 20 22 73 70 22 20 2a 2f 0a 20 20  ymbol "sp" */.  
5d70: 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74    Action_add(&st
5d80: 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70 2c 6e  p->ap,SHIFT,sp,n
5d90: 65 77 73 74 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ewstp);.  }.}../
5da0: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 74  *.** Construct t
5db0: 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  he propagation l
5dc0: 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  inks.*/.void Fin
5dd0: 64 4c 69 6e 6b 73 28 6c 65 6d 70 29 0a 73 74 72  dLinks(lemp).str
5de0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
5df0: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  .{.  int i;.  st
5e00: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
5e10: 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74 72 75  , *other;.  stru
5e20: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
5e30: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70   struct plink *p
5e40: 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73 65 6b  lp;..  /* Housek
5e50: 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a 0a 20  eeping detail:. 
5e60: 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65 72 79   ** Add to every
5e70: 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b 20   propagate link 
5e80: 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 20 74  a pointer back t
5e90: 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f 0a 20  o the state to. 
5ea0: 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20 6c 69   ** which the li
5eb0: 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64 2e 20  nk is attached. 
5ec0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
5ed0: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
5ee0: 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
5ef0: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
5f00: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
5f10: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
5f20: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
5f30: 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70 3b 0a  cfp->stp = stp;.
5f40: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
5f50: 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61 63 6b  Convert all back
5f60: 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72 77 61  links into forwa
5f70: 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c 79 20  rd links.  Only 
5f80: 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20 2a 2a  the forward.  **
5f90: 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65 64 20   links are used 
5fa0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  in the follow-se
5fb0: 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20 2a  t computation. *
5fc0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
5fd0: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
5fe0: 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
5ff0: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
6000: 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63    for(cfp=stp->c
6010: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
6020: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66  ->next){.      f
6030: 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70 6c 70  or(plp=cfp->bplp
6040: 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e  ; plp; plp=plp->
6050: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 6f  next){.        o
6060: 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66 70 3b  ther = plp->cfp;
6070: 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61  .        Plink_a
6080: 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c 70 2c  dd(&other->fplp,
6090: 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cfp);.      }.  
60a0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f    }.  }.}../* Co
60b0: 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c 6f 77  mpute all follow
60c0: 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 66 6f  sets..**.** A fo
60d0: 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65 20 73  llowset is the s
60e0: 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62 6f 6c  et of all symbol
60f0: 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f 6d 65  s which can come
6100: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
6110: 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67 75 72  after a configur
6120: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 46  ation..*/.void F
6130: 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 6c 65  indFollowSets(le
6140: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
6150: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
6160: 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  i;.  struct conf
6170: 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63  ig *cfp;.  struc
6180: 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20  t plink *plp;.  
6190: 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 20 20  int progress;.  
61a0: 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20 66  int change;..  f
61b0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
61c0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
61d0: 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e    for(cfp=lemp->
61e0: 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20  sorted[i]->cfp; 
61f0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
6200: 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e  xt){.      cfp->
6210: 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c  status = INCOMPL
6220: 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ETE;.    }.  }. 
6230: 20 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67   .  do{.    prog
6240: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
6250: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
6260: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
6270: 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d     for(cfp=lemp-
6280: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b  >sorted[i]->cfp;
6290: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
62a0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
62b0: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
62c0: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
62d0: 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ue;.        for(
62e0: 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70  plp=cfp->fplp; p
62f0: 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78  lp; plp=plp->nex
6300: 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68  t){.          ch
6310: 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28  ange = SetUnion(
6320: 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66  plp->cfp->fws,cf
6330: 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20 20  p->fws);.       
6340: 20 20 20 69 66 28 20 63 68 61 6e 67 65 20 29 7b     if( change ){
6350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 70  .            plp
6360: 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20  ->cfp->status = 
6370: 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20  INCOMPLETE;.    
6380: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
6390: 20 3d 20 31 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20   = 1;..  }..}.  
63a0: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
63b0: 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20  s = COMPLETE;.  
63c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
63d0: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
63e0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
63f0: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
6400: 28 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20  ();../* Compute 
6410: 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f  the reduce actio
6420: 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76 65 20  ns, and resolve 
6430: 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f  conflicts..*/.vo
6440: 69 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 6c  id FindActions(l
6450: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
6460: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
6470: 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63 74 20 63   i,j;.  struct c
6480: 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74  onfig *cfp;.  st
6490: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
64a0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
64b0: 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72   *sp;.  struct r
64c0: 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f 2a 20 41  ule *rp;..  /* A
64d0: 64 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65  dd all of the re
64e0: 64 75 63 65 20 61 63 74 69 6f 6e 73 20 0a 20 20  duce actions .  
64f0: 2a 2a 20 41 20 72 65 64 75 63 65 20 61 63 74 69  ** A reduce acti
6500: 6f 6e 20 69 73 20 61 64 64 65 64 20 66 6f 72 20  on is added for 
6510: 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20  each element of 
6520: 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20 6f 66  the followset of
6530: 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67 75 72  .  ** a configur
6540: 61 74 69 6f 6e 20 77 68 69 63 68 20 68 61 73 20  ation which has 
6550: 69 74 73 20 64 6f 74 20 61 74 20 74 68 65 20 65  its dot at the e
6560: 78 74 72 65 6d 65 20 72 69 67 68 74 2e 0a 20 20  xtreme right..  
6570: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
6580: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
6590: 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76  +){   /* Loop ov
65a0: 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20 2a 2f  er all states */
65b0: 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
65c0: 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
65d0: 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70  for(cfp=stp->cfp
65e0: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
65f0: 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20  next){  /* Loop 
6600: 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69 67 75  over all configu
6610: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  rations */.     
6620: 20 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e 6e 72   if( cfp->rp->nr
6630: 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 7b 20  hs==cfp->dot ){ 
6640: 20 20 20 20 20 20 20 2f 2a 20 49 73 20 64 6f 74         /* Is dot
6650: 20 61 74 20 65 78 74 72 65 6d 65 20 72 69 67 68   at extreme righ
6660: 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  t? */.        fo
6670: 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e  r(j=0; j<lemp->n
6680: 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a  terminal; j++){.
6690: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 65            if( Se
66a0: 74 46 69 6e 64 28 63 66 70 2d 3e 66 77 73 2c 6a  tFind(cfp->fws,j
66b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
66c0: 20 2f 2a 20 41 64 64 20 61 20 72 65 64 75 63 65   /* Add a reduce
66d0: 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 73   action to the s
66e0: 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68  tate "stp" which
66f0: 20 77 69 6c 6c 20 72 65 64 75 63 65 20 62 79 20   will reduce by 
6700: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  the.            
6710: 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e 72 70  ** rule "cfp->rp
6720: 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65  " if the lookahe
6730: 61 64 20 73 79 6d 62 6f 6c 20 69 73 20 22 6c 65  ad symbol is "le
6740: 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 22 20  mp->symbols[j]" 
6750: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  */.            A
6760: 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e  ction_add(&stp->
6770: 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70 2d 3e  ap,REDUCE,lemp->
6780: 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 63 66 70 2d 3e  symbols[j],cfp->
6790: 72 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rp);.          }
67a0: 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ..}.      }.    
67b0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  }.  }..  /* Add 
67c0: 74 68 65 20 61 63 63 65 70 74 69 6e 67 20 74 6f  the accepting to
67d0: 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  ken */.  if( lem
67e0: 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20  p->start ){.    
67f0: 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
6800: 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20  (lemp->start);. 
6810: 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 20 73     if( sp==0 ) s
6820: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
6830: 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lhs;.  }else{.  
6840: 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c    sp = lemp->rul
6850: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a  e->lhs;.  }.  /*
6860: 20 41 64 64 20 74 6f 20 74 68 65 20 66 69 72 73   Add to the firs
6870: 74 20 73 74 61 74 65 20 28 77 68 69 63 68 20 69  t state (which i
6880: 73 20 61 6c 77 61 79 73 20 74 68 65 20 73 74 61  s always the sta
6890: 72 74 69 6e 67 20 73 74 61 74 65 20 6f 66 20 74  rting state of t
68a0: 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74 65 20 73  he.  ** finite s
68b0: 74 61 74 65 20 6d 61 63 68 69 6e 65 29 20 61 6e  tate machine) an
68c0: 20 61 63 74 69 6f 6e 20 74 6f 20 41 43 43 45 50   action to ACCEP
68d0: 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65  T if the lookahe
68e0: 61 64 20 69 73 20 74 68 65 0a 20 20 2a 2a 20 73  ad is the.  ** s
68f0: 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  tart nonterminal
6900: 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61  .  */.  Action_a
6910: 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  dd(&lemp->sorted
6920: 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73  [0]->ap,ACCEPT,s
6930: 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f  p,0);..  /* Reso
6940: 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f  lve conflicts */
6950: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
6960: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
6970: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63 74  {.    struct act
6980: 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20  ion *ap, *nap;. 
6990: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20     struct state 
69a0: 2a 73 74 70 3b 0a 20 20 20 20 73 74 70 20 3d 20  *stp;.    stp = 
69b0: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
69c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74 70  .    assert( stp
69d0: 2d 3e 61 70 20 29 3b 0a 20 20 20 20 73 74 70 2d  ->ap );.    stp-
69e0: 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72  >ap = Action_sor
69f0: 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20  t(stp->ap);.    
6a00: 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
6a10: 61 70 20 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20  ap && ap->next; 
6a20: 61 70 3d 6e 61 70 29 7b 0a 20 20 20 20 20 20 66  ap=nap){.      f
6a30: 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  or(nap=ap->next;
6a40: 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d   nap && nap->sp=
6a50: 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70  =ap->sp; nap=nap
6a60: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
6a70: 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74    /* The two act
6a80: 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e  ions "ap" and "n
6a90: 61 70 22 20 68 61 76 65 20 74 68 65 20 73 61 6d  ap" have the sam
6aa0: 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20  e lookahead..   
6ab0: 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20        ** Figure 
6ac0: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68  out which one sh
6ad0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a  ould be used */.
6ae0: 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e           lemp->n
6af0: 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f  conflict += reso
6b00: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c  lve_conflict(ap,
6b10: 6e 61 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  nap,lemp->errsym
6b20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
6b30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72  .  }..  /* Repor
6b40: 74 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65  t an error for e
6b50: 61 63 68 20 72 75 6c 65 20 74 68 61 74 20 63 61  ach rule that ca
6b60: 6e 20 6e 65 76 65 72 20 62 65 20 72 65 64 75 63  n never be reduc
6b70: 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ed. */.  for(rp=
6b80: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
6b90: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d  rp=rp->next) rp-
6ba0: 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 46 41 4c  >canReduce = FAL
6bb0: 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  SE;.  for(i=0; i
6bc0: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
6bd0: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
6be0: 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20  action *ap;.    
6bf0: 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72  for(ap=lemp->sor
6c00: 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20  ted[i]->ap; ap; 
6c10: 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
6c20: 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
6c30: 3d 3d 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78  ==REDUCE ) ap->x
6c40: 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d  .rp->canReduce =
6c50: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
6c60: 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
6c70: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
6c80: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
6c90: 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 29 20  rp->canReduce ) 
6ca0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45 72  continue;.    Er
6cb0: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
6cc0: 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
6cd0: 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20 63 61  ne,"This rule ca
6ce0: 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64  n not be reduced
6cf0: 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  .\n");.    lemp-
6d00: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d  >errorcnt++;.  }
6d10: 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61  .}../* Resolve a
6d20: 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77 65 65   conflict betwee
6d30: 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20  n the two given 
6d40: 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  actions.  If the
6d50: 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e  .** conflict can
6d60: 27 74 20 62 65 20 72 65 73 6f 6c 76 65 2c 20 72  't be resolve, r
6d70: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
6d80: 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20  **.** NO LONGER 
6d90: 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72 65  TRUE:.**   To re
6da0: 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74  solve a conflict
6db0: 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f 20  , first look to 
6dc0: 73 65 65 20 69 66 20 65 69 74 68 65 72 20 61 63  see if either ac
6dd0: 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e 20  tion.**   is on 
6de0: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20  an error rule.  
6df0: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 61  In that case, ta
6e00: 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77 68  ke the action wh
6e10: 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ich.**   is not 
6e20: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6e30: 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e 20  the error rule. 
6e40: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20 62   If neither or b
6e50: 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e 73  oth.**   actions
6e60: 20 61 72 65 20 61 73 73 6f 63 69 61 74 65 64 20   are associated 
6e70: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72 75  with an error ru
6e80: 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 0a  le, then try to.
6e90: 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65 64 65  **   use precede
6ea0: 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  nce to resolve t
6eb0: 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a  he conflict..**.
6ec0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61 63 74  ** If either act
6ed0: 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c 20  ion is a SHIFT, 
6ee0: 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20  then it must be 
6ef0: 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66 75  apx.  This.** fu
6f00: 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f 72  nction won't wor
6f10: 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d 3d  k if apx->type==
6f20: 52 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d 3e  REDUCE and apy->
6f30: 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a  type==SHIFT..*/.
6f40: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
6f50: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 78 2c  ve_conflict(apx,
6f60: 61 70 79 2c 65 72 72 73 79 6d 29 0a 73 74 72 75  apy,errsym).stru
6f70: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 78 3b 0a  ct action *apx;.
6f80: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
6f90: 70 79 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  py;.struct symbo
6fa0: 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20  l *errsym;   /* 
6fb0: 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c  The error symbol
6fc0: 20 28 69 66 20 64 65 66 69 6e 65 64 2e 20 20 4e   (if defined.  N
6fd0: 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 29 20 2a  ULL otherwise) *
6fe0: 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  /.{.  struct sym
6ff0: 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79 3b 0a  bol *spx, *spy;.
7000: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
7010: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 78 2d  ;.  assert( apx-
7020: 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29 3b 20  >sp==apy->sp ); 
7030: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68   /* Otherwise th
7040: 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e 6f 20  ere would be no 
7050: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 66  conflict */.  if
7060: 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49  ( apx->type==SHI
7070: 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d  FT && apy->type=
7080: 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73  =REDUCE ){.    s
7090: 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20 20  px = apx->sp;.  
70a0: 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72    spy = apy->x.r
70b0: 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20  p->precsym;.    
70c0: 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70  if( spy==0 || sp
70d0: 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 79  x->prec<0 || spy
70e0: 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20 20 20 20  ->prec<0 ){.    
70f0: 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68 20    /* Not enough 
7100: 70 72 65 63 65 64 65 6e 63 65 20 69 6e 66 6f 72  precedence infor
7110: 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  mation. */.     
7120: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e   apy->type = CON
7130: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
7140: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
7150: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
7160: 70 79 2d 3e 70 72 65 63 20 29 7b 20 20 20 20 2f  py->prec ){    /
7170: 2a 20 4c 6f 77 65 72 20 70 72 65 63 65 64 65 6e  * Lower preceden
7180: 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20 20  ce wins */.     
7190: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f   apy->type = RD_
71a0: 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65  RESOLVED;.    }e
71b0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
71c0: 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c<spy->prec ){. 
71d0: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
71e0: 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   SH_RESOLVED;.  
71f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
7200: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
7210: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
7220: 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65 20  RIGHT ){ /* Use 
7230: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
7240: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
7250: 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20 20  _RESOLVED;      
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7270: 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63 69         /* associ
7280: 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20 7d  ativity */.    }
7290: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
72a0: 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26  ec==spy->prec &&
72b0: 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46   spx->assoc==LEF
72c0: 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65 61  T ){  /* to brea
72d0: 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20 61  k tie */.      a
72e0: 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45  px->type = SH_RE
72f0: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SOLVED;.    }els
7300: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
7310: 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d   spx->prec==spy-
7320: 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73  >prec && spx->as
7330: 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20  soc==NONE );.   
7340: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 43     apy->type = C
7350: 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65  ONFLICT;.      e
7360: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  rrcnt++;.    }. 
7370: 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78 2d 3e   }else if( apx->
7380: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20  type==REDUCE && 
7390: 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apy->type==REDUC
73a0: 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d 20 61  E ){.    spx = a
73b0: 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  px->x.rp->precsy
73c0: 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79  m;.    spy = apy
73d0: 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b  ->x.rp->precsym;
73e0: 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d 30 20  .    if( spx==0 
73f0: 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78  || spy==0 || spx
7400: 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20 20 20  ->prec<0 ||.    
7410: 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73  spy->prec<0 || s
7420: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
7430: 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79  rec ){.      apy
7440: 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46 4c 49 43  ->type = CONFLIC
7450: 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b  T;.      errcnt+
7460: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
7470: 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e   spx->prec>spy->
7480: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
7490: 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53  y->type = RD_RES
74a0: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
74b0: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3c 73   if( spx->prec<s
74c0: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
74d0: 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 52 44    apx->type = RD
74e0: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
74f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7500: 20 43 61 6e 27 74 20 68 61 70 70 65 6e 2e 20 20   Can't happen.  
7510: 53 68 69 66 74 73 20 68 61 76 65 20 74 6f 20 63  Shifts have to c
7520: 6f 6d 65 20 62 65 66 6f 72 65 20 52 65 64 75 63  ome before Reduc
7530: 65 73 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  es on the.    **
7540: 20 6c 69 73 74 20 62 65 63 61 75 73 65 20 74 68   list because th
7550: 65 20 72 65 64 75 63 65 73 20 77 65 72 65 20 61  e reduces were a
7560: 64 64 65 64 20 6c 61 73 74 2e 20 20 48 65 6e 63  dded last.  Henc
7570: 65 2c 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d  e, if apx->type=
7580: 3d 52 45 44 55 43 45 0a 20 20 20 20 2a 2a 20 74  =REDUCE.    ** t
7590: 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 73 73  hen it is imposs
75a0: 69 62 6c 65 20 66 6f 72 20 61 70 79 2d 3e 74 79  ible for apy->ty
75b0: 70 65 3d 3d 53 48 49 46 54 20 2a 2f 0a 20 20 7d  pe==SHIFT */.  }
75c0: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74  .  return errcnt
75d0: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
75e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
75f0: 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67  the file "config
7600: 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  list.c" ********
7610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7620: 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  */./*.** Routine
7630: 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e 67 20  s to processing 
7640: 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  a configuration 
7650: 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64 69 6e  list and buildin
7660: 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e 20  g a state.** in 
7670: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
7680: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
7690: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
76a0: 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74 20 3d  nfig *freelist =
76b0: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74   0;      /* List
76c0: 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69 67 75   of free configu
76d0: 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
76e0: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
76f0: 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  *current = 0;   
7700: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69      /* Top of li
7710: 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74  st of configurat
7720: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  ions */.static s
7730: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 63  truct config **c
7740: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20 20  urrentend = 0;  
7750: 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73 74   /* Last on list
7760: 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73   of configs */.s
7770: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
7780: 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30 3b 20  fig *basis = 0; 
7790: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
77a0: 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20  f list of basis 
77b0: 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69  configs */.stati
77c0: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
77d0: 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 20  **basisend = 0; 
77e0: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 69      /* End of li
77f0: 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66  st of basis conf
7800: 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72  igs */../* Retur
7810: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
7820: 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69   new configurati
7830: 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 73 74  on */.PRIVATE st
7840: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
7850: 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74 72 75  config(){.  stru
7860: 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 3b 0a  ct config *new;.
7870: 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d    if( freelist==
7880: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
7890: 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 33 3b      int amt = 3;
78a0: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
78b0: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
78c0: 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
78d0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 2a 61  struct config)*a
78e0: 6d 74 20 29 3b 0a 20 20 20 20 69 66 28 20 66 72  mt );.    if( fr
78f0: 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
7900: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
7910: 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  r,"Unable to all
7920: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
7930: 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61   a new configura
7940: 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65  tion.");.      e
7950: 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
7960: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74    for(i=0; i<amt
7970: 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73  -1; i++) freelis
7980: 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65  t[i].next = &fre
7990: 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
79a0: 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e  freelist[amt-1].
79b0: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  next = 0;.  }.  
79c0: 6e 65 77 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a  new = freelist;.
79d0: 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65    freelist = fre
79e0: 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72  elist->next;.  r
79f0: 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a  eturn new;.}../*
7a00: 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   The configurati
7a10: 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f 20 6c  on "old" is no l
7a20: 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a 50 52  onger used */.PR
7a30: 49 56 41 54 45 20 76 6f 69 64 20 64 65 6c 65 74  IVATE void delet
7a40: 65 63 6f 6e 66 69 67 28 6f 6c 64 29 0a 73 74 72  econfig(old).str
7a50: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
7a60: 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d  .{.  old->next =
7a70: 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65   freelist;.  fre
7a80: 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a  elist = old;.}..
7a90: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74  /* Initialized t
7aa0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
7ab0: 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f   list builder */
7ac0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
7ad0: 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75 72 72 65  _init(){.  curre
7ae0: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
7af0: 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b  tend = &current;
7b00: 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20  .  basis = 0;.  
7b10: 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69  basisend = &basi
7b20: 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65  s;.  Configtable
7b30: 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74 75 72  _init();.  retur
7b40: 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  n;.}../* Initial
7b50: 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75  ized the configu
7b60: 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c  ration list buil
7b70: 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  der */.void Conf
7b80: 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 7b 0a  iglist_reset(){.
7b90: 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20    current = 0;. 
7ba0: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
7bb0: 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20  urrent;.  basis 
7bc0: 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  = 0;.  basisend 
7bd0: 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66  = &basis;.  Conf
7be0: 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 30 29  igtable_clear(0)
7bf0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
7c00: 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20 63 6f  * Add another co
7c10: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74  nfiguration to t
7c20: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
7c30: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
7c40: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
7c50: 73 74 5f 61 64 64 28 72 70 2c 64 6f 74 29 0a 73  st_add(rp,dot).s
7c60: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20  truct rule *rp; 
7c70: 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20 2a     /* The rule *
7c80: 2f 0a 69 6e 74 20 64 6f 74 3b 20 20 20 20 20 20  /.int dot;      
7c90: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
7ca0: 6e 74 6f 20 74 68 65 20 52 48 53 20 6f 66 20 74  nto the RHS of t
7cb0: 68 65 20 72 75 6c 65 20 77 68 65 72 65 20 74 68  he rule where th
7cc0: 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 7b 0a  e dot goes */.{.
7cd0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
7ce0: 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20  *cfp, model;..  
7cf0: 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65  assert( currente
7d00: 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c  nd!=0 );.  model
7d10: 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65  .rp = rp;.  mode
7d20: 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63  l.dot = dot;.  c
7d30: 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65  fp = Configtable
7d40: 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20  _find(&model);. 
7d50: 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20   if( cfp==0 ){. 
7d60: 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66     cfp = newconf
7d70: 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72  ig();.    cfp->r
7d80: 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d  p = rp;.    cfp-
7d90: 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20  >dot = dot;.    
7da0: 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65  cfp->fws = SetNe
7db0: 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74  w();.    cfp->st
7dc0: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
7dd0: 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70  fplp = cfp->bplp
7de0: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e   = 0;.    cfp->n
7df0: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  ext = 0;.    cfp
7e00: 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63  ->bp = 0;.    *c
7e10: 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b  urrentend = cfp;
7e20: 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20  .    currentend 
7e30: 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20  = &cfp->next;.  
7e40: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e    Configtable_in
7e50: 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20  sert(cfp);.  }. 
7e60: 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a   return cfp;.}..
7e70: 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73 20 63  /* Add a basis c
7e80: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
7e90: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
7ea0: 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  n list */.struct
7eb0: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
7ec0: 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70 2c  ist_addbasis(rp,
7ed0: 64 6f 74 29 0a 73 74 72 75 63 74 20 72 75 6c 65  dot).struct rule
7ee0: 20 2a 72 70 3b 0a 69 6e 74 20 64 6f 74 3b 0a 7b   *rp;.int dot;.{
7ef0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
7f00: 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20   *cfp, model;.. 
7f10: 20 61 73 73 65 72 74 28 20 62 61 73 69 73 65 6e   assert( basisen
7f20: 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d!=0 );.  assert
7f30: 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20  ( currentend!=0 
7f40: 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20  );.  model.rp = 
7f50: 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20  rp;.  model.dot 
7f60: 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43  = dot;.  cfp = C
7f70: 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28  onfigtable_find(
7f80: 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63  &model);.  if( c
7f90: 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70  fp==0 ){.    cfp
7fa0: 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a   = newconfig();.
7fb0: 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70      cfp->rp = rp
7fc0: 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d  ;.    cfp->dot =
7fd0: 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66   dot;.    cfp->f
7fe0: 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20  ws = SetNew();. 
7ff0: 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b     cfp->stp = 0;
8000: 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d  .    cfp->fplp =
8010: 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a   cfp->bplp = 0;.
8020: 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20      cfp->next = 
8030: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d  0;.    cfp->bp =
8040: 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74   0;.    *current
8050: 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63  end = cfp;.    c
8060: 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70  urrentend = &cfp
8070: 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61 73  ->next;.    *bas
8080: 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  isend = cfp;.   
8090: 20 62 61 73 69 73 65 6e 64 20 3d 20 26 63 66 70   basisend = &cfp
80a0: 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67  ->bp;.    Config
80b0: 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70  table_insert(cfp
80c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
80d0: 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75  cfp;.}../* Compu
80e0: 74 65 20 74 68 65 20 63 6c 6f 73 75 72 65 20 6f  te the closure o
80f0: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  f the configurat
8100: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
8110: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73   Configlist_clos
8120: 75 72 65 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  ure(lemp).struct
8130: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
8140: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
8150: 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b 0a 20  *cfp, *newcfp;. 
8160: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
8170: 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74 72 75  , *newrp;.  stru
8180: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a  ct symbol *sp, *
8190: 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 64 6f  xsp;.  int i, do
81a0: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
81b0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
81c0: 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65 6e 74   for(cfp=current
81d0: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
81e0: 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20 3d 20  next){.    rp = 
81f0: 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64 6f 74  cfp->rp;.    dot
8200: 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20 20 20   = cfp->dot;.   
8210: 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72   if( dot>=rp->nr
8220: 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  hs ) continue;. 
8230: 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b     sp = rp->rhs[
8240: 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  dot];.    if( sp
8250: 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49  ->type==NONTERMI
8260: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  NAL ){.      if(
8270: 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26 26 20   sp->rule==0 && 
8280: 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  sp!=lemp->errsym
8290: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
82a0: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
82b0: 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f  ame,rp->line,"No
82c0: 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73 5c 22  nterminal \"%s\"
82d0: 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e 22 2c   has no rules.",
82e0: 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 6e  .          sp->n
82f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  ame);.        le
8300: 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
8310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
8320: 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75 6c 65  r(newrp=sp->rule
8330: 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70 3d 6e  ; newrp; newrp=n
8340: 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a  ewrp->nextlhs){.
8350: 20 20 20 20 20 20 20 20 6e 65 77 63 66 70 20 3d          newcfp =
8360: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28   Configlist_add(
8370: 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20 20 20  newrp,0);.      
8380: 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b 20 69    for(i=dot+1; i
8390: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
83a0: 0a 20 20 20 20 20 20 20 20 20 20 78 73 70 20 3d  .          xsp =
83b0: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
83c0: 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e         if( xsp->
83d0: 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29  type==TERMINAL )
83e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 65  {.            Se
83f0: 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73  tAdd(newcfp->fws
8400: 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  ,xsp->index);.  
8410: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8420: 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20  ..  }else{.     
8430: 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f 6e 28         SetUnion(
8440: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d  newcfp->fws,xsp-
8450: 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20  >firstset);.    
8460: 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d          if( xsp-
8470: 3e 6c 61 6d 62 64 61 3d 3d 46 41 4c 53 45 20 29  >lambda==FALSE )
8480: 20 62 72 65 61 6b 3b 0a 09 20 20 7d 0a 09 7d 0a   break;..  }..}.
8490: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72          if( i==r
84a0: 70 2d 3e 6e 72 68 73 20 29 20 50 6c 69 6e 6b 5f  p->nrhs ) Plink_
84b0: 61 64 64 28 26 63 66 70 2d 3e 66 70 6c 70 2c 6e  add(&cfp->fplp,n
84c0: 65 77 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ewcfp);.      }.
84d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
84e0: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74  rn;.}../* Sort t
84f0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
8500: 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f   list */.void Co
8510: 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 7b  nfiglist_sort(){
8520: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28 73 74  .  current = (st
8530: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73  ruct config *)ms
8540: 6f 72 74 28 63 75 72 72 65 6e 74 2c 26 28 63 75  ort(current,&(cu
8550: 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c 43 6f 6e  rrent->next),Con
8560: 66 69 67 63 6d 70 29 3b 0a 20 20 63 75 72 72 65  figcmp);.  curre
8570: 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74  ntend = 0;.  ret
8580: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20  urn;.}../* Sort 
8590: 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  the basis config
85a0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
85b0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
85c0: 73 6f 72 74 62 61 73 69 73 28 29 7b 0a 20 20 62  sortbasis(){.  b
85d0: 61 73 69 73 20 3d 20 28 73 74 72 75 63 74 20 63  asis = (struct c
85e0: 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 63 75  onfig *)msort(cu
85f0: 72 72 65 6e 74 2c 26 28 63 75 72 72 65 6e 74 2d  rrent,&(current-
8600: 3e 62 70 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b  >bp),Configcmp);
8610: 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30 3b  .  basisend = 0;
8620: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
8630: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
8640: 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
8650: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
8660: 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72  on list and.** r
8670: 65 73 65 74 20 74 68 65 20 6c 69 73 74 20 2a 2f  eset the list */
8680: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
8690: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72  Configlist_retur
86a0: 6e 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  n(){.  struct co
86b0: 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64  nfig *old;.  old
86c0: 20 3d 20 63 75 72 72 65 6e 74 3b 0a 20 20 63 75   = current;.  cu
86d0: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72  rrent = 0;.  cur
86e0: 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72  rentend = 0;.  r
86f0: 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a  eturn old;.}../*
8700: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
8710: 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  r to the head of
8720: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
8730: 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72  on list and.** r
8740: 65 73 65 74 20 74 68 65 20 6c 69 73 74 20 2a 2f  eset the list */
8750: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
8760: 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73  Configlist_basis
8770: 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  (){.  struct con
8780: 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20  fig *old;.  old 
8790: 3d 20 62 61 73 69 73 3b 0a 20 20 62 61 73 69 73  = basis;.  basis
87a0: 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64   = 0;.  basisend
87b0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f   = 0;.  return o
87c0: 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20 61  ld;.}../* Free a
87d0: 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  ll elements of t
87e0: 68 65 20 67 69 76 65 6e 20 63 6f 6e 66 69 67 75  he given configu
87f0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
8800: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65  oid Configlist_e
8810: 61 74 28 63 66 70 29 0a 73 74 72 75 63 74 20 63  at(cfp).struct c
8820: 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20  onfig *cfp;.{.  
8830: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
8840: 65 78 74 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20  extcfp;.  for(; 
8850: 63 66 70 3b 20 63 66 70 3d 6e 65 78 74 63 66 70  cfp; cfp=nextcfp
8860: 29 7b 0a 20 20 20 20 6e 65 78 74 63 66 70 20 3d  ){.    nextcfp =
8870: 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20   cfp->next;.    
8880: 61 73 73 65 72 74 28 20 63 66 70 2d 3e 66 70 6c  assert( cfp->fpl
8890: 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  p==0 );.    asse
88a0: 72 74 28 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30  rt( cfp->bplp==0
88b0: 20 29 3b 0a 20 20 20 20 69 66 28 20 63 66 70 2d   );.    if( cfp-
88c0: 3e 66 77 73 20 29 20 53 65 74 46 72 65 65 28 63  >fws ) SetFree(c
88d0: 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 64 65  fp->fws);.    de
88e0: 6c 65 74 65 63 6f 6e 66 69 67 28 63 66 70 29 3b  leteconfig(cfp);
88f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
8900: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
8910: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
8920: 65 20 22 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a  e "error.c" ****
8930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
8950: 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72  *.** Code for pr
8960: 69 6e 74 69 6e 67 20 65 72 72 6f 72 20 6d 65 73  inting error mes
8970: 73 61 67 65 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e  sage..*/../* Fin
8980: 64 20 61 20 67 6f 6f 64 20 70 6c 61 63 65 20 74  d a good place t
8990: 6f 20 62 72 65 61 6b 20 22 6d 73 67 22 20 73 6f  o break "msg" so
89a0: 20 74 68 61 74 20 69 74 73 20 6c 65 6e 67 74 68   that its length
89b0: 20 69 73 20 61 74 20 6c 65 61 73 74 20 22 6d 69   is at least "mi
89c0: 6e 22 0a 2a 2a 20 62 75 74 20 6e 6f 20 6d 6f 72  n".** but no mor
89d0: 65 20 74 68 61 6e 20 22 6d 61 78 22 2e 20 20 4d  e than "max".  M
89e0: 61 6b 65 20 74 68 65 20 70 6f 69 6e 74 20 61 73  ake the point as
89f0: 20 63 6c 6f 73 65 20 74 6f 20 6d 61 78 20 61 73   close to max as
8a00: 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74   possible..*/.st
8a10: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 62 72 65  atic int findbre
8a20: 61 6b 28 6d 73 67 2c 6d 69 6e 2c 6d 61 78 29 0a  ak(msg,min,max).
8a30: 63 68 61 72 20 2a 6d 73 67 3b 0a 69 6e 74 20 6d  char *msg;.int m
8a40: 69 6e 3b 0a 69 6e 74 20 6d 61 78 3b 0a 7b 0a 20  in;.int max;.{. 
8a50: 20 69 6e 74 20 69 2c 73 70 6f 74 3b 0a 20 20 63   int i,spot;.  c
8a60: 68 61 72 20 63 3b 0a 20 20 66 6f 72 28 69 3d 73  har c;.  for(i=s
8a70: 70 6f 74 3d 6d 69 6e 3b 20 69 3c 3d 6d 61 78 3b  pot=min; i<=max;
8a80: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 20 3d 20 6d   i++){.    c = m
8a90: 73 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 63  sg[i];.    if( c
8aa0: 3d 3d 27 5c 74 27 20 29 20 6d 73 67 5b 69 5d 20  =='\t' ) msg[i] 
8ab0: 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20 63  = ' ';.    if( c
8ac0: 3d 3d 27 5c 6e 27 20 29 7b 20 6d 73 67 5b 69 5d  =='\n' ){ msg[i]
8ad0: 20 3d 20 27 20 27 3b 20 73 70 6f 74 20 3d 20 69   = ' '; spot = i
8ae0: 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69  ; break; }.    i
8af0: 66 28 20 63 3d 3d 30 20 29 7b 20 73 70 6f 74 20  f( c==0 ){ spot 
8b00: 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20  = i; break; }.  
8b10: 20 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20    if( c=='-' && 
8b20: 69 3c 6d 61 78 2d 31 20 29 20 73 70 6f 74 20 3d  i<max-1 ) spot =
8b30: 20 69 2b 31 3b 0a 20 20 20 20 69 66 28 20 63 3d   i+1;.    if( c=
8b40: 3d 27 20 27 20 29 20 73 70 6f 74 20 3d 20 69 3b  =' ' ) spot = i;
8b50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 70  .  }.  return sp
8b60: 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ot;.}../*.** The
8b70: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
8b80: 73 20 73 70 6c 69 74 20 61 63 72 6f 73 73 20 6d  s split across m
8b90: 75 6c 74 69 70 6c 65 20 6c 69 6e 65 73 20 69 66  ultiple lines if
8ba0: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
8bb0: 0a 2a 2a 20 73 70 6c 69 74 73 20 6f 63 63 75 72  .** splits occur
8bc0: 20 61 74 20 61 20 73 70 61 63 65 2c 20 69 66 20   at a space, if 
8bd0: 74 68 65 72 65 20 69 73 20 61 20 73 70 61 63 65  there is a space
8be0: 20 61 76 61 69 6c 61 62 6c 65 20 6e 65 61 72 20   available near 
8bf0: 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68  the end.** of th
8c00: 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 23 64 65 66 69  e line..*/.#defi
8c10: 6e 65 20 45 52 52 4d 53 47 53 49 5a 45 20 20 31  ne ERRMSGSIZE  1
8c20: 30 30 30 30 20 2f 2a 20 48 6f 70 65 20 74 68 69  0000 /* Hope thi
8c30: 73 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68 2e  s is big enough.
8c40: 20 20 4e 6f 20 77 61 79 20 74 6f 20 65 72 72 6f    No way to erro
8c50: 72 20 63 68 65 63 6b 20 2a 2f 0a 23 64 65 66 69  r check */.#defi
8c60: 6e 65 20 4c 49 4e 45 57 49 44 54 48 20 20 20 20  ne LINEWIDTH    
8c70: 20 20 37 39 20 2f 2a 20 4d 61 78 20 77 69 64 74    79 /* Max widt
8c80: 68 20 6f 66 20 61 6e 79 20 6f 75 74 70 75 74 20  h of any output 
8c90: 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  line */.#define 
8ca0: 50 52 45 46 49 58 4c 49 4d 49 54 20 20 20 20 33  PREFIXLIMIT    3
8cb0: 30 20 2f 2a 20 4d 61 78 20 77 69 64 74 68 20 6f  0 /* Max width o
8cc0: 66 20 74 68 65 20 70 72 65 66 69 78 20 6f 6e 20  f the prefix on 
8cd0: 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 76 6f 69  each line */.voi
8ce0: 64 20 45 72 72 6f 72 4d 73 67 28 76 61 5f 61 6c  d ErrorMsg(va_al
8cf0: 69 73 74 29 0a 76 61 5f 64 63 6c 0a 7b 0a 20 20  ist).va_dcl.{.  
8d00: 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 0a  char *filename;.
8d10: 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20    int lineno;.  
8d20: 63 68 61 72 20 2a 66 6f 72 6d 61 74 3b 0a 20 20  char *format;.  
8d30: 63 68 61 72 20 65 72 72 6d 73 67 5b 45 52 52 4d  char errmsg[ERRM
8d40: 53 47 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20  SGSIZE];.  char 
8d50: 70 72 65 66 69 78 5b 50 52 45 46 49 58 4c 49 4d  prefix[PREFIXLIM
8d60: 49 54 2b 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72  IT+10];.  int er
8d70: 72 6d 73 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20  rmsgsize;.  int 
8d80: 70 72 65 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e  prefixsize;.  in
8d90: 74 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68  t availablewidth
8da0: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  ;.  va_list ap;.
8db0: 20 20 69 6e 74 20 65 6e 64 2c 20 72 65 73 74 61    int end, resta
8dc0: 72 74 2c 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f  rt, base;..  va_
8dd0: 73 74 61 72 74 28 61 70 29 3b 0a 20 20 66 69 6c  start(ap);.  fil
8de0: 65 6e 61 6d 65 20 3d 20 76 61 5f 61 72 67 28 61  ename = va_arg(a
8df0: 70 2c 63 68 61 72 2a 29 3b 0a 20 20 6c 69 6e 65  p,char*);.  line
8e00: 6e 6f 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  no = va_arg(ap,i
8e10: 6e 74 29 3b 0a 20 20 66 6f 72 6d 61 74 20 3d 20  nt);.  format = 
8e20: 76 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29  va_arg(ap,char*)
8e30: 3b 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61  ;.  /* Prepare a
8e40: 20 70 72 65 66 69 78 20 74 6f 20 62 65 20 70 72   prefix to be pr
8e50: 65 70 65 6e 64 65 64 20 74 6f 20 65 76 65 72 79  epended to every
8e60: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a   output line */.
8e70: 20 20 69 66 28 20 6c 69 6e 65 6e 6f 3e 30 20 29    if( lineno>0 )
8e80: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 72  {.    sprintf(pr
8e90: 65 66 69 78 2c 22 25 2e 2a 73 3a 25 64 3a 20 22  efix,"%.*s:%d: "
8ea0: 2c 50 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c  ,PREFIXLIMIT-10,
8eb0: 66 69 6c 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29  filename,lineno)
8ec0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8ed0: 70 72 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25  printf(prefix,"%
8ee0: 2e 2a 73 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d  .*s: ",PREFIXLIM
8ef0: 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 29 3b  IT-10,filename);
8f00: 0a 20 20 7d 0a 20 20 70 72 65 66 69 78 73 69 7a  .  }.  prefixsiz
8f10: 65 20 3d 20 73 74 72 6c 65 6e 28 70 72 65 66 69  e = strlen(prefi
8f20: 78 29 3b 0a 20 20 61 76 61 69 6c 61 62 6c 65 77  x);.  availablew
8f30: 69 64 74 68 20 3d 20 4c 49 4e 45 57 49 44 54 48  idth = LINEWIDTH
8f40: 20 2d 20 70 72 65 66 69 78 73 69 7a 65 3b 0a 0a   - prefixsize;..
8f50: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
8f60: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
8f70: 2a 2f 0a 20 20 76 73 70 72 69 6e 74 66 28 65 72  */.  vsprintf(er
8f80: 72 6d 73 67 2c 66 6f 72 6d 61 74 2c 61 70 29 3b  rmsg,format,ap);
8f90: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
8fa0: 20 65 72 72 6d 73 67 73 69 7a 65 20 3d 20 73 74   errmsgsize = st
8fb0: 72 6c 65 6e 28 65 72 72 6d 73 67 29 3b 0a 20 20  rlen(errmsg);.  
8fc0: 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61 69 6c 69  /* Remove traili
8fd0: 6e 67 20 27 5c 6e 27 73 20 66 72 6f 6d 20 74 68  ng '\n's from th
8fe0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
8ff0: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 65 72 72   */.  while( err
9000: 6d 73 67 73 69 7a 65 3e 30 20 26 26 20 65 72 72  msgsize>0 && err
9010: 6d 73 67 5b 65 72 72 6d 73 67 73 69 7a 65 2d 31  msg[errmsgsize-1
9020: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
9030: 65 72 72 6d 73 67 5b 2d 2d 65 72 72 6d 73 67 73  errmsg[--errmsgs
9040: 69 7a 65 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ize] = 0;.  }.. 
9050: 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 65 72   /* Print the er
9060: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
9070: 20 62 61 73 65 20 3d 20 30 3b 0a 20 20 77 68 69   base = 0;.  whi
9080: 6c 65 28 20 65 72 72 6d 73 67 5b 62 61 73 65 5d  le( errmsg[base]
9090: 21 3d 30 20 29 7b 0a 20 20 20 20 65 6e 64 20 3d  !=0 ){.    end =
90a0: 20 72 65 73 74 61 72 74 20 3d 20 66 69 6e 64 62   restart = findb
90b0: 72 65 61 6b 28 26 65 72 72 6d 73 67 5b 62 61 73  reak(&errmsg[bas
90c0: 65 5d 2c 30 2c 61 76 61 69 6c 61 62 6c 65 77 69  e],0,availablewi
90d0: 64 74 68 29 3b 0a 20 20 20 20 72 65 73 74 61 72  dth);.    restar
90e0: 74 20 2b 3d 20 62 61 73 65 3b 0a 20 20 20 20 77  t += base;.    w
90f0: 68 69 6c 65 28 20 65 72 72 6d 73 67 5b 72 65 73  hile( errmsg[res
9100: 74 61 72 74 5d 3d 3d 27 20 27 20 29 20 72 65 73  tart]==' ' ) res
9110: 74 61 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72 69  tart++;.    fpri
9120: 6e 74 66 28 73 74 64 6f 75 74 2c 22 25 73 25 2e  ntf(stdout,"%s%.
9130: 2a 73 5c 6e 22 2c 70 72 65 66 69 78 2c 65 6e 64  *s\n",prefix,end
9140: 2c 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 29 3b  ,&errmsg[base]);
9150: 0a 20 20 20 20 62 61 73 65 20 3d 20 72 65 73 74  .    base = rest
9160: 61 72 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a  art;.  }.}./****
9170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
9180: 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e  m the file "main
9190: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
91a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
91b0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
91c0: 4d 61 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c  Main program fil
91d0: 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20  e for the LEMON 
91e0: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
91f0: 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20  ..*/../* Report 
9200: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
9210: 20 63 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61   condition and a
9220: 62 6f 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63  bort.  This func
9230: 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20  tion.** is used 
9240: 6d 6f 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d  mostly by the "M
9250: 65 6d 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72  emoryCheck" macr
9260: 6f 20 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f  o in struct.h.*/
9270: 0a 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72  .void memory_err
9280: 6f 72 28 29 7b 0a 20 20 66 70 72 69 6e 74 66 28  or(){.  fprintf(
9290: 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
92a0: 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67  emory.  Aborting
92b0: 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28  ...\n");.  exit(
92c0: 31 29 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 65 20 6d  1);.}.../* The m
92d0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 20 50 61  ain program.  Pa
92e0: 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  rse the command 
92f0: 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69 74 2e 2e  line and do it..
9300: 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 61 72  . */.int main(ar
9310: 67 63 2c 61 72 67 76 29 0a 69 6e 74 20 61 72 67  gc,argv).int arg
9320: 63 3b 0a 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a  c;.char **argv;.
9330: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 76  {.  static int v
9340: 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74  ersion = 0;.  st
9350: 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20  atic int rpflag 
9360: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
9370: 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b  t basisflag = 0;
9380: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f  .  static int co
9390: 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74  mpress = 0;.  st
93a0: 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d  atic int quiet =
93b0: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
93c0: 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b   statistics = 0;
93d0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68  .  static int mh
93e0: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
93f0: 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69  ic struct s_opti
9400: 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20  ons options[] = 
9410: 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  {.    {OPT_FLAG,
9420: 20 22 62 22 2c 20 28 63 68 61 72 2a 29 26 62 61   "b", (char*)&ba
9430: 73 69 73 66 6c 61 67 2c 20 22 50 72 69 6e 74 20  sisflag, "Print 
9440: 6f 6e 6c 79 20 74 68 65 20 62 61 73 69 73 20 69  only the basis i
9450: 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20 20  n report."},.   
9460: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22 2c   {OPT_FLAG, "c",
9470: 20 28 63 68 61 72 2a 29 26 63 6f 6d 70 72 65 73   (char*)&compres
9480: 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72 65  s, "Don't compre
9490: 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ss the action ta
94a0: 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ble."},.    {OPT
94b0: 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61  _FLAG, "g", (cha
94c0: 72 2a 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69  r*)&rpflag, "Pri
94d0: 6e 74 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f  nt grammar witho
94e0: 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20  ut actions."},. 
94f0: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d     {OPT_FLAG, "m
9500: 22 2c 20 28 63 68 61 72 2a 29 26 6d 68 66 6c 61  ", (char*)&mhfla
9510: 67 2c 20 22 4f 75 74 70 75 74 20 61 20 6d 61 6b  g, "Output a mak
9520: 65 68 65 61 64 65 72 73 20 63 6f 6d 70 61 74 69  eheaders compati
9530: 62 6c 65 20 66 69 6c 65 22 7d 2c 0a 20 20 20 20  ble file"},.    
9540: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20  {OPT_FLAG, "q", 
9550: 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22  (char*)&quiet, "
9560: 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72  (Quiet) Don't pr
9570: 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66  int the report f
9580: 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ile."},.    {OPT
9590: 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28 63 68 61  _FLAG, "s", (cha
95a0: 72 2a 29 26 73 74 61 74 69 73 74 69 63 73 2c 20  r*)&statistics, 
95b0: 22 50 72 69 6e 74 20 70 61 72 73 65 72 20 73 74  "Print parser st
95c0: 61 74 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20  ats to standard 
95d0: 6f 75 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b  output."},.    {
95e0: 4f 50 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28  OPT_FLAG, "x", (
95f0: 63 68 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20  char*)&version, 
9600: 22 50 72 69 6e 74 20 74 68 65 20 76 65 72 73 69  "Print the versi
9610: 6f 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20  on number."},.  
9620: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c    {OPT_FLAG,0,0,
9630: 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  0}.  };.  int i;
9640: 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
9650: 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28  lem;..  OptInit(
9660: 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64  argv,options,std
9670: 65 72 72 29 3b 0a 20 20 69 66 28 20 76 65 72 73  err);.  if( vers
9680: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72 69 6e  ion ){.     prin
9690: 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f  tf("Lemon versio
96a0: 6e 20 31 2e 30 5c 6e 22 0a 20 20 20 20 20 20 20  n 1.0\n".       
96b0: 22 43 6f 70 79 72 69 67 68 74 20 31 39 39 31 2d  "Copyright 1991-
96c0: 31 39 39 37 20 62 79 20 44 2e 20 52 69 63 68 61  1997 by D. Richa
96d0: 72 64 20 48 69 70 70 5c 6e 22 0a 20 20 20 20 20  rd Hipp\n".     
96e0: 20 20 22 46 72 65 65 6c 79 20 64 69 73 74 72 69    "Freely distri
96f0: 62 75 74 61 62 6c 65 20 75 6e 64 65 72 20 74 68  butable under th
9700: 65 20 47 4e 55 20 50 75 62 6c 69 63 20 4c 69 63  e GNU Public Lic
9710: 65 6e 73 65 2e 5c 6e 22 0a 20 20 20 20 20 29 3b  ense.\n".     );
9720: 0a 20 20 20 20 20 65 78 69 74 28 30 29 3b 20 0a  .     exit(0); .
9730: 20 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72    }.  if( OptNAr
9740: 67 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66  gs()!=1 ){.    f
9750: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
9760: 78 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e  xactly one filen
9770: 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
9780: 72 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20  required.\n");. 
9790: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
97a0: 20 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d    lem.errorcnt =
97b0: 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   0;..  /* Initia
97c0: 6c 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65  lize the machine
97d0: 20 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e   */.  Strsafe_in
97e0: 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69  it();.  Symbol_i
97f0: 6e 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69  nit();.  State_i
9800: 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67  nit();.  lem.arg
9810: 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20  v0 = argv[0];.  
9820: 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f  lem.filename = O
9830: 70 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e  ptArg(0);.  lem.
9840: 62 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69  basisflag = basi
9850: 73 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 63 6f  sflag;.  lem.nco
9860: 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 20 20 6c 65  nflict = 0;.  le
9870: 6d 2e 6e 61 6d 65 20 3d 20 6c 65 6d 2e 69 6e 63  m.name = lem.inc
9880: 6c 75 64 65 20 3d 20 6c 65 6d 2e 61 72 67 20 3d  lude = lem.arg =
9890: 20 6c 65 6d 2e 74 6f 6b 65 6e 74 79 70 65 20 3d   lem.tokentype =
98a0: 20 6c 65 6d 2e 73 74 61 72 74 20 3d 20 30 3b 0a   lem.start = 0;.
98b0: 20 20 6c 65 6d 2e 76 61 72 74 79 70 65 20 3d 20    lem.vartype = 
98c0: 30 3b 0a 20 20 6c 65 6d 2e 73 74 61 63 6b 73 69  0;.  lem.stacksi
98d0: 7a 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 65 72  ze = 0;.  lem.er
98e0: 72 6f 72 20 3d 20 6c 65 6d 2e 6f 76 65 72 66 6c  ror = lem.overfl
98f0: 6f 77 20 3d 20 6c 65 6d 2e 66 61 69 6c 75 72 65  ow = lem.failure
9900: 20 3d 20 6c 65 6d 2e 61 63 63 65 70 74 20 3d 20   = lem.accept = 
9910: 6c 65 6d 2e 74 6f 6b 65 6e 64 65 73 74 20 3d 0a  lem.tokendest =.
9920: 20 20 20 20 20 6c 65 6d 2e 74 6f 6b 65 6e 70 72       lem.tokenpr
9930: 65 66 69 78 20 3d 20 6c 65 6d 2e 6f 75 74 6e 61  efix = lem.outna
9940: 6d 65 20 3d 20 6c 65 6d 2e 65 78 74 72 61 63 6f  me = lem.extraco
9950: 64 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 76 61  de = 0;.  lem.va
9960: 72 64 65 73 74 20 3d 20 30 3b 0a 20 20 6c 65 6d  rdest = 0;.  lem
9970: 2e 74 61 62 6c 65 73 69 7a 65 20 3d 20 30 3b 0a  .tablesize = 0;.
9980: 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22    Symbol_new("$"
9990: 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20  );.  lem.errsym 
99a0: 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65 72  = Symbol_new("er
99b0: 72 6f 72 22 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  ror");..  /* Par
99c0: 73 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  se the input fil
99d0: 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c 65  e */.  Parse(&le
99e0: 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72  m);.  if( lem.er
99f0: 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c 65  rorcnt ) exit(le
9a00: 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69  m.errorcnt);.  i
9a10: 66 28 20 6c 65 6d 2e 72 75 6c 65 3d 3d 30 20 29  f( lem.rule==0 )
9a20: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
9a30: 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d  derr,"Empty gram
9a40: 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mar.\n");.    ex
9a50: 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  it(1);.  }..  /*
9a60: 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65 78   Count and index
9a70: 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20   the symbols of 
9a80: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
9a90: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53   lem.nsymbol = S
9aa0: 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20  ymbol_count();. 
9ab0: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65   Symbol_new("{de
9ac0: 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e  fault}");.  lem.
9ad0: 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c  symbols = Symbol
9ae0: 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20 71 73  _arrayof();.  qs
9af0: 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c  ort(lem.symbols,
9b00: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73 69  lem.nsymbol+1,si
9b10: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
9b20: 6f 6c 2a 29 2c 0a 20 20 20 20 20 20 20 20 28 69  ol*),.        (i
9b30: 6e 74 28 2a 29 28 29 29 53 79 6d 62 6f 6c 63 6d  nt(*)())Symbolcm
9b40: 70 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pp);.  for(i=0; 
9b50: 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20  i<=lem.nsymbol; 
9b60: 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73  i++) lem.symbols
9b70: 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a  [i]->index = i;.
9b80: 20 20 66 6f 72 28 69 3d 31 3b 20 69 73 75 70 70    for(i=1; isupp
9b90: 65 72 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  er(lem.symbols[i
9ba0: 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b  ]->name[0]); i++
9bb0: 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e  );.  lem.ntermin
9bc0: 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65  al = i;..  /* Ge
9bd0: 6e 65 72 61 74 65 20 61 20 72 65 70 72 69 6e 74  nerate a reprint
9be0: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2c   of the grammar,
9bf0: 20 69 66 20 72 65 71 75 65 73 74 65 64 20 6f 6e   if requested on
9c00: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
9c10: 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c 61  e */.  if( rpfla
9c20: 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e 74  g ){.    Reprint
9c30: 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  (&lem);.  }else{
9c40: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
9c50: 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72 20  ze the size for 
9c60: 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66  all follow and f
9c70: 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 20  irst sets */.   
9c80: 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65   SetSize(lem.nte
9c90: 72 6d 69 6e 61 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rminal);..    /*
9ca0: 20 46 69 6e 64 20 74 68 65 20 70 72 65 63 65 64   Find the preced
9cb0: 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20 70  ence for every p
9cc0: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28  roduction rule (
9cd0: 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f  that has one) */
9ce0: 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65  .    FindRulePre
9cf0: 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a  cedences(&lem);.
9d00: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
9d10: 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65  the lambda-nonte
9d20: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20  rminals and the 
9d30: 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65  first-sets for e
9d40: 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74  very.    ** nont
9d50: 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46  erminal */.    F
9d60: 69 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c 65  indFirstSets(&le
9d70: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
9d80: 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74  ute all LR(0) st
9d90: 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f  ates.  Also reco
9da0: 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  rd follow-set pr
9db0: 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  opagation.    **
9dc0: 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74   links so that t
9dd0: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61  he follow-set ca
9de0: 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61  n be computed la
9df0: 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e  ter */.    lem.n
9e00: 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46  state = 0;.    F
9e10: 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b  indStates(&lem);
9e20: 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20  .    lem.sorted 
9e30: 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  = State_arrayof(
9e40: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75  );..    /* Tie u
9e50: 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20  p loose ends on 
9e60: 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  the propagation 
9e70: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e  links */.    Fin
9e80: 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20  dLinks(&lem);.. 
9e90: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
9ea0: 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20  e follow set of 
9eb0: 65 76 65 72 79 20 72 65 64 75 63 69 62 6c 65 20  every reducible 
9ec0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
9ed0: 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  .    FindFollowS
9ee0: 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ets(&lem);..    
9ef0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  /* Compute the a
9f00: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
9f10: 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28      FindActions(
9f20: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
9f30: 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69  ompress the acti
9f40: 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  on tables */.   
9f50: 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30   if( compress==0
9f60: 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65   ) CompressTable
9f70: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
9f80: 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 6f   Generate a repo
9f90: 72 74 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  rt of the parser
9fa0: 20 67 65 6e 65 72 61 74 65 64 2e 20 20 28 74 68   generated.  (th
9fb0: 65 20 22 79 2e 6f 75 74 70 75 74 22 20 66 69 6c  e "y.output" fil
9fc0: 65 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 71  e) */.    if( !q
9fd0: 75 69 65 74 20 29 20 52 65 70 6f 72 74 4f 75 74  uiet ) ReportOut
9fe0: 70 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  put(&lem);..    
9ff0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
a000: 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20  source code for 
a010: 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20  the parser */.  
a020: 20 20 52 65 70 6f 72 74 54 61 62 6c 65 28 26 6c    ReportTable(&l
a030: 65 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20  em, mhflag);..  
a040: 20 20 2f 2a 20 50 72 6f 64 75 63 65 20 61 20 68    /* Produce a h
a050: 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 75  eader file for u
a060: 73 65 20 62 79 20 74 68 65 20 73 63 61 6e 6e 65  se by the scanne
a070: 72 2e 20 20 28 54 68 69 73 20 73 74 65 70 20 69  r.  (This step i
a080: 73 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64  s.    ** omitted
a090: 20 69 66 20 74 68 65 20 22 2d 6d 22 20 6f 70 74   if the "-m" opt
a0a0: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 65 63 61  ion is used beca
a0b0: 75 73 65 20 6d 61 6b 65 68 65 61 64 65 72 73 20  use makeheaders 
a0c0: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65  will.    ** gene
a0d0: 72 61 74 65 20 74 68 65 20 66 69 6c 65 20 66 6f  rate the file fo
a0e0: 72 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66  r us.) */.    if
a0f0: 28 20 21 6d 68 66 6c 61 67 20 29 20 52 65 70 6f  ( !mhflag ) Repo
a100: 72 74 48 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a  rtHeader(&lem);.
a110: 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 69 73    }.  if( statis
a120: 74 69 63 73 20 29 7b 0a 20 20 20 20 70 72 69 6e  tics ){.    prin
a130: 74 66 28 22 50 61 72 73 65 72 20 73 74 61 74 69  tf("Parser stati
a140: 73 74 69 63 73 3a 20 25 64 20 74 65 72 6d 69 6e  stics: %d termin
a150: 61 6c 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d 69  als, %d nontermi
a160: 6e 61 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c 6e  nals, %d rules\n
a170: 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74 65  ",.      lem.nte
a180: 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d  rminal, lem.nsym
a190: 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69  bol - lem.ntermi
a1a0: 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b  nal, lem.nrule);
a1b0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20  .    printf("   
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1d0: 25 64 20 73 74 61 74 65 73 2c 20 25 64 20 70 61  %d states, %d pa
a1e0: 72 73 65 72 20 74 61 62 6c 65 20 65 6e 74 72 69  rser table entri
a1f0: 65 73 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74 73  es, %d conflicts
a200: 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e  \n",.      lem.n
a210: 73 74 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c 65  state, lem.table
a220: 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c  size, lem.nconfl
a230: 69 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ict);.  }.  if( 
a240: 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 29 7b  lem.nconflict ){
a250: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
a260: 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20  err,"%d parsing 
a270: 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65  conflicts.\n",le
a280: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20  m.nconflict);.  
a290: 7d 0a 20 20 65 78 69 74 28 6c 65 6d 2e 65 72 72  }.  exit(lem.err
a2a0: 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e  orcnt + lem.ncon
a2b0: 66 6c 69 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  flict);.}./*****
a2c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
a2d0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d  From the file "m
a2e0: 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  sort.c" ********
a2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a300: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
a310: 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d 73   generic merge-s
a320: 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  ort program..**.
a330: 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74  ** USAGE:.** Let
a340: 20 22 70 74 72 22 20 62 65 20 61 20 70 6f 69 6e   "ptr" be a poin
a350: 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72 75  ter to some stru
a360: 63 74 75 72 65 20 77 68 69 63 68 20 69 73 20 61  cture which is a
a370: 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a  t the head of.**
a380: 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74   a null-terminat
a390: 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74  ed list.  Then t
a3a0: 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20  o sort the list 
a3b0: 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  call:.**.**     
a3c0: 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c  ptr = msort(ptr,
a3d0: 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70  &(ptr->next),cmp
a3e0: 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  fnc);.**.** In t
a3f0: 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e  he above, "cmpfn
a400: 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  c" is a pointer 
a410: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 68  to a function wh
a420: 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20  ich compares.** 
a430: 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  two instances of
a440: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 61   the structure a
a450: 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e  nd returns an in
a460: 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20  teger, as in.** 
a470: 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65 63  strcmp.  The sec
a480: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
a490: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
a4a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
a4b0: 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  ** second elemen
a4c0: 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20  t of the linked 
a4d0: 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64 64 72  list.  This addr
a4e0: 65 73 73 20 69 73 20 75 73 65 64 20 74 6f 20 63  ess is used to c
a4f0: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66  ompute.** the of
a500: 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65 78  fset to the "nex
a510: 74 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20  t" field within 
a520: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
a530: 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a  The offset to.**
a540: 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c   the "next" fiel
a550: 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  d must be consta
a560: 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75 63  nt for all struc
a570: 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69 73  tures in the lis
a580: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e  t..**.** The fun
a590: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
a5a0: 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69 63  new pointer whic
a5b0: 68 20 69 73 20 74 68 65 20 68 65 61 64 20 6f 66  h is the head of
a5c0: 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74   the list.** aft
a5d0: 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a  er sorting..**.*
a5e0: 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20  * ALGORITHM:.** 
a5f0: 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a  Merge-sort..*/..
a600: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
a610: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
a620: 78 74 20 73 74 72 75 63 74 75 72 65 20 69 6e 20  xt structure in 
a630: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  the linked list.
a640: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58 54  .*/.#define NEXT
a650: 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28 28  (A) (*(char**)((
a660: 28 69 6e 74 29 41 29 2b 6f 66 66 73 65 74 29 29  (int)A)+offset))
a670: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a  ../*.** Inputs:.
a680: 2a 2a 20 20 20 61 3a 20 20 20 20 20 20 20 41 20  **   a:       A 
a690: 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72  sorted, null-ter
a6a0: 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c  minated linked l
a6b0: 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75  ist.  (May be nu
a6c0: 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20 20  ll)..**   b:    
a6d0: 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c     A sorted, nul
a6e0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e  l-terminated lin
a6f0: 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20  ked list.  (May 
a700: 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63  be null)..**   c
a710: 6d 70 3a 20 20 20 20 20 41 20 70 6f 69 6e 74 65  mp:     A pointe
a720: 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  r to the compari
a730: 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  son function..**
a740: 20 20 20 6f 66 66 73 65 74 3a 20 20 4f 66 66 73     offset:  Offs
a750: 65 74 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  et in the struct
a760: 75 72 65 20 74 6f 20 74 68 65 20 22 6e 65 78 74  ure to the "next
a770: 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52  " field..**.** R
a780: 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20  eturn Value:.** 
a790: 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74    A pointer to t
a7a0: 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72  he head of a sor
a7b0: 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ted list contain
a7c0: 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73  ing the elements
a7d0: 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20 61 20  .**   of both a 
a7e0: 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64  and b..**.** Sid
a7f0: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
a800: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
a810: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
a820: 20 69 6e 20 74 68 65 20 6c 69 73 74 73 20 61 20   in the lists a 
a830: 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20 20 63  and b are.**   c
a840: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
a850: 63 20 63 68 61 72 20 2a 6d 65 72 67 65 28 61 2c  c char *merge(a,
a860: 62 2c 63 6d 70 2c 6f 66 66 73 65 74 29 0a 63 68  b,cmp,offset).ch
a870: 61 72 20 2a 61 3b 0a 63 68 61 72 20 2a 62 3b 0a  ar *a;.char *b;.
a880: 69 6e 74 20 28 2a 63 6d 70 29 28 29 3b 0a 69 6e  int (*cmp)();.in
a890: 74 20 6f 66 66 73 65 74 3b 0a 7b 0a 20 20 63 68  t offset;.{.  ch
a8a0: 61 72 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b 0a  ar *ptr, *head;.
a8b0: 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20  .  if( a==0 ){. 
a8c0: 20 20 20 68 65 61 64 20 3d 20 62 3b 0a 20 20 7d     head = b;.  }
a8d0: 65 6c 73 65 20 69 66 28 20 62 3d 3d 30 20 29 7b  else if( b==0 ){
a8e0: 0a 20 20 20 20 68 65 61 64 20 3d 20 61 3b 0a 20  .    head = a;. 
a8f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
a900: 28 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20 29 7b  (*cmp)(a,b)<0 ){
a910: 0a 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a  .      ptr = a;.
a920: 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61        a = NEXT(a
a930: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a940: 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20      ptr = b;.   
a950: 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a     b = NEXT(b);.
a960: 20 20 20 20 7d 0a 20 20 20 20 68 65 61 64 20 3d      }.    head =
a970: 20 70 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 28   ptr;.    while(
a980: 20 61 20 26 26 20 62 20 29 7b 0a 20 20 20 20 20   a && b ){.     
a990: 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29   if( (*cmp)(a,b)
a9a0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 45  <0 ){.        NE
a9b0: 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20  XT(ptr) = a;.   
a9c0: 20 20 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20       ptr = a;.  
a9d0: 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54 28 61        a = NEXT(a
a9e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a9f0: 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72          NEXT(ptr
aa00: 29 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20 70  ) = b;.        p
aa10: 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 20 20  tr = b;.        
aa20: 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20  b = NEXT(b);.   
aa30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
aa40: 66 28 20 61 20 29 20 4e 45 58 54 28 70 74 72 29  f( a ) NEXT(ptr)
aa50: 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73 65 20 20   = a;.    else  
aa60: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b    NEXT(ptr) = b;
aa70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 65  .  }.  return he
aa80: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  ad;.}../*.** Inp
aa90: 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73 74 3a 20  uts:.**   list: 
aaa0: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
aab0: 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20  a singly-linked 
aac0: 6c 69 73 74 20 6f 66 20 73 74 72 75 63 74 75 72  list of structur
aad0: 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74 3a 20 20  es..**   next:  
aae0: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 70      Pointer to p
aaf0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 65  ointer to the se
ab00: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
ab10: 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20 20 20 63  the list..**   c
ab20: 6d 70 3a 20 20 20 20 20 20 20 41 20 63 6f 6d 70  mp:       A comp
ab30: 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e  arison function.
ab40: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61  .**.** Return Va
ab50: 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e  lue:.**   A poin
ab60: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
ab70: 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74  of a sorted list
ab80: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
ab90: 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 72  elements.**   or
aba0: 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69 73 74 2e  ginally in list.
abb0: 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65  .**.** Side effe
abc0: 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e  cts:.**   The "n
abd0: 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f  ext" pointers fo
abe0: 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 6c 69  r elements in li
abf0: 73 74 20 61 72 65 20 63 68 61 6e 67 65 64 2e 0a  st are changed..
ac00: 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49 53 54 53  */.#define LISTS
ac10: 49 5a 45 20 33 30 0a 63 68 61 72 20 2a 6d 73 6f  IZE 30.char *mso
ac20: 72 74 28 6c 69 73 74 2c 6e 65 78 74 2c 63 6d 70  rt(list,next,cmp
ac30: 29 0a 63 68 61 72 20 2a 6c 69 73 74 3b 0a 63 68  ).char *list;.ch
ac40: 61 72 20 2a 2a 6e 65 78 74 3b 0a 69 6e 74 20 28  ar **next;.int (
ac50: 2a 63 6d 70 29 28 29 3b 0a 7b 0a 20 20 69 6e 74  *cmp)();.{.  int
ac60: 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20   offset;.  char 
ac70: 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74  *ep;.  char *set
ac80: 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LISTSIZE];.  in
ac90: 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20  t i;.  offset = 
aca0: 28 69 6e 74 29 6e 65 78 74 20 2d 20 28 69 6e 74  (int)next - (int
acb0: 29 6c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  )list;.  for(i=0
acc0: 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b  ; i<LISTSIZE; i+
acd0: 2b 29 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20  +) set[i] = 0;. 
ace0: 20 77 68 69 6c 65 28 20 6c 69 73 74 20 29 7b 0a   while( list ){.
acf0: 20 20 20 20 65 70 20 3d 20 6c 69 73 74 3b 0a 20      ep = list;. 
ad00: 20 20 20 6c 69 73 74 20 3d 20 4e 45 58 54 28 6c     list = NEXT(l
ad10: 69 73 74 29 3b 0a 20 20 20 20 4e 45 58 54 28 65  ist);.    NEXT(e
ad20: 70 29 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  p) = 0;.    for(
ad30: 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 2d  i=0; i<LISTSIZE-
ad40: 31 20 26 26 20 73 65 74 5b 69 5d 21 3d 30 3b 20  1 && set[i]!=0; 
ad50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 65 70 20 3d  i++){.      ep =
ad60: 20 6d 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d   merge(ep,set[i]
ad70: 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20  ,cmp,offset);.  
ad80: 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a      set[i] = 0;.
ad90: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 5b 69 5d      }.    set[i]
ada0: 20 3d 20 65 70 3b 0a 20 20 7d 0a 20 20 65 70 20   = ep;.  }.  ep 
adb0: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
adc0: 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29  i<LISTSIZE; i++)
add0: 20 69 66 28 20 73 65 74 5b 69 5d 20 29 20 65 70   if( set[i] ) ep
ade0: 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65 74 5b   = merge(ep,set[
adf0: 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a  i],cmp,offset);.
ae00: 20 20 72 65 74 75 72 6e 20 65 70 3b 0a 7d 0a 2f    return ep;.}./
ae10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ae20: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
ae30: 65 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 63  e file "option.c
ae40: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
ae50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74  ************/.st
ae60: 61 74 69 63 20 63 68 61 72 20 2a 2a 61 72 67 76  atic char **argv
ae70: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
ae80: 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 3b 0a 73  s_options *op;.s
ae90: 74 61 74 69 63 20 46 49 4c 45 20 2a 65 72 72 73  tatic FILE *errs
aea0: 74 72 65 61 6d 3b 0a 0a 23 64 65 66 69 6e 65 20  tream;..#define 
aeb0: 49 53 4f 50 54 28 58 29 20 28 28 58 29 5b 30 5d  ISOPT(X) ((X)[0]
aec0: 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30 5d 3d 3d 27  =='-'||(X)[0]=='
aed0: 2b 27 7c 7c 73 74 72 63 68 72 28 28 58 29 2c 27  +'||strchr((X),'
aee0: 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 50  =')!=0)../*.** P
aef0: 72 69 6e 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64  rint the command
af00: 20 6c 69 6e 65 20 77 69 74 68 20 61 20 63 61 72   line with a car
af10: 72 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  rot pointing to 
af20: 74 68 65 20 6b 2d 74 68 20 63 68 61 72 61 63 74  the k-th charact
af30: 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 2d 74  er.** of the n-t
af40: 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74  h field..*/.stat
af50: 69 63 20 76 6f 69 64 20 65 72 72 6c 69 6e 65 28  ic void errline(
af60: 6e 2c 6b 2c 65 72 72 29 0a 69 6e 74 20 6e 3b 0a  n,k,err).int n;.
af70: 69 6e 74 20 6b 3b 0a 46 49 4c 45 20 2a 65 72 72  int k;.FILE *err
af80: 3b 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c  ;.{.  int spcnt,
af90: 20 69 3b 0a 20 20 73 70 63 6e 74 20 3d 20 30 3b   i;.  spcnt = 0;
afa0: 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20 29  .  if( argv[0] )
afb0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
afc0: 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70  ",argv[0]);.  sp
afd0: 63 6e 74 20 3d 20 73 74 72 6c 65 6e 28 61 72 67  cnt = strlen(arg
afe0: 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20 66 6f 72  v[0]) + 1;.  for
aff0: 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 61 72 67  (i=1; i<n && arg
b000: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
b010: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73  fprintf(err," %s
b020: 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  ",argv[i]);.    
b030: 73 70 63 6e 74 20 2b 3d 20 73 74 72 6c 65 6e 28  spcnt += strlen(
b040: 61 72 67 76 5b 69 5d 2b 31 29 3b 0a 20 20 7d 0a  argv[i]+1);.  }.
b050: 20 20 73 70 63 6e 74 20 2b 3d 20 6b 3b 0a 20 20    spcnt += k;.  
b060: 66 6f 72 28 3b 20 61 72 67 76 5b 69 5d 3b 20 69  for(; argv[i]; i
b070: 2b 2b 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c  ++) fprintf(err,
b080: 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a  " %s",argv[i]);.
b090: 20 20 69 66 28 20 73 70 63 6e 74 3c 32 30 20 29    if( spcnt<20 )
b0a0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
b0b0: 72 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68 65 72 65  r,"\n%*s^-- here
b0c0: 5c 6e 22 2c 73 70 63 6e 74 2c 22 22 29 3b 0a 20  \n",spcnt,"");. 
b0d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
b0e0: 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 68 65  ntf(err,"\n%*she
b0f0: 72 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63 6e 74 2d  re --^\n",spcnt-
b100: 37 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  7,"");.  }.}../*
b110: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
b120: 6e 64 65 78 20 6f 66 20 74 68 65 20 4e 2d 74 68  ndex of the N-th
b130: 20 6e 6f 6e 2d 73 77 69 74 63 68 20 61 72 67 75   non-switch argu
b140: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 2d 31  ment.  Return -1
b150: 0a 2a 2a 20 69 66 20 4e 20 69 73 20 6f 75 74 20  .** if N is out 
b160: 6f 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a 73 74 61  of range..*/.sta
b170: 74 69 63 20 69 6e 74 20 61 72 67 69 6e 64 65 78  tic int argindex
b180: 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69  (n).int n;.{.  i
b190: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 64 61 73 68  nt i;.  int dash
b1a0: 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 66 28 20  dash = 0;.  if( 
b1b0: 61 72 67 76 21 3d 30 20 26 26 20 2a 61 72 67 76  argv!=0 && *argv
b1c0: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
b1d0: 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b  =1; argv[i]; i++
b1e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 61 73  ){.      if( das
b1f0: 68 64 61 73 68 20 7c 7c 20 21 49 53 4f 50 54 28  hdash || !ISOPT(
b200: 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20  argv[i]) ){.    
b210: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 72      if( n==0 ) r
b220: 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20 20  eturn i;.       
b230: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n--;.      }.  
b240: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
b250: 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20  rgv[i],"--")==0 
b260: 29 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a  ) dashdash = 1;.
b270: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b280: 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn -1;.}..static
b290: 20 63 68 61 72 20 65 6d 73 67 5b 5d 20 3d 20 22   char emsg[] = "
b2a0: 43 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 79 6e  Command line syn
b2b0: 74 61 78 20 65 72 72 6f 72 3a 20 22 3b 0a 0a 2f  tax error: ";../
b2c0: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 66  *.** Process a f
b2d0: 6c 61 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  lag command line
b2e0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
b2f0: 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 66  atic int handlef
b300: 6c 61 67 73 28 69 2c 65 72 72 29 0a 69 6e 74 20  lags(i,err).int 
b310: 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a  i;.FILE *err;.{.
b320: 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20 65    int v;.  int e
b330: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  rrcnt = 0;.  int
b340: 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f   j;.  for(j=0; o
b350: 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29  p[j].label; j++)
b360: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
b370: 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b  (&argv[i][1],op[
b380: 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62  j].label)==0 ) b
b390: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  reak;.  }.  v = 
b3a0: 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20  argv[i][0]=='-' 
b3b0: 3f 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f  ? 1 : 0;.  if( o
b3c0: 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b  p[j].label==0 ){
b3d0: 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a  .    if( err ){.
b3e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
b3f0: 72 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f  r,"%sundefined o
b400: 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ption.\n",emsg);
b410: 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69  .      errline(i
b420: 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ,1,err);.    }. 
b430: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d     errcnt++;.  }
b440: 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74  else if( op[j].t
b450: 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47 20 29 7b  ype==OPT_FLAG ){
b460: 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29 6f 70 5b  .    *((int*)op[
b470: 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a 20 20 7d  j].arg) = v;.  }
b480: 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74  else if( op[j].t
b490: 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41 47 20 29  ype==OPT_FFLAG )
b4a0: 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29  {.    (*(void(*)
b4b0: 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28  ())(op[j].arg))(
b4c0: 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  v);.  }else{.   
b4d0: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
b4e0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
b4f0: 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e  smissing argumen
b500: 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22 2c  t on switch.\n",
b510: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72  emsg);.      err
b520: 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20  line(i,1,err);. 
b530: 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b     }.    errcnt+
b540: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
b550: 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  errcnt;.}../*.**
b560: 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d 61   Process a comma
b570: 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20 77  nd line switch w
b580: 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67 75  hich has an argu
b590: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
b5a0: 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63 68  int handleswitch
b5b0: 28 69 2c 65 72 72 29 0a 69 6e 74 20 69 3b 0a 46  (i,err).int i;.F
b5c0: 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e  ILE *err;.{.  in
b5d0: 74 20 6c 76 20 3d 20 30 3b 0a 20 20 64 6f 75 62  t lv = 0;.  doub
b5e0: 6c 65 20 64 76 20 3d 20 30 2e 30 3b 0a 20 20 63  le dv = 0.0;.  c
b5f0: 68 61 72 20 2a 73 76 20 3d 20 30 2c 20 2a 65 6e  har *sv = 0, *en
b600: 64 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 20  d;.  char *cp;. 
b610: 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 65 72   int j;.  int er
b620: 72 63 6e 74 20 3d 20 30 3b 0a 20 20 63 70 20 3d  rcnt = 0;.  cp =
b630: 20 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c   strchr(argv[i],
b640: 27 3d 27 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b  '=');.  *cp = 0;
b650: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a  .  for(j=0; op[j
b660: 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20  ].label; j++){. 
b670: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
b680: 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65  gv[i],op[j].labe
b690: 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  l)==0 ) break;. 
b6a0: 20 7d 0a 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a   }.  *cp = '=';.
b6b0: 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65    if( op[j].labe
b6c0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  l==0 ){.    if( 
b6d0: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72  err ){.      fpr
b6e0: 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65  intf(err,"%sunde
b6f0: 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22  fined option.\n"
b700: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
b710: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a  rline(i,0,err);.
b720: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
b730: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
b740: 20 63 70 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63   cp++;.    switc
b750: 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b  h( op[j].type ){
b760: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
b770: 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65  FLAG:.      case
b780: 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20   OPT_FFLAG:.    
b790: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
b7a0: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
b7b0: 28 65 72 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72  (err,"%soption r
b7c0: 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
b7d0: 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ent.\n",emsg);. 
b7e0: 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65           errline
b7f0: 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20 20  (i,0,err);.     
b800: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72 72     }.        err
b810: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  cnt++;.        b
b820: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b830: 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20   OPT_DBL:.      
b840: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
b850: 20 20 20 20 20 20 20 64 76 20 3d 20 73 74 72 74         dv = strt
b860: 6f 64 28 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20  od(cp,&end);.   
b870: 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b       if( *end ){
b880: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
b890: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rr ){.          
b8a0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
b8b0: 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74  sillegal charact
b8c0: 65 72 20 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70  er in floating-p
b8d0: 6f 69 6e 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e  oint argument.\n
b8e0: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  ",emsg);.       
b8f0: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28       errline(i,(
b900: 28 69 6e 74 29 65 6e 64 29 2d 28 69 6e 74 29 61  (int)end)-(int)a
b910: 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20  rgv[i],err);.   
b920: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b930: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
b940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
b950: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b960: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
b970: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
b980: 20 20 20 20 20 20 20 6c 76 20 3d 20 73 74 72 74         lv = strt
b990: 6f 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a 20  ol(cp,&end,0);. 
b9a0: 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20         if( *end 
b9b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
b9c0: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
b9d0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
b9e0: 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61  "%sillegal chara
b9f0: 63 74 65 72 20 69 6e 20 69 6e 74 65 67 65 72 20  cter in integer 
ba00: 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73  argument.\n",ems
ba10: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
ba20: 65 72 72 6c 69 6e 65 28 69 2c 28 28 69 6e 74 29  errline(i,((int)
ba30: 65 6e 64 29 2d 28 69 6e 74 29 61 72 67 76 5b 69  end)-(int)argv[i
ba40: 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  ],err);.        
ba50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72    }.          er
ba60: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
ba70: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
ba80: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
ba90: 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
baa0: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
bab0: 20 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20    sv = cp;.     
bac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bad0: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a      switch( op[j
bae0: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
baf0: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
bb00: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
bb10: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65  LAG:.        bre
bb20: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
bb30: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  PT_DBL:.        
bb40: 2a 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d  *(double*)(op[j]
bb50: 2e 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20  .arg) = dv;.    
bb60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bb70: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
bb80: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
bb90: 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  *)())(op[j].arg)
bba0: 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(dv);.        b
bbb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bbc0: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
bbd0: 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e    *(int*)(op[j].
bbe0: 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20  arg) = lv;.     
bbf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bc00: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
bc10: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
bc20: 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  )())(op[j].arg))
bc30: 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20  ((int)lv);.     
bc40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bc50: 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
bc60: 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28        *(char**)(
bc70: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b  op[j].arg) = sv;
bc80: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
bc90: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
bca0: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28  STR:.        (*(
bcb0: 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d  void(*)())(op[j]
bcc0: 2e 61 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20  .arg))(sv);.    
bcd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bce0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
bcf0: 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74  rcnt;.}..int Opt
bd00: 49 6e 69 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68  Init(a,o,err).ch
bd10: 61 72 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73  ar **a;.struct s
bd20: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c  _options *o;.FIL
bd30: 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20  E *err;.{.  int 
bd40: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72  errcnt = 0;.  ar
bd50: 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f  gv = a;.  op = o
bd60: 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20  ;.  errstream = 
bd70: 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20  err;.  if( argv 
bd80: 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29  && *argv && op )
bd90: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
bda0: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
bdb0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
bdc0: 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  f( argv[i][0]=='
bdd0: 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d  +' || argv[i][0]
bde0: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
bdf0: 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c   errcnt += handl
be00: 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20  eflags(i,err);. 
be10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
be20: 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d  trchr(argv[i],'=
be30: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  ') ){.        er
be40: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77  rcnt += handlesw
be50: 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20  itch(i,err);.   
be60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
be70: 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b   if( errcnt>0 ){
be80: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
be90: 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20  ,"Valid command 
bea0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  line options for
beb0: 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c   \"%s\" are:\n",
bec0: 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e  *a);.    OptPrin
bed0: 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  t();.    exit(1)
bee0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
bef0: 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67  ;.}..int OptNArg
bf00: 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  s(){.  int cnt =
bf10: 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61   0;.  int dashda
bf20: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
bf30: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
bf40: 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a  & argv[0]!=0 ){.
bf50: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67      for(i=1; arg
bf60: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
bf70: 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c    if( dashdash |
bf80: 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d  | !ISOPT(argv[i]
bf90: 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
bfa0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
bfb0: 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64  [i],"--")==0 ) d
bfc0: 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20  ashdash = 1;.   
bfd0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
bfe0: 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70  cnt;.}..char *Op
bff0: 74 41 72 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  tArg(n).int n;.{
c000: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
c010: 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72  argindex(n);.  r
c020: 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67  eturn i>=0 ? arg
c030: 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69  v[i] : 0;.}..voi
c040: 64 20 4f 70 74 45 72 72 28 6e 29 0a 69 6e 74 20  d OptErr(n).int 
c050: 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n;.{.  int i;.  
c060: 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b  i = argindex(n);
c070: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72  .  if( i>=0 ) er
c080: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72  rline(i,0,errstr
c090: 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70  eam);.}..void Op
c0a0: 74 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20  tPrint(){.  int 
c0b0: 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65  i;.  int max, le
c0c0: 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20  n;.  max = 0;.  
c0d0: 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c  for(i=0; op[i].l
c0e0: 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  abel; i++){.    
c0f0: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 70 5b  len = strlen(op[
c100: 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20  i].label) + 1;. 
c110: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d     switch( op[i]
c120: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
c130: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
c140: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
c150: 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
c160: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
c170: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
c180: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
c190: 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20      len += 9;   
c1a0: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
c1b0: 20 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a   "<integer>" */.
c1c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c1d0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
c1e0: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  L:.      case OP
c1f0: 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  T_FDBL:.        
c200: 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20 20  len += 6;       
c210: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72  /* length of "<r
c220: 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  eal>" */.       
c230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c240: 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20  se OPT_STR:.    
c250: 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a    case OPT_FSTR:
c260: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
c270: 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  8;       /* leng
c280: 74 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22  th of "<string>"
c290: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
c2a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
c2b0: 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d   len>max ) max =
c2c0: 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   len;.  }.  for(
c2d0: 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c  i=0; op[i].label
c2e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74  ; i++){.    swit
c2f0: 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29  ch( op[i].type )
c300: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  {.      case OPT
c310: 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73  _FLAG:.      cas
c320: 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20  e OPT_FFLAG:.   
c330: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
c340: 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20  stream,"  -%-*s 
c350: 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d   %s\n",max,op[i]
c360: 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73  .label,op[i].mes
c370: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
c380: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c390: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
c3a0: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
c3b0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
c3c0: 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c  rrstream,"  %s=<
c3d0: 69 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73 5c  integer>%*s  %s\
c3e0: 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
c3f0: 20 20 20 20 20 20 20 20 20 20 6d 61 78 2d 73 74            max-st
c400: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
c410: 29 2d 39 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73  )-9,"",op[i].mes
c420: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
c430: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
c440: 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20   OPT_DBL:.      
c450: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
c460: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
c470: 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c  rrstream,"  %s=<
c480: 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  real>%*s  %s\n",
c490: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
c4a0: 20 20 20 20 20 20 20 6d 61 78 2d 73 74 72 6c 65         max-strle
c4b0: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36  n(op[i].label)-6
c4c0: 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  ,"",op[i].messag
c4d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
c4e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
c4f0: 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73  T_STR:.      cas
c500: 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20  e OPT_FSTR:.    
c510: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
c520: 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 73 74 72  tream,"  %s=<str
c530: 69 6e 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  ing>%*s  %s\n",o
c540: 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
c550: 20 20 20 20 20 20 6d 61 78 2d 73 74 72 6c 65 6e        max-strlen
c560: 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 2c  (op[i].label)-8,
c570: 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
c580: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
c590: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
c5a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c5b0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
c5c0: 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22 20 2a  file "parse.c" *
c5d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
c5f0: 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20 70 61  ** Input file pa
c600: 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c 45 4d  rser for the LEM
c610: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
c620: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20  tor..*/../* The 
c630: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
c640: 73 65 72 20 2a 2f 0a 73 74 72 75 63 74 20 70 73  ser */.struct ps
c650: 74 61 74 65 20 7b 0a 20 20 63 68 61 72 20 2a 66  tate {.  char *f
c660: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f  ilename;       /
c670: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
c680: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  put file */.  in
c690: 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20  t tokenlineno;  
c6a0: 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65      /* Linenumbe
c6b0: 72 20 61 74 20 77 68 69 63 68 20 63 75 72 72 65  r at which curre
c6c0: 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72 74 73 20  nt token starts 
c6d0: 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72 63 6e  */.  int errorcn
c6e0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  t;         /* Nu
c6f0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
c700: 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20  o far */.  char 
c710: 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20 20 20 20  *tokenstart;    
c720: 20 2f 2a 20 54 65 78 74 20 6f 66 20 63 75 72 72   /* Text of curr
c730: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73  ent token */.  s
c740: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b  truct lemon *gp;
c750: 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73       /* Global s
c760: 74 61 74 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20  tate vector */. 
c770: 20 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a   enum e_state {.
c780: 20 20 20 20 49 4e 49 54 49 41 4c 49 5a 45 2c 0a      INITIALIZE,.
c790: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
c7a0: 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20  DECL_OR_RULE,.  
c7b0: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
c7c0: 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 20 20  CL_KEYWORD,.    
c7d0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
c7e0: 5f 41 52 47 2c 0a 20 20 20 20 57 41 49 54 49 4e  _ARG,.    WAITIN
c7f0: 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
c800: 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49  _SYMBOL,.    WAI
c810: 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a  TING_FOR_ARROW,.
c820: 20 20 20 20 49 4e 5f 52 48 53 2c 0a 20 20 20 20      IN_RHS,.    
c830: 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 20  LHS_ALIAS_1,.   
c840: 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20   LHS_ALIAS_2,.  
c850: 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c 0a 20    LHS_ALIAS_3,. 
c860: 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a     RHS_ALIAS_1,.
c870: 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c      RHS_ALIAS_2,
c880: 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43 45 5f  .    PRECEDENCE_
c890: 4d 41 52 4b 5f 31 2c 0a 20 20 20 20 50 52 45 43  MARK_1,.    PREC
c8a0: 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20  EDENCE_MARK_2,. 
c8b0: 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f     RESYNC_AFTER_
c8c0: 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20  RULE_ERROR,.    
c8d0: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
c8e0: 4c 5f 45 52 52 4f 52 2c 0a 20 20 20 20 57 41 49  L_ERROR,.    WAI
c8f0: 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43  TING_FOR_DESTRUC
c900: 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20  TOR_SYMBOL,.    
c910: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
c920: 54 59 50 45 5f 53 59 4d 42 4f 4c 0a 20 20 7d 20  TYPE_SYMBOL.  } 
c930: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
c940: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c950: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
c960: 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ser */.  struct 
c970: 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20 20  symbol *lhs;    
c980: 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64      /* Left-hand
c990: 20 73 69 64 65 20 6f 66 20 63 75 72 72 65 6e 74   side of current
c9a0: 20 72 75 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   rule */.  char 
c9b0: 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20  *lhsalias;      
c9c0: 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66        /* Alias f
c9d0: 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f 0a 20 20  or the LHS */.  
c9e0: 69 6e 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20  int nrhs;       
c9f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ca00: 6d 62 65 72 20 6f 66 20 72 69 67 68 74 2d 68 61  mber of right-ha
ca10: 6e 64 20 73 69 64 65 20 73 79 6d 62 6f 6c 73 20  nd side symbols 
ca20: 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  seen */.  struct
ca30: 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b 4d 41 58   symbol *rhs[MAX
ca40: 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53 20 73 79  RHS];  /* RHS sy
ca50: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20  mbols */.  char 
ca60: 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b 20  *alias[MAXRHS]; 
ca70: 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 65 73        /* Aliases
ca80: 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 73 79   for each RHS sy
ca90: 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  mbol (or NULL) *
caa0: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
cab0: 2a 70 72 65 76 72 75 6c 65 3b 20 20 20 20 20 2f  *prevrule;     /
cac0: 2a 20 50 72 65 76 69 6f 75 73 20 72 75 6c 65 20  * Previous rule 
cad0: 70 61 72 73 65 64 20 2a 2f 0a 20 20 63 68 61 72  parsed */.  char
cae0: 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20 20   *declkeyword;  
caf0: 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77 6f 72         /* Keywor
cb00: 64 20 6f 66 20 61 20 64 65 63 6c 61 72 61 74 69  d of a declarati
cb10: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 64  on */.  char **d
cb20: 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20 20 20 20  eclargslot;     
cb30: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20     /* Where the 
cb40: 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 72 67 75  declaration argu
cb50: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 70  ment should be p
cb60: 75 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63  ut */.  int *dec
cb70: 6c 6c 6e 73 6c 6f 74 3b 20 20 20 20 20 20 20 20  llnslot;        
cb80: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65 20     /* Where the 
cb90: 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69 6e 65  declaration line
cba0: 6e 75 6d 62 65 72 20 69 73 20 70 75 74 20 2a 2f  number is put */
cbb0: 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20  .  enum e_assoc 
cbc0: 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a  declassoc;    /*
cbd0: 20 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73   Assign this ass
cbe0: 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c  ociation to decl
cbf0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
cc00: 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b  int preccounter;
cc10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
cc20: 73 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64  sign this preced
cc30: 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67  ence to decl arg
cc40: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75  uments */.  stru
cc50: 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75  ct rule *firstru
cc60: 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  le;    /* Pointe
cc70: 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20  r to first rule 
cc80: 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  in the grammar *
cc90: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
cca0: 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f  *lastrule;     /
ccb0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
ccc0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
ccd0: 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b  arsed rule */.};
cce0: 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e  ../* Parse a sin
ccf0: 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61  gle token */.sta
cd00: 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e  tic void parseon
cd10: 65 74 6f 6b 65 6e 28 70 73 70 29 0a 73 74 72 75  etoken(psp).stru
cd20: 63 74 20 70 73 74 61 74 65 20 2a 70 73 70 3b 0a  ct pstate *psp;.
cd30: 7b 0a 20 20 63 68 61 72 20 2a 78 3b 0a 20 20 78  {.  char *x;.  x
cd40: 20 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e   = Strsafe(psp->
cd50: 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20  tokenstart);    
cd60: 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b   /* Save the tok
cd70: 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a  en permanently *
cd80: 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66  /.#if 0.  printf
cd90: 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b  ("%s:%d: Token=[
cda0: 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c  %s] state=%d\n",
cdb0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
cdc0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
cdd0: 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65      x,psp->state
cde0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74  );.#endif.  swit
cdf0: 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29  ch( psp->state )
ce00: 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54 49  {.    case INITI
ce10: 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70  ALIZE:.      psp
ce20: 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a  ->prevrule = 0;.
ce30: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
ce40: 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  ounter = 0;.    
ce50: 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65    psp->firstrule
ce60: 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65   = psp->lastrule
ce70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d   = 0;.      psp-
ce80: 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a  >gp->nrule = 0;.
ce90: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
cea0: 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20  ru to next case 
ceb0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  */.    case WAIT
cec0: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
ced0: 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20  RULE:.      if( 
cee0: 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20  x[0]=='%' ){.   
cef0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
cf00: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
cf10: 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20  CL_KEYWORD;.    
cf20: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 6c 6f    }else if( islo
cf30: 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  wer(x[0]) ){.   
cf40: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20       psp->lhs = 
cf50: 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20  Symbol_new(x);. 
cf60: 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73         psp->nrhs
cf70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
cf80: 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b  p->lhsalias = 0;
cf90: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
cfa0: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
cfb0: 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d  R_ARROW;.      }
cfc0: 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
cfd0: 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  {' ){.        if
cfe0: 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d  ( psp->prevrule=
cff0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
d000: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
d010: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
d020: 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20  nlineno,."There 
d030: 69 73 20 6e 6f 74 20 70 72 69 6f 72 20 72 75 6c  is not prior rul
d040: 65 20 6f 70 6f 6e 20 77 68 69 63 68 20 74 6f 20  e opon which to 
d050: 61 74 74 61 63 68 20 74 68 65 20 63 6f 64 65 20  attach the code 
d060: 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68  \.fragment which
d070: 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20   begins on this 
d080: 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  line.");.       
d090: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
d0a0: 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 70  ++;..}else if( p
d0b0: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f  sp->prevrule->co
d0c0: 64 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de!=0 ){.       
d0d0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
d0e0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
d0f0: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64  okenlineno,."Cod
d100: 65 20 66 72 61 67 6d 65 6e 74 20 62 65 67 69 6e  e fragment begin
d110: 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e  ning on this lin
d120: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72  e is not the fir
d130: 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74  st \.to follow t
d140: 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65  he previous rule
d150: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  .");.          p
d160: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
d170: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d180: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
d190: 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70  evrule->line = p
d1a0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  sp->tokenlineno;
d1b0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
d1c0: 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d  prevrule->code =
d1d0: 20 26 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20 20 20   &x[1];..}.     
d1e0: 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d   }else if( x[0]=
d1f0: 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='[' ){.        
d200: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45  psp->state = PRE
d210: 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a  CEDENCE_MARK_1;.
d220: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d230: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
d240: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
d250: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
d260: 20 20 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c          "Token \
d270: 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20  "%s\" should be 
d280: 65 69 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72  either \"%%\" or
d290: 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e   a nonterminal n
d2a0: 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  ame.",.         
d2b0: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70   x);.        psp
d2c0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
d2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d2e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45 43  k;.    case PREC
d2f0: 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20  EDENCE_MARK_1:. 
d300: 20 20 20 20 20 69 66 28 20 21 69 73 75 70 70 65       if( !isuppe
d310: 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  r(x[0]) ){.     
d320: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
d330: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
d340: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
d350: 20 20 20 20 20 20 22 54 68 65 20 70 72 65 63 65        "The prece
d360: 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73  dence symbol mus
d370: 74 20 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e  t be a terminal.
d380: 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
d390: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
d3a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70     }else if( psp
d3b0: 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b  ->prevrule==0 ){
d3c0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
d3d0: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
d3e0: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
d3f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65  ,.          "The
d400: 72 65 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72  re is no prior r
d410: 75 6c 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72  ule to assign pr
d420: 65 63 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c  ecedence \"[%s]\
d430: 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ".",x);.        
d440: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
d450: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
d460: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
d470: 70 72 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20  precsym!=0 ){.  
d480: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
d490: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
d4a0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22  ->tokenlineno,."
d4b0: 50 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20  Precedence mark 
d4c0: 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  on this line is 
d4d0: 6e 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a  not the first \.
d4e0: 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72  to follow the pr
d4f0: 65 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a  evious rule.");.
d500: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
d510: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
d520: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73  else{.        ps
d530: 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65  p->prevrule->pre
d540: 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  csym = Symbol_ne
d550: 77 28 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  w(x);.      }.  
d560: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
d570: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
d580: 5f 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  _2;.      break;
d590: 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44  .    case PRECED
d5a0: 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20  ENCE_MARK_2:.   
d5b0: 20 20 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27     if( x[0]!=']'
d5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
d5d0: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
d5e0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
d5f0: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
d600: 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e  Missing \"]\" on
d610: 20 70 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b   precedence mark
d620: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  .");.        psp
d630: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
d640: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d      }.      psp-
d650: 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
d660: 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
d670: 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E;.      break;.
d680: 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
d690: 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20  _FOR_ARROW:.    
d6a0: 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20    if( x[0]==':' 
d6b0: 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20  && x[1]==':' && 
d6c0: 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20  x[2]=='=' ){.   
d6d0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
d6e0: 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20  = IN_RHS;.      
d6f0: 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
d700: 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '(' ){.        p
d710: 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f  sp->state = LHS_
d720: 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d  ALIAS_1;.      }
d730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
d740: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
d750: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
d760: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
d770: 20 22 45 78 70 65 63 74 65 64 20 74 6f 20 73 65   "Expected to se
d780: 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77  e a \":\" follow
d790: 69 6e 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62  ing the LHS symb
d7a0: 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20  ol \"%s\".",.   
d7b0: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d         psp->lhs-
d7c0: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
d7d0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
d7e0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
d7f0: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
d800: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
d810: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
d820: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53  ak;.    case LHS
d830: 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20  _ALIAS_1:.      
d840: 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d  if( isalpha(x[0]
d850: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ) ){.        psp
d860: 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a  ->lhsalias = x;.
d870: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
d880: 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32  te = LHS_ALIAS_2
d890: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d8a0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
d8b0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
d8c0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
d8d0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c            "\"%s\
d8e0: 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  " is not a valid
d8f0: 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c   alias for the L
d900: 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20  HS \"%s\"\n",.  
d910: 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c          x,psp->l
d920: 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  hs->name);.     
d930: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
d940: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
d950: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
d960: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
d970: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d980: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
d990: 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20  LHS_ALIAS_2:.   
d9a0: 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27     if( x[0]==')'
d9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
d9c0: 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49  >state = LHS_ALI
d9d0: 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_3;.      }els
d9e0: 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
d9f0: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
da00: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
da10: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d  no,.          "M
da20: 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c  issing \")\" fol
da30: 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73  lowing LHS alias
da40: 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70   name \"%s\".",p
da50: 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20  sp->lhsalias);. 
da60: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
da70: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
da80: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
da90: 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
daa0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
dab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
dac0: 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a  ase LHS_ALIAS_3:
dad0: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
dae0: 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a  =':' && x[1]==':
daf0: 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29  ' && x[2]=='=' )
db00: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
db10: 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20  tate = IN_RHS;. 
db20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
db30: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
db40: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
db50: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
db60: 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20         "Missing 
db70: 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67  \"->\" following
db80: 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a  : \"%s(%s)\".",.
db90: 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e             psp->
dba0: 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c  lhs->name,psp->l
dbb0: 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  hsalias);.      
dbc0: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
dbd0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
dbe0: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
dbf0: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
dc00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
dc10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49  reak;.    case I
dc20: 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28  N_RHS:.      if(
dc30: 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20   x[0]=='.' ){.  
dc40: 20 20 20 20 20 20 73 74 72 75 63 74 20 72 75 6c        struct rul
dc50: 65 20 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72  e *rp;.        r
dc60: 70 20 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65  p = (struct rule
dc70: 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   *)malloc( sizeo
dc80: 66 28 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b  f(struct rule) +
dc90: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73   .             s
dca0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
dcb0: 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20  bol*)*psp->nrhs 
dcc0: 2b 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  + sizeof(char*)*
dcd0: 70 73 70 2d 3e 6e 72 68 73 20 29 3b 0a 20 20 20  psp->nrhs );.   
dce0: 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29       if( rp==0 )
dcf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
dd00: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
dd10: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
dd20: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
dd30: 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65   "Can't allocate
dd40: 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66   enough memory f
dd50: 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b  or this rule.");
dd60: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
dd70: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
dd80: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
dd90: 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b  ule = 0;..}else{
dda0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
ddb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
ddc0: 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e  ruleline = psp->
ddd0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20  tokenlineno;.   
dde0: 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 20 3d         rp->rhs =
ddf0: 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a   (struct symbol*
de00: 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20  *)&rp[1];.      
de10: 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
de20: 20 3d 20 28 63 68 61 72 2a 2a 29 26 28 72 70 2d   = (char**)&(rp-
de30: 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29  >rhs[psp->nrhs])
de40: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
de50: 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73  i=0; i<psp->nrhs
de60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
de70: 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d      rp->rhs[i] =
de80: 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20   psp->rhs[i];.  
de90: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
dea0: 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d  salias[i] = psp-
deb0: 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20 20 7d 0a  >alias[i];..  }.
dec0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
ded0: 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20 20  s = psp->lhs;.  
dee0: 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
def0: 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73 61  lias = psp->lhsa
df00: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
df10: 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d 3e  rp->nrhs = psp->
df20: 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nrhs;.          
df30: 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20  rp->code = 0;.  
df40: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
df50: 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sym = 0;.       
df60: 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70     rp->index = p
df70: 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b  sp->gp->nrule++;
df80: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e  .          rp->n
df90: 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73  extlhs = rp->lhs
dfa0: 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20  ->rule;.        
dfb0: 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20    rp->lhs->rule 
dfc0: 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
dfd0: 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  rp->next = 0;.  
dfe0: 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
dff0: 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b  >firstrule==0 ){
e000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
e010: 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73  ->firstrule = ps
e020: 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
e030: 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
e040: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73          psp->las
e050: 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72 70  trule->next = rp
e060: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73  ;.            ps
e070: 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
e080: 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20 20 20  ;..  }.         
e090: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d   psp->prevrule =
e0a0: 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20   rp;..}.        
e0b0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
e0c0: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
e0d0: 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
e0e0: 73 65 20 69 66 28 20 69 73 61 6c 70 68 61 28 78  se if( isalpha(x
e0f0: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
e100: 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d  if( psp->nrhs>=M
e110: 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20 20 20  AXRHS ){.       
e120: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
e130: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
e140: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
e150: 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 61 6e          "Too man
e160: 79 20 73 79 6d 62 6f 6c 20 6f 6e 20 52 48 53 20  y symbol on RHS 
e170: 6f 72 20 72 75 6c 65 20 62 65 67 69 6e 6e 69 6e  or rule beginnin
e180: 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c 0a 20  g at \"%s\".",. 
e190: 20 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a 20             x);. 
e1a0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
e1b0: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
e1c0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
e1d0: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
e1e0: 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73 65  LE_ERROR;..}else
e1f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
e200: 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20  >rhs[psp->nrhs] 
e210: 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
e220: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
e230: 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  alias[psp->nrhs]
e240: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
e250: 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d 0a  psp->nrhs++;..}.
e260: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e270: 78 5b 30 5d 3d 3d 27 28 27 20 26 26 20 70 73 70  x[0]=='(' && psp
e280: 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20  ->nrhs>0 ){.    
e290: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
e2a0: 20 52 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20   RHS_ALIAS_1;.  
e2b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e2c0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
e2d0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
e2e0: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
e2f0: 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 63        "Illegal c
e300: 68 61 72 61 63 74 65 72 20 6f 6e 20 52 48 53 20  haracter on RHS 
e310: 6f 66 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e  of rule: \"%s\".
e320: 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
e330: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
e340: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
e350: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
e360: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
e370: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
e380: 3b 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41  ;.    case RHS_A
e390: 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66  LIAS_1:.      if
e3a0: 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
e3b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
e3c0: 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d  alias[psp->nrhs-
e3d0: 31 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  1] = x;.        
e3e0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53  psp->state = RHS
e3f0: 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20  _ALIAS_2;.      
e400: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
e410: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
e420: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
e430: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
e440: 20 20 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74    "\"%s\" is not
e450: 20 61 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66   a valid alias f
e460: 6f 72 20 74 68 65 20 52 48 53 20 73 79 6d 62 6f  or the RHS symbo
e470: 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20  l \"%s\"\n",.   
e480: 20 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 72 68         x,psp->rh
e490: 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e  s[psp->nrhs-1]->
e4a0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  name);.        p
e4b0: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
e4c0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
e4d0: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
e4e0: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
e4f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
e500: 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f  k;.    case RHS_
e510: 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69  ALIAS_2:.      i
e520: 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a  f( x[0]==')' ){.
e530: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
e540: 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20  te = IN_RHS;.   
e550: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e560: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
e570: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
e580: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
e590: 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
e5a0: 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48  )\" following LH
e5b0: 53 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25  S alias name \"%
e5c0: 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c  s\".",psp->lhsal
e5d0: 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ias);.        ps
e5e0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
e5f0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
e600: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
e610: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
e620: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
e630: 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
e640: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
e650: 4f 52 44 3a 0a 20 20 20 20 20 20 69 66 28 20 69  ORD:.      if( i
e660: 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a  salpha(x[0]) ){.
e670: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
e680: 6c 6b 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20  lkeyword = x;.  
e690: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
e6a0: 72 67 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20  rgslot = 0;.    
e6b0: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73      psp->decllns
e6c0: 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lot = 0;.       
e6d0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
e6e0: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
e6f0: 52 47 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  RG;.        if( 
e700: 73 74 72 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29  strcmp(x,"name")
e710: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e720: 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
e730: 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e  t = &(psp->gp->n
e740: 61 6d 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28  ame);..}else if(
e750: 20 73 74 72 63 6d 70 28 78 2c 22 69 6e 63 6c 75   strcmp(x,"inclu
e760: 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  de")==0 ){.     
e770: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
e780: 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
e790: 70 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a 20 20 20  p->include);.   
e7a0: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
e7b0: 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  lnslot = &psp->g
e7c0: 70 2d 3e 69 6e 63 6c 75 64 65 6c 6e 3b 0a 09 7d  p->includeln;..}
e7d0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
e7e0: 78 2c 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a  x,"code")==0 ){.
e7f0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
e800: 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
e810: 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64  sp->gp->extracod
e820: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
e830: 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
e840: 26 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63  &psp->gp->extrac
e850: 6f 64 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66  odeln;..}else if
e860: 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
e870: 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  n_destructor")==
e880: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
e890: 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
e8a0: 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
e8b0: 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20 20 20  ndest;.         
e8c0: 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74   psp->decllnslot
e8d0: 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b   = &psp->gp->tok
e8e0: 65 6e 64 65 73 74 6c 6e 3b 0a 09 7d 65 6c 73 65  endestln;..}else
e8f0: 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64   if( strcmp(x,"d
e900: 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63 74 6f  efault_destructo
e910: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
e920: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
e930: 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
e940: 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 20 20 20  >vardest;.      
e950: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73      psp->decllns
e960: 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
e970: 76 61 72 64 65 73 74 6c 6e 3b 0a 09 7d 65 6c 73  vardestln;..}els
e980: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
e990: 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d  token_prefix")==
e9a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
e9b0: 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
e9c0: 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
e9d0: 6e 70 72 65 66 69 78 3b 0a 09 7d 65 6c 73 65 20  nprefix;..}else 
e9e0: 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 79  if( strcmp(x,"sy
e9f0: 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d 3d 30 20  ntax_error")==0 
ea00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
ea10: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
ea20: 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72  &(psp->gp->error
ea30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
ea40: 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26  ->decllnslot = &
ea50: 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 6c 6e  psp->gp->errorln
ea60: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
ea70: 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63  cmp(x,"parse_acc
ea80: 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ept")==0 ){.    
ea90: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
eaa0: 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
eab0: 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20  gp->accept);.   
eac0: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
ead0: 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  lnslot = &psp->g
eae0: 70 2d 3e 61 63 63 65 70 74 6c 6e 3b 0a 09 7d 65  p->acceptln;..}e
eaf0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
eb00: 2c 22 70 61 72 73 65 5f 66 61 69 6c 75 72 65 22  ,"parse_failure"
eb10: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
eb20: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
eb30: 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
eb40: 66 61 69 6c 75 72 65 29 3b 0a 20 20 20 20 20 20  failure);.      
eb50: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73      psp->decllns
eb60: 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
eb70: 66 61 69 6c 75 72 65 6c 6e 3b 0a 09 7d 65 6c 73  failureln;..}els
eb80: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
eb90: 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 22 29  stack_overflow")
eba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
ebb0: 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
ebc0: 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f  t = &(psp->gp->o
ebd0: 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
ebe0: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73      psp->decllns
ebf0: 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
ec00: 6f 76 65 72 66 6c 6f 77 6c 6e 3b 0a 20 20 20 20  overflowln;.    
ec10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
ec20: 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f 61 72  rcmp(x,"extra_ar
ec30: 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b 0a 20  gument")==0 ){. 
ec40: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
ec50: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
ec60: 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20 20 20  p->gp->arg);.   
ec70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
ec80: 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74  trcmp(x,"token_t
ec90: 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ype")==0 ){.    
eca0: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
ecb0: 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
ecc0: 67 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a  gp->tokentype);.
ecd0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
ece0: 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61  ( strcmp(x,"defa
ecf0: 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b  ult_type")==0 ){
ed00: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
ed10: 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
ed20: 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79 70 65  psp->gp->vartype
ed30: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
ed40: 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73   if( strcmp(x,"s
ed50: 74 61 63 6b 5f 73 69 7a 65 22 29 3d 3d 30 20 29  tack_size")==0 )
ed60: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
ed70: 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
ed80: 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61 63 6b 73  (psp->gp->stacks
ed90: 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ize);.        }e
eda0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
edb0: 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c 22 29  ,"start_symbol")
edc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
edd0: 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
ede0: 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73  t = &(psp->gp->s
edf0: 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  tart);.        }
ee00: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
ee10: 78 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a  x,"left")==0 ){.
ee20: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
ee30: 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
ee40: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
ee50: 6c 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20  lassoc = LEFT;. 
ee60: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
ee70: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
ee80: 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
ee90: 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
eea0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
eeb0: 22 72 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20  "right")==0 ){. 
eec0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
eed0: 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  eccounter++;.   
eee0: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
eef0: 61 73 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20  assoc = RIGHT;. 
ef00: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
ef10: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
ef20: 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
ef30: 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
ef40: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
ef50: 22 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29  "nonassoc")==0 )
ef60: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
ef70: 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a  >preccounter++;.
ef80: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
ef90: 65 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b  eclassoc = NONE;
efa0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
efb0: 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
efc0: 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53  FOR_PRECEDENCE_S
efd0: 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66  YMBOL;..}else if
efe0: 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 73 74  ( strcmp(x,"dest
eff0: 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  ructor")==0 ){. 
f000: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
f010: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
f020: 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d  R_DESTRUCTOR_SYM
f030: 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  BOL;..}else if( 
f040: 73 74 72 63 6d 70 28 78 2c 22 74 79 70 65 22 29  strcmp(x,"type")
f050: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
f060: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
f070: 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59  ITING_FOR_DATATY
f080: 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  PE_SYMBOL;.     
f090: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f0a0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f0b0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f0c0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
f0d0: 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77           "Unknow
f0e0: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  n declaration ke
f0f0: 79 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e  yword: \"%%%s\".
f100: 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",x);.          
f110: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
f120: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
f130: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
f140: 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
f150: 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ..}.      }else{
f160: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f170: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f180: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f190: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c  ,.          "Ill
f1a0: 65 67 61 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e  egal declaration
f1b0: 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22   keyword: \"%s\"
f1c0: 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  .",x);.        p
f1d0: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
f1e0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f1f0: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
f200: 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
f210: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
f220: 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
f230: 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
f240: 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  OR_SYMBOL:.     
f250: 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 78 5b   if( !isalpha(x[
f260: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
f270: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f280: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f290: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
f2a0: 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d    "Symbol name m
f2b0: 69 73 73 69 6e 67 20 61 66 74 65 72 20 25 64 65  issing after %de
f2c0: 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72 64  structor keyword
f2d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ");.        psp-
f2e0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f2f0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f300: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
f310: 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
f320: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f330: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
f340: 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78  p = Symbol_new(x
f350: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f360: 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73  declargslot = &s
f370: 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20  p->destructor;. 
f380: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
f390: 6c 6e 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65  lnslot = &sp->de
f3a0: 73 74 72 75 63 74 6f 72 6c 6e 3b 0a 20 20 20 20  structorln;.    
f3b0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f3c0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
f3d0: 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20  L_ARG;.      }. 
f3e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f3f0: 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
f400: 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c  _DATATYPE_SYMBOL
f410: 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 61  :.      if( !isa
f420: 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20  lpha(x[0]) ){.  
f430: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f440: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f450: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f460: 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c           "Symbol
f470: 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66   name missing af
f480: 74 65 72 20 25 64 65 73 74 72 75 63 74 6f 72 20  ter %destructor 
f490: 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20  keyword");.     
f4a0: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f4b0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
f4c0: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
f4d0: 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
f4e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f4f0: 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
f500: 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f  mbol *sp = Symbo
f510: 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
f520: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
f530: 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74 79  ot = &sp->dataty
f540: 70 65 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  pe;.        psp-
f550: 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 30 3b  >decllnslot = 0;
f560: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
f570: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
f580: 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20  R_DECL_ARG;.    
f590: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f5a0: 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
f5b0: 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
f5c0: 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69  _SYMBOL:.      i
f5d0: 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
f5e0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f5f0: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
f600: 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
f610: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f620: 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a  supper(x[0]) ){.
f630: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
f640: 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20 20  ymbol *sp;.     
f650: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e     sp = Symbol_n
f660: 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69  ew(x);.        i
f670: 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29  f( sp->prec>=0 )
f680: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
f690: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f6a0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f6b0: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
f6c0: 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20   "Symbol \"%s\" 
f6d0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 20 67  has already be g
f6e0: 69 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e 63  iven a precedenc
f6f0: 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  e.",x);.        
f700: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f710: 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20  +;..}else{.     
f720: 20 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20       sp->prec = 
f730: 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
f740: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  ;.          sp->
f750: 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63  assoc = psp->dec
f760: 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20 20 20 20  lassoc;..}.     
f770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f780: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f790: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f7a0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
f7b0: 20 20 20 22 43 61 6e 27 74 20 61 73 73 69 67 6e     "Can't assign
f7c0: 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f   a precedence to
f7d0: 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20   \"%s\".",x);.  
f7e0: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f7f0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
f800: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f810: 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
f820: 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20  _DECL_ARG:.     
f830: 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7b 27 20   if( (x[0]=='{' 
f840: 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c  || x[0]=='\"' ||
f850: 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29 29 20   isalnum(x[0])) 
f860: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  ){.        if( *
f870: 28 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f  (psp->declargslo
f880: 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)!=0 ){.       
f890: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f8a0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f8b0: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f8c0: 20 20 20 20 20 20 20 20 22 54 68 65 20 61 72 67          "The arg
f8d0: 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 74 6f 20  ument \"%s\" to 
f8e0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 5c 22 25 25  declaration \"%%
f8f0: 25 73 5c 22 20 69 73 20 6e 6f 74 20 74 68 65 20  %s\" is not the 
f900: 66 69 72 73 74 2e 22 2c 0a 20 20 20 20 20 20 20  first.",.       
f910: 20 20 20 20 20 78 5b 30 5d 3d 3d 27 5c 22 27 20       x[0]=='\"' 
f920: 3f 20 26 78 5b 31 5d 20 3a 20 78 2c 70 73 70 2d  ? &x[1] : x,psp-
f930: 3e 64 65 63 6c 6b 65 79 77 6f 72 64 29 3b 0a 20  >declkeyword);. 
f940: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
f950: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f960: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
f970: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
f980: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73 65  CL_ERROR;..}else
f990: 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 70 73  {.          *(ps
f9a0: 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 29 20  p->declargslot) 
f9b0: 3d 20 28 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c  = (x[0]=='\"' ||
f9c0: 20 78 5b 30 5d 3d 3d 27 7b 27 29 20 3f 20 26 78   x[0]=='{') ? &x
f9d0: 5b 31 5d 20 3a 20 78 3b 0a 20 20 20 20 20 20 20  [1] : x;.       
f9e0: 20 20 20 69 66 28 20 70 73 70 2d 3e 64 65 63 6c     if( psp->decl
f9f0: 6c 6e 73 6c 6f 74 20 29 20 2a 70 73 70 2d 3e 64  lnslot ) *psp->d
fa00: 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 70 73 70 2d  ecllnslot = psp-
fa10: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20  >tokenlineno;.  
fa20: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
fa30: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
fa40: 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 09  _DECL_OR_RULE;..
fa50: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
fa60: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
fa70: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
fa80: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
fa90: 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67            "Illeg
faa0: 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25  al argument to %
fab0: 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65  %%s: %s",psp->de
fac0: 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20  clkeyword,x);.  
fad0: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
fae0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
faf0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
fb00: 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
fb10: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
fb20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
fb30: 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f  se RESYNC_AFTER_
fb40: 52 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20  RULE_ERROR:./*  
fb50: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
fb60: 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d  ' ) psp->state =
fb70: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
fb80: 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20  L_OR_RULE;.**   
fb90: 20 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20     break; */.   
fba0: 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54   case RESYNC_AFT
fbb0: 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a 20  ER_DECL_ERROR:. 
fbc0: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
fbd0: 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20  .' ) psp->state 
fbe0: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
fbf0: 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
fc00: 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20    if( x[0]=='%' 
fc10: 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57  ) psp->state = W
fc20: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
fc30: 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 62  KEYWORD;.      b
fc40: 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  reak;.  }.}../* 
fc50: 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74 73 20  In spite of its 
fc60: 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e 63 74  name, this funct
fc70: 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ion is really a 
fc80: 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72 65 61  scanner.  It rea
fc90: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74 69  d.** in the enti
fca0: 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20 28 61  re input file (a
fcb0: 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68 65 6e  ll at once) then
fcc0: 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20   tokenizes it.  
fcd0: 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73  Each.** token is
fce0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 66   passed to the f
fcf0: 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e  unction "parseon
fd00: 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20 62 75  etoken" which bu
fd10: 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20  ilds all.** the 
fd20: 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61  appropriate data
fd30: 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
fd40: 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20  he global state 
fd50: 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a  vector "gp"..*/.
fd60: 76 6f 69 64 20 50 61 72 73 65 28 67 70 29 0a 73  void Parse(gp).s
fd70: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b  truct lemon *gp;
fd80: 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 73 74 61  .{.  struct psta
fd90: 74 65 20 70 73 3b 0a 20 20 46 49 4c 45 20 2a 66  te ps;.  FILE *f
fda0: 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 62  p;.  char *fileb
fdb0: 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c 65 73 69  uf;.  int filesi
fdc0: 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  ze;.  int lineno
fdd0: 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61  ;.  int c;.  cha
fde0: 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a  r *cp, *nextcp;.
fdf0: 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20    int startline 
fe00: 3d 20 30 3b 0a 0a 20 20 70 73 2e 67 70 20 3d 20  = 0;..  ps.gp = 
fe10: 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61 6d  gp;.  ps.filenam
fe20: 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d 65  e = gp->filename
fe30: 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 20  ;.  ps.errorcnt 
fe40: 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65 20  = 0;.  ps.state 
fe50: 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a 20  = INITIALIZE;.. 
fe60: 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65 61   /* Begin by rea
fe70: 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20 66  ding the input f
fe80: 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66 6f  ile */.  fp = fo
fe90: 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  pen(ps.filename,
fea0: 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d  "rb");.  if( fp=
feb0: 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d  =0 ){.    ErrorM
fec0: 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30  sg(ps.filename,0
fed0: 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 69  ,"Can't open thi
fee0: 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  s file for readi
fef0: 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e 65  ng.");.    gp->e
ff00: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
ff10: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73 65  eturn;.  }.  fse
ff20: 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66 69  ek(fp,0,2);.  fi
ff30: 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28 66  lesize = ftell(f
ff40: 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70 29  p);.  rewind(fp)
ff50: 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28 63  ;.  filebuf = (c
ff60: 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66 69  har *)malloc( fi
ff70: 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69 66  lesize+1 );.  if
ff80: 28 20 66 69 6c 65 62 75 66 3d 3d 30 20 29 7b 0a  ( filebuf==0 ){.
ff90: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
ffa0: 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27  filename,0,"Can'
ffb0: 74 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 6f 66  t allocate %d of
ffc0: 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   memory to hold 
ffd0: 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20  this file.",.   
ffe0: 20 20 20 66 69 6c 65 73 69 7a 65 2b 31 29 3b 0a     filesize+1);.
fff0: 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74      gp->errorcnt
10000 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
10010 20 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64 28    }.  if( fread(
10020 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73 69  filebuf,1,filesi
10030 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a 65  ze,fp)!=filesize
10040 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
10050 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22  (ps.filename,0,"
10060 43 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61 6c  Can't read in al
10070 6c 20 25 64 20 62 79 74 65 73 20 6f 66 20 74 68  l %d bytes of th
10080 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20 20  is file.",.     
10090 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20 20   filesize);.    
100a0 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a 20  free(filebuf);. 
100b0 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b     gp->errorcnt+
100c0 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
100d0 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b   }.  fclose(fp);
100e0 0a 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65 73  .  filebuf[files
100f0 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ize] = 0;..  /* 
10100 4e 6f 77 20 73 63 61 6e 20 74 68 65 20 74 65 78  Now scan the tex
10110 74 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  t of the input f
10120 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20  ile */.  lineno 
10130 3d 20 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69  = 1;.  for(cp=fi
10140 6c 65 62 75 66 3b 20 28 63 3d 20 2a 63 70 29 21  lebuf; (c= *cp)!
10150 3d 30 3b 20 29 7b 0a 20 20 20 20 69 66 28 20 63  =0; ){.    if( c
10160 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
10170 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +;              
10180 2f 2a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  /* Keep track of
10190 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   the line number
101a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 73 70   */.    if( issp
101b0 61 63 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20  ace(c) ){ cp++; 
101c0 63 6f 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20  continue; }  /* 
101d0 53 6b 69 70 20 61 6c 6c 20 77 68 69 74 65 20 73  Skip all white s
101e0 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  pace */.    if( 
101f0 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d  c=='/' && cp[1]=
10200 3d 27 2f 27 20 29 7b 20 20 20 20 20 20 20 20 20  ='/' ){         
10210 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79   /* Skip C++ sty
10220 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20  le comments */. 
10230 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20       cp+=2;.    
10240 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
10250 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20  )!=0 && c!='\n' 
10260 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f  ) cp++;.      co
10270 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
10280 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20    if( c=='/' && 
10290 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20  cp[1]=='*' ){   
102a0 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43         /* Skip C
102b0 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20   style comments 
102c0 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a  */.      cp+=2;.
102d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
102e0 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d   *cp)!=0 && (c!=
102f0 27 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27  '/' || cp[-1]!='
10300 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  *') ){.        i
10310 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
10320 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63  eno++;.        c
10330 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p++;.      }.   
10340 20 20 20 69 66 28 20 63 20 29 20 63 70 2b 2b 3b     if( c ) cp++;
10350 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
10360 0a 20 20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f  .    }.    ps.to
10370 6b 65 6e 73 74 61 72 74 20 3d 20 63 70 3b 20 20  kenstart = cp;  
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10390 20 4d 61 72 6b 20 74 68 65 20 62 65 67 69 6e 6e   Mark the beginn
103a0 69 6e 67 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  ing of the token
103b0 20 2a 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e   */.    ps.token
103c0 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b  lineno = lineno;
103d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
103e0 6e 65 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63  nenumber on whic
103f0 68 20 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a  h token begins *
10400 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 22  /.    if( c=='\"
10410 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ' ){            
10420 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69           /* Stri
10430 6e 67 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20  ng literals */. 
10440 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
10450 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
10460 21 3d 30 20 26 26 20 63 21 3d 27 5c 22 27 20 29  !=0 && c!='\"' )
10470 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
10480 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
10490 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a  ;.        cp++;.
104a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
104b0 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
104c0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
104d0 6c 65 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65  lename,startline
104e0 2c 0a 22 53 74 72 69 6e 67 20 73 74 61 72 74 69  ,."String starti
104f0 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  ng on this line 
10500 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  is not terminate
10510 64 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64  d before the end
10520 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b   of the file.");
10530 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f  .        ps.erro
10540 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
10550 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
10560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10570 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b    nextcp = cp+1;
10580 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
10590 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b  se if( c=='{' ){
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
105b0 2a 20 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63  * A block of C c
105c0 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ode */.      int
105d0 20 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 63 70   level;.      cp
105e0 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65  ++;.      for(le
105f0 76 65 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21  vel=1; (c= *cp)!
10600 3d 30 20 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c  =0 && (level>1 |
10610 7c 20 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29  | c!='}'); cp++)
10620 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
10630 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b  ='\n' ) lineno++
10640 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  ;.        else i
10650 66 28 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65  f( c=='{' ) leve
10660 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73  l++;.        els
10670 65 20 69 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c  e if( c=='}' ) l
10680 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20  evel--;.        
10690 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20  else if( c=='/' 
106a0 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b  && cp[1]=='*' ){
106b0 20 20 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e    /* Skip commen
106c0 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ts */.          
106d0 69 6e 74 20 70 72 65 76 63 3b 0a 20 20 20 20 20  int prevc;.     
106e0 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d       cp = &cp[2]
106f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76  ;.          prev
10700 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
10710 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29   while( (c= *cp)
10720 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c  !=0 && (c!='/' |
10730 7c 20 70 72 65 76 63 21 3d 27 2a 27 29 20 29 7b  | prevc!='*') ){
10740 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
10750 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
10760 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  o++;.           
10770 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20   prevc = c;.    
10780 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20          cp++;.. 
10790 20 7d 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d   }..}else if( c=
107a0 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
107b0 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43  /' ){  /* Skip C
107c0 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74  ++ style comment
107d0 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20  s too */.       
107e0 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a     cp = &cp[2];.
107f0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
10800 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
10810 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a  c!='\n' ) cp++;.
10820 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 20            if( c 
10830 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c  ) lineno++;..}el
10840 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c  se if( c=='\'' |
10850 7c 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20  | c=='\"' ){    
10860 2f 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61 72  /* String a char
10870 61 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a  acter literals *
10880 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
10890 73 74 61 72 74 63 68 61 72 2c 20 70 72 65 76 63  startchar, prevc
108a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  ;.          star
108b0 74 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20  tchar = c;.     
108c0 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a       prevc = 0;.
108d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 63 70            for(cp
108e0 2b 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  ++; (c= *cp)!=0 
108f0 26 26 20 28 63 21 3d 73 74 61 72 74 63 68 61 72  && (c!=startchar
10900 20 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29   || prevc=='\\')
10910 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; cp++){.       
10920 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
10930 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
10940 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65           if( pre
10950 76 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63  vc=='\\' ) prevc
10960 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10970 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
10980 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 09      prevc = c;..
10990 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20    }..}.      }. 
109a0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
109b0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
109c0 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73  g(ps.filename,ps
109d0 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43  .tokenlineno,."C
109e0 20 63 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f   code starting o
109f0 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
10a00 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65  ot terminated be
10a10 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20  fore the end of 
10a20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20  the file.");.   
10a30 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74       ps.errorcnt
10a40 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  ++;.        next
10a50 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d  cp = cp;.      }
10a60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65  else{.        ne
10a70 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20  xtcp = cp+1;.   
10a80 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
10a90 66 28 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b  f( isalnum(c) ){
10aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65            /* Ide
10ab0 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20  ntifiers */.    
10ac0 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
10ad0 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d  )!=0 && (isalnum
10ae0 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29  (c) || c=='_') )
10af0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78   cp++;.      nex
10b00 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65  tcp = cp;.    }e
10b10 6c 73 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26  lse if( c==':' &
10b20 26 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20  & cp[1]==':' && 
10b30 63 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a  cp[2]=='=' ){ /*
10b40 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a   The operator ":
10b50 3a 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20  :=" */.      cp 
10b60 2b 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74  += 3;.      next
10b70 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
10b80 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
10b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ba0 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63  All other (one c
10bb0 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74  haracter) operat
10bc0 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  ors */.      cp+
10bd0 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
10be0 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = cp;.    }.    
10bf0 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70  c = *cp;.    *cp
10c00 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  Null terminate t
10c30 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
10c40 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70  parseonetoken(&p
10c50 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  s);             
10c60 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b  /* Parse the tok
10c70 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20  en */.    *cp = 
10c80 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
10ca0 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20  tore the buffer 
10cb0 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74  */.    cp = next
10cc0 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66  cp;.  }.  free(f
10cd0 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20  ilebuf);        
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
10cf0 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65  elease the buffe
10d00 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20  r after parsing 
10d10 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20  */.  gp->rule = 
10d20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20  ps.firstrule;.  
10d30 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70  gp->errorcnt = p
10d40 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a  s.errorcnt;.}./*
10d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
10d70 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e  the file "plink.
10d80 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
10d90 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
10da0 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73  Routines process
10db0 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ing configuratio
10dc0 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  n follow-set pro
10dd0 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a  pagation links.*
10de0 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  * in the LEMON p
10df0 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
10e00 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
10e10 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66  t plink *plink_f
10e20 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  reelist = 0;../*
10e30 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
10e40 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20  plink */.struct 
10e50 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77  plink *Plink_new
10e60 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  (){.  struct pli
10e70 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28 20  nk *new;..  if( 
10e80 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d  plink_freelist==
10e90 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
10ea0 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30      int amt = 10
10eb0 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  0;.    plink_fre
10ec0 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
10ed0 70 6c 69 6e 6b 20 2a 29 6d 61 6c 6c 6f 63 28 20  plink *)malloc( 
10ee0 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70 6c  sizeof(struct pl
10ef0 69 6e 6b 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20  ink)*amt );.    
10f00 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  if( plink_freeli
10f10 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
10f20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
10f30 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20       "Unable to 
10f40 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
10f50 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f 77  for a new follow
10f60 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  -set propagation
10f70 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20   link.\n");.    
10f80 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
10f90 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
10fa0 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69 6e  amt-1; i++) plin
10fb0 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65  k_freelist[i].ne
10fc0 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65 65  xt = &plink_free
10fd0 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 70  list[i+1];.    p
10fe0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61 6d  link_freelist[am
10ff0 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20  t-1].next = 0;. 
11000 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c 69 6e 6b   }.  new = plink
11010 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c 69  _freelist;.  pli
11020 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c  nk_freelist = pl
11030 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e 65  ink_freelist->ne
11040 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  xt;.  return new
11050 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c  ;.}../* Add a pl
11060 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c  ink to a plink l
11070 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
11080 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66 70 29 0a  k_add(plpp,cfp).
11090 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70  struct plink **p
110a0 6c 70 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  lpp;.struct conf
110b0 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72  ig *cfp;.{.  str
110c0 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a  uct plink *new;.
110d0 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b 5f 6e 65    new = Plink_ne
110e0 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78 74  w();.  new->next
110f0 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70   = *plpp;.  *plp
11100 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e  p = new;.  new->
11110 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f 2a  cfp = cfp;.}../*
11120 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79 20   Transfer every 
11130 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73  plink on the lis
11140 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65 20  t "from" to the 
11150 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f 69  list "to" */.voi
11160 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 74 6f 2c  d Plink_copy(to,
11170 66 72 6f 6d 29 0a 73 74 72 75 63 74 20 70 6c 69  from).struct pli
11180 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75 63 74 20  nk **to;.struct 
11190 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a 20  plink *from;.{. 
111a0 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e   struct plink *n
111b0 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20  extpl;.  while( 
111c0 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74  from ){.    next
111d0 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b  pl = from->next;
111e0 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20  .    from->next 
111f0 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d  = *to;.    *to =
11200 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20   from;.    from 
11210 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a  = nextpl;.  }.}.
11220 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79  ./* Delete every
11230 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
11240 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b  st */.void Plink
11250 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a 73 74 72  _delete(plp).str
11260 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
11270 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
11280 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68 69   *nextpl;..  whi
11290 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 6e  le( plp ){.    n
112a0 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78  extpl = plp->nex
112b0 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78 74  t;.    plp->next
112c0 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73   = plink_freelis
112d0 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  t;.    plink_fre
112e0 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20 20  elist = plp;.   
112f0 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a 20   plp = nextpl;. 
11300 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
11310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
11320 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70  om the file "rep
11330 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.c" *********
11340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11350 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64 75  */./*.** Procedu
11360 72 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69  res for generati
11370 6e 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20 74  ng reports and t
11380 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d  ables in the LEM
11390 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
113a0 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65  tor..*/../* Gene
113b0 72 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65 20  rate a filename 
113c0 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73  with the given s
113d0 75 66 66 69 78 2e 20 20 53 70 61 63 65 20 74 6f  uffix.  Space to
113e0 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61 6d   hold the.** nam
113f0 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61 6c  e comes from mal
11400 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
11410 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
11420 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
11430 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63  on..*/.PRIVATE c
11440 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61  har *file_makena
11450 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69 78 29 0a  me(lemp,suffix).
11460 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
11470 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69 78  mp;.char *suffix
11480 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65  ;.{.  char *name
11490 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20  ;.  char *cp;.. 
114a0 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20   name = malloc( 
114b0 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69 6c  strlen(lemp->fil
114c0 65 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65 6e 28  ename) + strlen(
114d0 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a 20  suffix) + 5 );. 
114e0 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a   if( name==0 ){.
114f0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
11500 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61  rr,"Can't alloca
11510 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 66  te space for a f
11520 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20  ilename.\n");.  
11530 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
11540 20 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d   strcpy(name,lem
11550 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
11560 63 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61 6d  cp = strrchr(nam
11570 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70  e,'.');.  if( cp
11580 20 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74   ) *cp = 0;.  st
11590 72 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69 78  rcat(name,suffix
115a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d 65  );.  return name
115b0 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66  ;.}../* Open a f
115c0 69 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65 20  ile with a name 
115d0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d  based on the nam
115e0 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
115f0 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68  ile,.** but with
11600 20 61 20 64 69 66 66 65 72 65 6e 74 20 28 73 70   a different (sp
11610 65 63 69 66 69 65 64 29 20 73 75 66 66 69 78 2c  ecified) suffix,
11620 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
11630 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
11640 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54  stream */.PRIVAT
11650 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65  E FILE *file_ope
11660 6e 28 6c 65 6d 70 2c 73 75 66 66 69 78 2c 6d 6f  n(lemp,suffix,mo
11670 64 65 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  de).struct lemon
11680 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75   *lemp;.char *su
11690 66 66 69 78 3b 0a 63 68 61 72 20 2a 6d 6f 64 65  ffix;.char *mode
116a0 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a  ;.{.  FILE *fp;.
116b0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74  .  if( lemp->out
116c0 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70  name ) free(lemp
116d0 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65  ->outname);.  le
116e0 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69  mp->outname = fi
116f0 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
11700 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20  , suffix);.  fp 
11710 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75  = fopen(lemp->ou
11720 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69  tname,mode);.  i
11730 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64  f( fp==0 && *mod
11740 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70  e=='w' ){.    fp
11750 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
11760 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22  n't open file \"
11770 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f  %s\".\n",lemp->o
11780 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  utname);.    lem
11790 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
117a0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
117b0 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a  .  return fp;.}.
117c0 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68  ./* Duplicate th
117d0 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74  e input file wit
117e0 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e  hout comments an
117f0 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e  d without action
11800 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a  s .** on rules *
11810 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28 6c  /.void Reprint(l
11820 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
11830 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72  n *lemp;.{.  str
11840 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
11850 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
11860 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d  p;.  int i, j, m
11870 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c  axlen, len, ncol
11880 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72  umns, skip;.  pr
11890 69 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e 74  intf("// Reprint
118a0 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20 5c   of input file \
118b0 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f  "%s\".\n// Symbo
118c0 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c  ls:\n",lemp->fil
118d0 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e  ename);.  maxlen
118e0 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30   = 10;.  for(i=0
118f0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
11900 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20  l; i++){.    sp 
11910 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
11920 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74  i];.    len = st
11930 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a  rlen(sp->name);.
11940 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c      if( len>maxl
11950 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65  en ) maxlen = le
11960 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e  n;.  }.  ncolumn
11970 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35  s = 76/(maxlen+5
11980 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e  );.  if( ncolumn
11990 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d  s<1 ) ncolumns =
119a0 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65   1;.  skip = (le
119b0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63  mp->nsymbol + nc
119c0 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c  olumns - 1)/ncol
119d0 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  umns;.  for(i=0;
119e0 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20   i<skip; i++){. 
119f0 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b     printf("//");
11a00 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c  .    for(j=i; j<
11a10 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a  lemp->nsymbol; j
11a20 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73  +=skip){.      s
11a30 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
11a40 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  s[j];.      asse
11a50 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a  rt( sp->index==j
11a60 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   );.      printf
11a70 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a  (" %3d %-*.*s",j
11a80 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73  ,maxlen,maxlen,s
11a90 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  p->name);.    }.
11aa0 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29      printf("\n")
11ab0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c  ;.  }.  for(rp=l
11ac0 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
11ad0 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
11ae0 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70 2d   printf("%s",rp-
11af0 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 2f 2a 20  >lhs->name);./* 
11b00 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c     if( rp->lhsal
11b10 69 61 73 20 29 20 70 72 69 6e 74 66 28 22 28 25  ias ) printf("(%
11b20 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73  s)",rp->lhsalias
11b30 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66  ); */.    printf
11b40 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66 6f  (" ::=");.    fo
11b50 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
11b60 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  s; i++){.      p
11b70 72 69 6e 74 66 28 22 20 25 73 22 2c 72 70 2d 3e  rintf(" %s",rp->
11b80 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 2f  rhs[i]->name);./
11b90 2a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72  *      if( rp->r
11ba0 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70 72 69  hsalias[i] ) pri
11bb0 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 72  ntf("(%s)",rp->r
11bc0 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a  hsalias[i]); */.
11bd0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
11be0 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20 72  (".");.    if( r
11bf0 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72 69  p->precsym ) pri
11c00 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e  ntf(" [%s]",rp->
11c10 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a  precsym->name);.
11c20 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f  /*    if( rp->co
11c30 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 20  de ) printf("\n 
11c40 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29     %s",rp->code)
11c50 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28  ; */.    printf(
11c60 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f  "\n");.  }.}..vo
11c70 69 64 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66  id ConfigPrint(f
11c80 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a 66 70 3b  p,cfp).FILE *fp;
11c90 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
11ca0 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  cfp;.{.  struct 
11cb0 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20  rule *rp;.  int 
11cc0 69 3b 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e 72  i;.  rp = cfp->r
11cd0 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c  p;.  fprintf(fp,
11ce0 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73  "%s ::=",rp->lhs
11cf0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  ->name);.  for(i
11d00 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b  =0; i<=rp->nrhs;
11d10 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
11d20 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 20 66 70 72  ==cfp->dot ) fpr
11d30 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20  intf(fp," *");. 
11d40 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
11d50 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  hs ) break;.    
11d60 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22  fprintf(fp," %s"
11d70 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d  ,rp->rhs[i]->nam
11d80 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64  e);.  }.}../* #d
11d90 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69  efine TEST */.#i
11da0 66 64 65 66 20 54 45 53 54 0a 2f 2a 20 50 72 69  fdef TEST./* Pri
11db0 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49 56  nt a set */.PRIV
11dc0 41 54 45 20 76 6f 69 64 20 53 65 74 50 72 69 6e  ATE void SetPrin
11dd0 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29 0a  t(out,set,lemp).
11de0 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72 20  FILE *out;.char 
11df0 2a 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d  *set;.struct lem
11e00 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
11e10 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70 61  t i;.  char *spa
11e20 63 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d 20  cer;.  spacer = 
11e30 22 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  "";.  fprintf(ou
11e40 74 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a 20  t,"%12s[","");. 
11e50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
11e60 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b  ->nterminal; i++
11e70 29 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46 69  ){.    if( SetFi
11e80 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20 20  nd(set,i) ){.   
11e90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
11ea0 25 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65 6d  %s%s",spacer,lem
11eb0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
11ec0 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61 63  ame);.      spac
11ed0 65 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d 0a  er = " ";.    }.
11ee0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
11ef0 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20  t,"]\n");.}../* 
11f00 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63 68  Print a plink ch
11f10 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ain */.PRIVATE v
11f20 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28 6f  oid PlinkPrint(o
11f30 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c 45  ut,plp,tag).FILE
11f40 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70 6c   *out;.struct pl
11f50 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20 2a  ink *plp;.char *
11f60 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28 20  tag;.{.  while( 
11f70 70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  plp ){.    fprin
11f80 74 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20 28  tf(out,"%12s%s (
11f90 73 74 61 74 65 20 25 32 64 29 20 22 2c 22 22 2c  state %2d) ","",
11fa0 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73 74  tag,plp->cfp->st
11fb0 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 43  p->index);.    C
11fc0 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75 74 2c 70  onfigPrint(out,p
11fd0 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66 70  lp->cfp);.    fp
11fe0 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
11ff0 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e  .    plp = plp->
12000 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  next;.  }.}.#end
12010 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20  if../* Print an 
12020 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67 69  action to the gi
12030 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
12040 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  tor.  Return FAL
12050 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67  SE if.** nothing
12060 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20 70 72   was actually pr
12070 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72  inted..*/.int Pr
12080 69 6e 74 41 63 74 69 6f 6e 28 73 74 72 75 63 74  intAction(struct
12090 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 46 49 4c   action *ap, FIL
120a0 45 20 2a 66 70 2c 20 69 6e 74 20 69 6e 64 65 6e  E *fp, int inden
120b0 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74  t){.  int result
120c0 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28 20   = 1;.  switch( 
120d0 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20  ap->type ){.    
120e0 63 61 73 65 20 53 48 49 46 54 3a 0a 20 20 20 20  case SHIFT:.    
120f0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
12100 73 20 73 68 69 66 74 20 20 25 64 22 2c 69 6e 64  s shift  %d",ind
12110 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
12120 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 69 6e 64 65  ,ap->x.stp->inde
12130 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
12140 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45  .    case REDUCE
12150 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
12160 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25  fp,"%*s reduce %
12170 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  d",indent,ap->sp
12180 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
12190 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62  >index);.      b
121a0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
121b0 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72  CCEPT:.      fpr
121c0 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63  intf(fp,"%*s acc
121d0 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ept",indent,ap->
121e0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
121f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12200 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70   ERROR:.      fp
12210 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72  rintf(fp,"%*s er
12220 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ror",indent,ap->
12230 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
12240 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12250 20 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20   CONFLICT:.     
12260 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
12270 20 72 65 64 75 63 65 20 25 2d 33 64 20 2a 2a 20   reduce %-3d ** 
12280 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74  Parsing conflict
12290 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e   **",.        in
122a0 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
122b0 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65  e,ap->x.rp->inde
122c0 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
122d0 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45 53  .    case SH_RES
122e0 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20  OLVED:.    case 
122f0 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20  RD_RESOLVED:.   
12300 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a 0a   case NOT_USED:.
12310 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30        result = 0
12320 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12330 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
12340 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  lt;.}../* Genera
12350 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70 75 74  te the "y.output
12360 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76 6f  " log file */.vo
12370 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28  id ReportOutput(
12380 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
12390 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
123a0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74  t i;.  struct st
123b0 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
123c0 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
123d0 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
123e0 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b  *ap;.  FILE *fp;
123f0 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f 70  ..  fp = file_op
12400 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c 22  en(lemp,".out","
12410 77 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30  w");.  if( fp==0
12420 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 70 72   ) return;.  fpr
12430 69 6e 74 66 28 66 70 2c 22 20 5c 62 22 29 3b 0a  intf(fp," \b");.
12440 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
12450 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
12460 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
12470 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
12480 66 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74  fprintf(fp,"Stat
12490 65 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 69 6e  e %d:\n",stp->in
124a0 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  dex);.    if( le
124b0 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20  mp->basisflag ) 
124c0 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20  cfp=stp->bp;.   
124d0 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
124e0 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e         cfp=stp->
124f0 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  cfp;.    while( 
12500 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61  cfp ){.      cha
12510 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20  r buf[20];.     
12520 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63   if( cfp->dot==c
12530 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a  fp->rp->nrhs ){.
12540 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
12550 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e  buf,"(%d)",cfp->
12560 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  rp->index);.    
12570 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
12580 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a      %5s ",buf);.
12590 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
125a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
125b0 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20  "          ");. 
125c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e       }.      Con
125d0 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29  figPrint(fp,cfp)
125e0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
125f0 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 64 65 66  fp,"\n");.#ifdef
12600 20 54 45 53 54 0a 20 20 20 20 20 20 53 65 74 50   TEST.      SetP
12610 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 77 73  rint(fp,cfp->fws
12620 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20 50 6c  ,lemp);.      Pl
12630 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d  inkPrint(fp,cfp-
12640 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b 0a 20  >fplp,"To  ");. 
12650 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28       PlinkPrint(
12660 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22 46 72  fp,cfp->bplp,"Fr
12670 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  om");.#endif.   
12680 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73     if( lemp->bas
12690 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63 66 70  isflag ) cfp=cfp
126a0 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c 73 65  ->bp;.      else
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 3b    cfp=cfp->next;
126d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
126e0 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20  tf(fp,"\n");.   
126f0 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
12700 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
12710 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 72 69  ){.      if( Pri
12720 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70 2c 33  ntAction(ap,fp,3
12730 30 29 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c  0) ) fprintf(fp,
12740 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  "\n");.    }.   
12750 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
12760 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
12770 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fp);.  return;.}
12780 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20  ../* Search for 
12790 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20  the file "name" 
127a0 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20  which is in the 
127b0 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
127c0 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61  s.** the exacuta
127d0 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63  ble */.PRIVATE c
127e0 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28  har *pathsearch(
127f0 61 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d  argv0,name,modem
12800 61 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76 30  ask).char *argv0
12810 3b 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e  ;.char *name;.in
12820 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20  t modemask;.{.  
12830 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a  char *pathlist;.
12840 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70    char *path,*cp
12850 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 65 78  ;.  char c;.  ex
12860 74 65 72 6e 20 69 6e 74 20 61 63 63 65 73 73 28  tern int access(
12870 29 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e  );..#ifdef __WIN
12880 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72  32__.  cp = strr
12890 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b  chr(argv0,'\\');
128a0 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74  .#else.  cp = st
128b0 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29  rrchr(argv0,'/')
128c0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63  ;.#endif.  if( c
128d0 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70  p ){.    c = *cp
128e0 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20  ;.    *cp = 0;. 
128f0 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20     path = (char 
12900 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e  *)malloc( strlen
12910 28 61 72 67 76 30 29 20 2b 20 73 74 72 6c 65 6e  (argv0) + strlen
12920 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20 20  (name) + 2 );.  
12930 20 20 69 66 28 20 70 61 74 68 20 29 20 73 70 72    if( path ) spr
12940 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73  intf(path,"%s/%s
12950 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20  ",argv0,name);. 
12960 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65     *cp = c;.  }e
12970 6c 73 65 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  lse{.    extern 
12980 63 68 61 72 20 2a 67 65 74 65 6e 76 28 29 3b 0a  char *getenv();.
12990 20 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20 67      pathlist = g
129a0 65 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a 20  etenv("PATH");. 
129b0 20 20 20 69 66 28 20 70 61 74 68 6c 69 73 74 3d     if( pathlist=
129c0 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20  =0 ) pathlist = 
129d0 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e  ".:/bin:/usr/bin
129e0 22 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63  ";.    path = (c
129f0 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 74  har *)malloc( st
12a00 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b 73  rlen(pathlist)+s
12a10 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b  trlen(name)+2 );
12a20 0a 20 20 20 20 69 66 28 20 70 61 74 68 21 3d 30  .    if( path!=0
12a30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
12a40 20 2a 70 61 74 68 6c 69 73 74 20 29 7b 0a 20 20   *pathlist ){.  
12a50 20 20 20 20 20 20 63 70 20 3d 20 73 74 72 63 68        cp = strch
12a60 72 28 70 61 74 68 6c 69 73 74 2c 27 3a 27 29 3b  r(pathlist,':');
12a70 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 70 3d  .        if( cp=
12a80 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74 68 6c  =0 ) cp = &pathl
12a90 69 73 74 5b 73 74 72 6c 65 6e 28 70 61 74 68 6c  ist[strlen(pathl
12aa0 69 73 74 29 5d 3b 0a 20 20 20 20 20 20 20 20 63  ist)];.        c
12ab0 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20   = *cp;.        
12ac0 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *cp = 0;.       
12ad0 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25   sprintf(path,"%
12ae0 73 2f 25 73 22 2c 70 61 74 68 6c 69 73 74 2c 6e  s/%s",pathlist,n
12af0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63  ame);.        *c
12b00 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69  p = c;.        i
12b10 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68 6c 69  f( c==0 ) pathli
12b20 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  st = "";.       
12b30 20 65 6c 73 65 20 70 61 74 68 6c 69 73 74 20 3d   else pathlist =
12b40 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20   &cp[1];.       
12b50 20 69 66 28 20 61 63 63 65 73 73 28 70 61 74 68   if( access(path
12b60 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20  ,modemask)==0 ) 
12b70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
12b80 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12b90 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69  n path;.}../* Gi
12ba0 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63  ven an action, c
12bb0 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65 67  ompute the integ
12bc0 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61  er value for tha
12bd0 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63  t action.** whic
12be0 68 20 69 73 20 74 6f 20 62 65 20 70 75 74 20 69  h is to be put i
12bf0 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  n the action tab
12c00 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61  le of the genera
12c10 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ted machine..** 
12c20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20  Return negative 
12c30 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f  if no action sho
12c40 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64  uld be generated
12c50 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  ..*/.PRIVATE int
12c60 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
12c70 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75 63 74 20  lemp,ap).struct 
12c80 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72  lemon *lemp;.str
12c90 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
12ca0 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20 73  {.  int act;.  s
12cb0 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20  witch( ap->type 
12cc0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46  ){.    case SHIF
12cd0 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e  T:  act = ap->x.
12ce0 73 74 70 2d 3e 69 6e 64 65 78 3b 20 20 20 20 20  stp->index;     
12cf0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
12d00 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45  .    case REDUCE
12d10 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70  : act = ap->x.rp
12d20 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d 3e  ->index + lemp->
12d30 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a 20  nstate; break;. 
12d40 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20 20     case ERROR:  
12d50 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
12d60 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
12d70 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
12d80 20 63 61 73 65 20 41 43 43 45 50 54 3a 20 61 63   case ACCEPT: ac
12d90 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  t = lemp->nstate
12da0 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b   + lemp->nrule +
12db0 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64   1; break;.    d
12dc0 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20  efault:     act 
12dd0 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d  = -1; break;.  }
12de0 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d  .  return act;.}
12df0 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49  ..#define LINESI
12e00 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e  ZE 1000./* The n
12e10 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72  ext cluster of r
12e20 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20  outines are for 
12e30 72 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70  reading the temp
12e40 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  late file.** and
12e50 20 77 72 69 74 69 6e 67 20 74 68 65 20 72 65 73   writing the res
12e60 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65  ults to the gene
12e70 72 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a  rated parser */.
12e80 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 75 6e  /* The first fun
12e90 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20  ction transfers 
12ea0 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74  data from "in" t
12eb0 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a  o "out" until.**
12ec0 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20   a line is seen 
12ed0 77 68 69 63 68 20 62 65 67 69 6e 73 20 77 69 74  which begins wit
12ee0 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e  h "%%".  The lin
12ef0 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74  e number is.** t
12f00 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  racked..**.** if
12f10 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61   name!=0, then a
12f20 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62 65 67  ny word that beg
12f30 69 6e 20 77 69 74 68 20 22 50 61 72 73 65 22 20  in with "Parse" 
12f40 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a  is changed to.**
12f50 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d   begin with *nam
12f60 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52  e instead..*/.PR
12f70 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f  IVATE void tplt_
12f80 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f 75 74  xfer(name,in,out
12f90 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20 2a 6e  ,lineno).char *n
12fa0 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b 0a 46  ame;.FILE *in;.F
12fb0 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 2a 6c  ILE *out;.int *l
12fc0 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74 20 69  ineno;.{.  int i
12fd0 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61 72  , iStart;.  char
12fe0 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b   line[LINESIZE];
12ff0 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28  .  while( fgets(
13000 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e  line,LINESIZE,in
13010 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d 27  ) && (line[0]!='
13020 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27  %' || line[1]!='
13030 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69 6e  %') ){.    (*lin
13040 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74 61  eno)++;.    iSta
13050 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  rt = 0;.    if( 
13060 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66 6f  name ){.      fo
13070 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20  r(i=0; line[i]; 
13080 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
13090 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20 26  ( line[i]=='P' &
130a0 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65 5b  & strncmp(&line[
130b0 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d 30  i],"Parse",5)==0
130c0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 69  .          && (i
130d0 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61 28  ==0 || !isalpha(
130e0 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20 20  line[i-1])).    
130f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
13100 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29 20   if( i>iStart ) 
13110 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a  fprintf(out,"%.*
13120 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69 6e  s",i-iStart,&lin
13130 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20 20  e[iStart]);.    
13140 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13150 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20 20  t,"%s",name);.  
13160 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
13170 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74            iStart
13180 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20   = i+1;.        
13190 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
131a0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
131b0 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61 72  "%s",&line[iStar
131c0 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54  t]);.  }.}../* T
131d0 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f 6e  he next function
131e0 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70 6c   finds the templ
131f0 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70 65  ate file and ope
13200 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e 67  ns it, returning
13210 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
13220 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65   the opened file
13230 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c  . */.PRIVATE FIL
13240 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d  E *tplt_open(lem
13250 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
13260 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61 74 69  *lemp;.{.  stati
13270 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65 6e  c char templaten
13280 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e  ame[] = "lempar.
13290 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31  c";.  char buf[1
132a0 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e  000];.  FILE *in
132b0 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e 61  ;.  char *tpltna
132c0 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  me;.  char *cp;.
132d0 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
132e0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27  lemp->filename,'
132f0 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 7b  .');.  if( cp ){
13300 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66  .    sprintf(buf
13310 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74 29  ,"%.*s.lt",(int)
13320 63 70 2d 28 69 6e 74 29 6c 65 6d 70 2d 3e 66 69  cp-(int)lemp->fi
13330 6c 65 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c  lename,lemp->fil
13340 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
13350 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66  .    sprintf(buf
13360 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66  ,"%s.lt",lemp->f
13370 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ilename);.  }.  
13380 69 66 28 20 61 63 63 65 73 73 28 62 75 66 2c 30  if( access(buf,0
13390 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70  04)==0 ){.    tp
133a0 6c 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20  ltname = buf;.  
133b0 7d 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73  }else if( access
133c0 28 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30  (templatename,00
133d0 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c  4)==0 ){.    tpl
133e0 74 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65  tname = template
133f0 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  name;.  }else{. 
13400 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61     tpltname = pa
13410 74 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61  thsearch(lemp->a
13420 72 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d  rgv0,templatenam
13430 65 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e,0);.  }.  if( 
13440 74 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  tpltname==0 ){. 
13450 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
13460 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68  r,"Can't find th
13470 65 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20  e parser driver 
13480 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22  template file \"
13490 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65  %s\".\n",.    te
134a0 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20  mplatename);.   
134b0 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
134c0 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  +;.    return 0;
134d0 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65  .  }.  in = fope
134e0 6e 28 74 70 6c 74 6e 61 6d 65 2c 22 72 22 29 3b  n(tpltname,"r");
134f0 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
13500 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
13510 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
13520 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
13530 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70   \"%s\".\n",temp
13540 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
13550 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
13560 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13570 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a   }.  return in;.
13580 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74  }../* Print a st
13590 72 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65  ring to the file
135a0 20 61 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69   and keep the li
135b0 6e 65 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64  nenumber up to d
135c0 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ate */.PRIVATE v
135d0 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  oid tplt_print(o
135e0 75 74 2c 6c 65 6d 70 2c 73 74 72 2c 73 74 72 6c  ut,lemp,str,strl
135f0 6e 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a  n,lineno).FILE *
13600 6f 75 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  out;.struct lemo
13610 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73  n *lemp;.char *s
13620 74 72 3b 0a 69 6e 74 20 73 74 72 6c 6e 3b 0a 69  tr;.int strln;.i
13630 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20  nt *lineno;.{.  
13640 69 66 28 20 73 74 72 3d 3d 30 20 29 20 72 65 74  if( str==0 ) ret
13650 75 72 6e 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  urn;.  fprintf(o
13660 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25  ut,"#line %d \"%
13670 73 5c 22 5c 6e 22 2c 73 74 72 6c 6e 2c 6c 65 6d  s\"\n",strln,lem
13680 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 28 2a  p->filename); (*
13690 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 77 68 69  lineno)++;.  whi
136a0 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20 20 20  le( *str ){.    
136b0 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29  if( *str=='\n' )
136c0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
136d0 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29    putc(*str,out)
136e0 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d  ;.    str++;.  }
136f0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
13700 5c 6e 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c  \n#line %d \"%s\
13710 22 5c 6e 22 2c 2a 6c 69 6e 65 6e 6f 2b 32 2c 6c  "\n",*lineno+2,l
13720 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 28  emp->outname); (
13730 2a 6c 69 6e 65 6e 6f 29 2b 3d 32 3b 0a 20 20 72  *lineno)+=2;.  r
13740 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
13750 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
13760 75 74 69 6e 65 20 65 6d 69 74 73 20 63 6f 64 65  utine emits code
13770 20 66 6f 72 20 74 68 65 20 64 65 73 74 72 75 63   for the destruc
13780 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  tor for the.** s
13790 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64  ymbol sp.*/.void
137a0 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
137b0 5f 63 6f 64 65 28 6f 75 74 2c 73 70 2c 6c 65 6d  _code(out,sp,lem
137c0 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a  p,lineno).FILE *
137d0 6f 75 74 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  out;.struct symb
137e0 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c  ol *sp;.struct l
137f0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20  emon *lemp;.int 
13800 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72  *lineno;.{. char
13810 20 2a 63 70 3b 0a 0a 20 69 6e 74 20 6c 69 6e 65   *cp;.. int line
13820 63 6e 74 20 3d 20 30 3b 0a 20 69 66 28 20 73 70  cnt = 0;. if( sp
13830 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
13840 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70   ){.   cp = lemp
13850 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20  ->tokendest;.   
13860 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75  if( cp==0 ) retu
13870 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  rn;.   fprintf(o
13880 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25  ut,"#line %d \"%
13890 73 5c 22 5c 6e 7b 22 2c 6c 65 6d 70 2d 3e 74 6f  s\"\n{",lemp->to
138a0 6b 65 6e 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e  kendestln,lemp->
138b0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73  filename);. }els
138c0 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75  e if( sp->destru
138d0 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20  ctor ){.   cp = 
138e0 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
138f0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
13900 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
13910 6e 7b 22 2c 73 70 2d 3e 64 65 73 74 72 75 63 74  n{",sp->destruct
13920 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  orln,lemp->filen
13930 61 6d 65 29 3b 0a 20 7d 65 6c 73 65 20 69 66 28  ame);. }else if(
13940 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
13950 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  {.   cp = lemp->
13960 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20  vardest;.   if( 
13970 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
13980 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
13990 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
139a0 6e 7b 22 2c 6c 65 6d 70 2d 3e 76 61 72 64 65 73  n{",lemp->vardes
139b0 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  tln,lemp->filena
139c0 6d 65 29 3b 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a  me);. }. for(; *
139d0 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66  cp; cp++){.   if
139e0 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70  ( *cp=='$' && cp
139f0 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20  [1]=='$' ){.    
13a00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79   fprintf(out,"(y
13a10 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c  ypminor->yy%d)",
13a20 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20  sp->dtnum);.    
13a30 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74   cp++;.     cont
13a40 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66  inue;.   }.   if
13a50 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69  ( *cp=='\n' ) li
13a60 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 66 70 75 74  necnt++;.   fput
13a70 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20  c(*cp,out);. }. 
13a80 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b  (*lineno) += 3 +
13a90 20 6c 69 6e 65 63 6e 74 3b 0a 20 66 70 72 69 6e   linecnt;. fprin
13aa0 74 66 28 6f 75 74 2c 22 7d 5c 6e 23 6c 69 6e 65  tf(out,"}\n#line
13ab0 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c   %d \"%s\"\n",*l
13ac0 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ineno,lemp->outn
13ad0 61 6d 65 29 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d  ame);. return;.}
13ae0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
13af0 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  RUE (non-zero) i
13b00 66 20 74 68 65 20 67 69 76 65 6e 20 73 79 6d 62  f the given symb
13b10 6f 6c 20 68 61 73 20 61 20 64 65 73 74 72 75 63  ol has a destruc
13b20 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f  tor..*/.int has_
13b30 64 65 73 74 72 75 63 74 6f 72 28 73 70 2c 20 6c  destructor(sp, l
13b40 65 6d 70 29 0a 73 74 72 75 63 74 20 73 79 6d 62  emp).struct symb
13b50 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c  ol *sp;.struct l
13b60 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
13b70 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20 73  int ret;.  if( s
13b80 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
13b90 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c  L ){.    ret = l
13ba0 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d  emp->tokendest!=
13bb0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
13bc0 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64  ret = lemp->vard
13bd0 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65  est!=0 || sp->de
13be0 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d  structor!=0;.  }
13bf0 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
13c00 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74  ../* .** Generat
13c10 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
13c20 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72  cutes when the r
13c30 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75  ule "rp" is redu
13c40 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74  ced.  Write.** t
13c50 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22  he code to "out"
13c60 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e  .  Make sure lin
13c70 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d  eno stays up-to-
13c80 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  date..*/.PRIVATE
13c90 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28   void emit_code(
13ca0 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65  out,rp,lemp,line
13cb0 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73  no).FILE *out;.s
13cc0 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
13cd0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
13ce0 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b  mp;.int *lineno;
13cf0 0a 7b 0a 20 63 68 61 72 20 2a 63 70 2c 20 2a 78  .{. char *cp, *x
13d00 70 3b 0a 20 69 6e 74 20 6c 69 6e 65 63 6e 74 20  p;. int linecnt 
13d10 3d 20 30 3b 0a 20 69 6e 74 20 69 3b 0a 20 63 68  = 0;. int i;. ch
13d20 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20  ar lhsused = 0; 
13d30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
13d40 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61  e LHS element ha
13d50 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
13d60 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53  char used[MAXRHS
13d70 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72  ];   /* True for
13d80 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e   each RHS elemen
13d90 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20  t which is used 
13da0 2a 2f 0a 0a 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.. for(i=0; i<
13db0 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75  rp->nrhs; i++) u
13dc0 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 6c 68 73  sed[i] = 0;. lhs
13dd0 75 73 65 64 20 3d 20 30 3b 0a 0a 20 2f 2a 20 47  used = 0;.. /* G
13de0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13df0 64 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63  do the reduce ac
13e00 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d  tion */. if( rp-
13e10 3e 63 6f 64 65 20 29 7b 0a 20 20 20 66 70 72 69  >code ){.   fpri
13e20 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25  ntf(out,"#line %
13e30 64 20 5c 22 25 73 5c 22 5c 6e 7b 22 2c 72 70 2d  d \"%s\"\n{",rp-
13e40 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65  >line,lemp->file
13e50 6e 61 6d 65 29 3b 0a 20 20 20 66 6f 72 28 63 70  name);.   for(cp
13e60 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20  =rp->code; *cp; 
13e70 63 70 2b 2b 29 7b 0a 20 20 20 20 20 69 66 28 20  cp++){.     if( 
13e80 69 73 61 6c 70 68 61 28 2a 63 70 29 20 26 26 20  isalpha(*cp) && 
13e90 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c  (cp==rp->code ||
13ea0 20 21 69 73 61 6c 6e 75 6d 28 63 70 5b 2d 31 5d   !isalnum(cp[-1]
13eb0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 63 68 61  )) ){.       cha
13ec0 72 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20  r saved;.       
13ed0 66 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20  for(xp= &cp[1]; 
13ee0 69 73 61 6c 6e 75 6d 28 2a 78 70 29 3b 20 78 70  isalnum(*xp); xp
13ef0 2b 2b 29 3b 0a 20 20 20 20 20 20 20 73 61 76 65  ++);.       save
13f00 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 20  d = *xp;.       
13f10 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *xp = 0;.       
13f20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
13f30 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
13f40 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29  ->lhsalias)==0 )
13f50 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  {.         fprin
13f60 74 66 28 6f 75 74 2c 22 79 79 67 6f 74 6f 6d 69  tf(out,"yygotomi
13f70 6e 6f 72 2e 79 79 25 64 22 2c 72 70 2d 3e 6c 68  nor.yy%d",rp->lh
13f80 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20  s->dtnum);.     
13f90 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
13fa0 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20        lhsused = 
13fb0 31 3b 0a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  1;.       }else{
13fc0 0a 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  .         for(i=
13fd0 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
13fe0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
13ff0 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
14000 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 63 70  [i] && strcmp(cp
14010 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
14020 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
14030 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
14040 2c 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f  ,"yymsp[%d].mino
14050 72 2e 79 79 25 64 22 2c 69 2d 72 70 2d 3e 6e 72  r.yy%d",i-rp->nr
14060 68 73 2b 31 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  hs+1,rp->rhs[i]-
14070 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20  >dtnum);.       
14080 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20        cp = xp;. 
14090 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64              used
140a0 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  [i] = 1;.       
140b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
140c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
140d0 20 20 20 7d 0a 20 20 20 20 20 20 20 7d 0a 20 20     }.       }.  
140e0 20 20 20 20 20 2a 78 70 20 3d 20 73 61 76 65 64       *xp = saved
140f0 3b 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 69 66  ;.     }.     if
14100 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69  ( *cp=='\n' ) li
14110 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 66 70  necnt++;.     fp
14120 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 20  utc(*cp,out);.  
14130 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a   } /* End loop *
14140 2f 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b  /.   (*lineno) +
14150 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20  = 3 + linecnt;. 
14160 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d    fprintf(out,"}
14170 5c 6e 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c  \n#line %d \"%s\
14180 22 5c 6e 22 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  "\n",*lineno,lem
14190 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d 20  p->outname);. } 
141a0 2f 2a 20 45 6e 64 20 69 66 28 20 72 70 2d 3e 63  /* End if( rp->c
141b0 6f 64 65 20 29 20 2a 2f 0a 0a 20 2f 2a 20 43 68  ode ) */.. /* Ch
141c0 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
141d0 20 74 68 65 20 4c 48 53 20 68 61 73 20 62 65 65   the LHS has bee
141e0 6e 20 75 73 65 64 20 2a 2f 0a 20 69 66 28 20 72  n used */. if( r
141f0 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 21  p->lhsalias && !
14200 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20 45 72  lhsused ){.   Er
14210 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
14220 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
14230 6e 65 2c 0a 20 20 20 20 20 22 4c 61 62 65 6c 20  ne,.     "Label 
14240 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25 73 28  \"%s\" for \"%s(
14250 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75  %s)\" is never u
14260 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 72 70  sed.",.       rp
14270 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c  ->lhsalias,rp->l
14280 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73  hs->name,rp->lhs
14290 61 6c 69 61 73 29 3b 0a 20 20 20 6c 65 6d 70 2d  alias);.   lemp-
142a0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 7d 0a  >errorcnt++;. }.
142b0 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64 65  . /* Generate de
142c0 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66 6f  structor code fo
142d0 72 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 68  r RHS symbols wh
142e0 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64  ich are not used
142f0 20 69 6e 20 74 68 65 0a 20 2a 2a 20 72 65 64 75   in the. ** redu
14300 63 65 20 63 6f 64 65 20 2a 2f 0a 20 66 6f 72 28  ce code */. for(
14310 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
14320 20 69 2b 2b 29 7b 0a 20 20 20 69 66 28 20 72 70   i++){.   if( rp
14330 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26  ->rhsalias[i] &&
14340 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20   !used[i] ){.   
14350 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
14360 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
14370 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 22  leline,.       "
14380 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25  Label %s for \"%
14390 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
143a0 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
143b0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c  rp->rhsalias[i],
143c0 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65  rp->rhs[i]->name
143d0 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
143e0 29 3b 0a 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  );.     lemp->er
143f0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 7d 65 6c  rorcnt++;.   }el
14400 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c  se if( rp->rhsal
14410 69 61 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  ias[i]==0 ){.   
14420 20 20 69 66 28 20 68 61 73 5f 64 65 73 74 72 75    if( has_destru
14430 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c  ctor(rp->rhs[i],
14440 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20 20  lemp) ){.       
14450 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 79  fprintf(out,"  y
14460 79 5f 64 65 73 74 72 75 63 74 6f 72 28 25 64 2c  y_destructor(%d,
14470 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72  &yymsp[%d].minor
14480 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  );\n",.         
14490 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64   rp->rhs[i]->ind
144a0 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29  ex,i-rp->nrhs+1)
144b0 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ; (*lineno)++;. 
144c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
144d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
144e0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73         /* No des
144f0 74 72 75 63 74 6f 72 20 64 65 66 69 6e 65 64 20  tructor defined 
14500 66 6f 72 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20  for %s */\n",.  
14510 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
14520 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
14530 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
14540 20 20 20 7d 0a 20 20 20 7d 0a 20 7d 0a 20 72 65     }.   }. }. re
14550 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  turn;.}../*.** P
14560 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74  rint the definit
14570 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e  ion of the union
14580 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 61   used for the pa
14590 72 73 65 72 27 73 20 64 61 74 61 20 73 74 61 63  rser's data stac
145a0 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e  k..** This union
145b0 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73   contains fields
145c0 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69   for every possi
145d0 62 6c 65 20 64 61 74 61 20 74 79 70 65 20 66 6f  ble data type fo
145e0 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20  r tokens.** and 
145f0 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49  nonterminals.  I
14600 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  n the process of
14610 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70   computing and p
14620 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20  rinting this.** 
14630 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20  union, also set 
14640 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65  the ".dtnum" fie
14650 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d  ld of every term
14660 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d  inal and nonterm
14670 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a  inal.** symbol..
14680 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74  */.void print_st
14690 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65  ack_union(out,le
146a0 6d 70 2c 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61  mp,plineno,mhfla
146b0 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20  g).FILE *out;   
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
146d0 2a 20 54 68 65 20 6f 75 74 70 75 74 20 73 74 72  * The output str
146e0 65 61 6d 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65  eam */.struct le
146f0 6d 6f 6e 20 2a 6c 65 6d 70 3b 20 20 20 20 20 20  mon *lemp;      
14700 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69     /* The main i
14710 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f  nfo structure fo
14720 72 20 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f  r this parser */
14730 0a 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20  .int *plineno;  
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14750 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  Pointer to the l
14760 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 69 6e  ine number */.in
14770 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 20 20  t mhflag;       
14780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14790 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20  e if generating 
147a0 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70  makeheaders outp
147b0 75 74 20 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c 69  ut */.{.  int li
147c0 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b  neno = *plineno;
147d0 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20      /* The line 
147e0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f 75  number of the ou
147f0 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tput */.  char *
14800 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20 20 20  *types;         
14810 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74 61      /* A hash ta
14820 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73  ble of datatypes
14830 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79 73   */.  int arrays
14840 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
14850 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 22  /* Size of the "
14860 74 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f 0a  types" array */.
14870 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74    int maxdtlengt
14880 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  h;          /* M
14890 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66  aximum length of
148a0 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65 22   any ".datatype"
148b0 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61   field. */.  cha
148c0 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20 20  r *stddt;       
148d0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64 61         /* Standa
148e0 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20  rdized name for 
148f0 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20 20  a datatype */.  
14900 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20 20  int i,j;        
14910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
14920 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
14930 69 6e 74 20 68 61 73 68 3b 20 20 20 20 20 20 20  int hash;       
14940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
14950 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61 6d   hashing the nam
14960 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a 20  e of a type */. 
14970 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20   char *name;    
14980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
14990 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  me of the parser
149a0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
149b0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
149c0 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c  e types[] and al
149d0 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20 2a  locate stddt[] *
149e0 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d 20  /.  arraysize = 
149f0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20  lemp->nsymbol * 
14a00 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63 68  2;.  types = (ch
14a10 61 72 2a 2a 29 6d 61 6c 6c 6f 63 28 20 61 72 72  ar**)malloc( arr
14a20 61 79 73 69 7a 65 20 2a 20 73 69 7a 65 6f 66 28  aysize * sizeof(
14a30 63 68 61 72 2a 29 20 29 3b 0a 20 20 66 6f 72 28  char*) );.  for(
14a40 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65  i=0; i<arraysize
14a50 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20  ; i++) types[i] 
14a60 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67  = 0;.  maxdtleng
14a70 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65  th = 0;.  if( le
14a80 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b 0a 20  mp->vartype ){. 
14a90 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d     maxdtlength =
14aa0 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61   strlen(lemp->va
14ab0 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  rtype);.  }.  fo
14ac0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
14ad0 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
14ae0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73    int len;.    s
14af0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
14b00 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
14b10 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  [i];.    if( sp-
14b20 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20 63  >datatype==0 ) c
14b30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e  ontinue;.    len
14b40 20 3d 20 73 74 72 6c 65 6e 28 73 70 2d 3e 64 61   = strlen(sp->da
14b50 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  tatype);.    if(
14b60 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68   len>maxdtlength
14b70 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d   ) maxdtlength =
14b80 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64   len;.  }.  stdd
14b90 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  t = (char*)mallo
14ba0 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32  c( maxdtlength*2
14bb0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 74 79   + 1 );.  if( ty
14bc0 70 65 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d  pes==0 || stddt=
14bd0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
14be0 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66  f(stderr,"Out of
14bf0 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20   memory.\n");.  
14c00 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a    exit(1);.  }..
14c10 20 20 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73    /* Build a has
14c20 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74  h table of datat
14c30 79 70 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75  ypes. The ".dtnu
14c40 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68  m" field of each
14c50 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20   symbol.  ** is 
14c60 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74  filled in with t
14c70 68 65 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c  he hash index pl
14c80 75 73 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d  us 1.  A ".dtnum
14c90 22 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a  " value of 0 is.
14ca0 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65    ** used for te
14cb0 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20  rminal symbols. 
14cc0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
14cd0 25 64 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65  %default_type de
14ce0 66 69 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20  fined then.  ** 
14cf0 30 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61  0 is also used a
14d00 73 20 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c  s the .dtnum val
14d10 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e  ue for nontermin
14d20 61 6c 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74  als which do not
14d30 20 73 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20   specify.  ** a 
14d40 64 61 74 61 74 79 70 65 20 75 73 69 6e 67 20 74  datatype using t
14d50 68 65 20 25 74 79 70 65 20 64 69 72 65 63 74 69  he %type directi
14d60 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ve..  */.  for(i
14d70 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
14d80 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
14d90 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
14da0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
14db0 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  [i];.    char *c
14dc0 70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c  p;.    if( sp==l
14dd0 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20  emp->errsym ){. 
14de0 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
14df0 20 61 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20   arraysize+1;.  
14e00 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
14e10 20 20 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e    }.    if( sp->
14e20 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type!=NONTERMINA
14e30 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79  L || (sp->dataty
14e40 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76  pe==0 && lemp->v
14e50 61 72 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20  artype==0) ){.  
14e60 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
14e70 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
14e80 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20  e;.    }.    cp 
14e90 3d 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a  = sp->datatype;.
14ea0 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20      if( cp==0 ) 
14eb0 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79  cp = lemp->varty
14ec0 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20  pe;.    j = 0;. 
14ed0 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
14ee0 65 28 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20  e(*cp) ) cp++;. 
14ef0 20 20 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20     while( *cp ) 
14f00 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70  stddt[j++] = *cp
14f10 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a  ++;.    while( j
14f20 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 73 74  >0 && isspace(st
14f30 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b  ddt[j-1]) ) j--;
14f40 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20  .    stddt[j] = 
14f50 30 3b 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b  0;.    hash = 0;
14f60 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74  .    for(j=0; st
14f70 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ddt[j]; j++){.  
14f80 20 20 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a      hash = hash*
14f90 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20  53 + stddt[j];. 
14fa0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 68 61 73     }.    if( has
14fb0 68 3c 30 20 29 20 68 61 73 68 20 3d 20 2d 68 61  h<0 ) hash = -ha
14fc0 73 68 3b 0a 20 20 20 20 68 61 73 68 20 3d 20 68  sh;.    hash = h
14fd0 61 73 68 25 61 72 72 61 79 73 69 7a 65 3b 0a 20  ash%arraysize;. 
14fe0 20 20 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b     while( types[
14ff0 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69  hash] ){.      i
15000 66 28 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b  f( strcmp(types[
15010 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20  hash],stddt)==0 
15020 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64  ){.        sp->d
15030 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b  tnum = hash + 1;
15040 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61        }.      ha
15060 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  sh++;.      if( 
15070 68 61 73 68 3e 3d 61 72 72 61 79 73 69 7a 65 20  hash>=arraysize 
15080 29 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20  ) hash = 0;.    
15090 7d 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b  }.    if( types[
150a0 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  hash]==0 ){.    
150b0 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61    sp->dtnum = ha
150c0 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 74 79  sh + 1;.      ty
150d0 70 65 73 5b 68 61 73 68 5d 20 3d 20 28 63 68 61  pes[hash] = (cha
150e0 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65  r*)malloc( strle
150f0 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20  n(stddt)+1 );.  
15100 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61      if( types[ha
15110 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sh]==0 ){.      
15120 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
15130 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
15140 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78  \n");.        ex
15150 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  it(1);.      }. 
15160 20 20 20 20 20 73 74 72 63 70 79 28 74 79 70 65       strcpy(type
15170 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a  s[hash],stddt);.
15180 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15190 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20 64 65  Print out the de
151a0 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f  finition of YYTO
151b0 4b 45 4e 54 59 50 45 20 61 6e 64 20 59 59 4d 49  KENTYPE and YYMI
151c0 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d  NORTYPE */.  nam
151d0 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f  e = lemp->name ?
151e0 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50   lemp->name : "P
151f0 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20  arse";.  lineno 
15200 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66  = *plineno;.  if
15210 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69  ( mhflag ){ fpri
15220 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54  ntf(out,"#if INT
15230 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65  ERFACE\n"); line
15240 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74  no++; }.  fprint
15250 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
15260 73 54 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22  sTOKENTYPE %s\n"
15270 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d  ,name,.    lemp-
15280 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d  >tokentype?lemp-
15290 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64  >tokentype:"void
152a0 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  *");  lineno++;.
152b0 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20    if( mhflag ){ 
152c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
152d0 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
152e0 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  +; }.  fprintf(o
152f0 75 74 2c 22 74 79 70 65 64 65 66 20 75 6e 69 6f  ut,"typedef unio
15300 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  n {\n"); lineno+
15310 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
15320 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45 20  ,"  %sTOKENTYPE 
15330 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  yy0;\n",name); l
15340 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
15350 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b  =0; i<arraysize;
15360 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74   i++){.    if( t
15370 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  ypes[i]==0 ) con
15380 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e  tinue;.    fprin
15390 74 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79 25  tf(out,"  %s yy%
153a0 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69  d;\n",types[i],i
153b0 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  +1); lineno++;. 
153c0 20 20 20 66 72 65 65 28 74 79 70 65 73 5b 69 5d     free(types[i]
153d0 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  );.  }.  fprintf
153e0 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25 64  (out,"  int yy%d
153f0 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  ;\n",lemp->errsy
15400 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e  m->dtnum); linen
15410 6f 2b 2b 3b 0a 20 20 66 72 65 65 28 73 74 64 64  o++;.  free(stdd
15420 74 29 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73  t);.  free(types
15430 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
15440 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b  ,"} YYMINORTYPE;
15450 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
15460 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e    *plineno = lin
15470 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  eno;.}../* Gener
15480 61 74 65 20 43 20 73 6f 75 72 63 65 20 63 6f 64  ate C source cod
15490 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  e for the parser
154a0 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 54   */.void ReportT
154b0 61 62 6c 65 28 6c 65 6d 70 2c 20 6d 68 66 6c 61  able(lemp, mhfla
154c0 67 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  g).struct lemon 
154d0 2a 6c 65 6d 70 3b 0a 69 6e 74 20 6d 68 66 6c 61  *lemp;.int mhfla
154e0 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  g;     /* Output
154f0 20 69 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20   in makeheaders 
15500 66 6f 72 6d 61 74 20 69 66 20 74 72 75 65 20 2a  format if true *
15510 2f 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  /.{.  FILE *out,
15520 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e   *in;.  char lin
15530 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69  e[LINESIZE];.  i
15540 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74  nt  lineno;.  st
15550 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
15560 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
15570 20 2a 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72   *ap;.  struct r
15580 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20 69  ule *rp;.  int i
15590 3b 0a 20 20 69 6e 74 20 74 61 62 6c 65 63 6e 74  ;.  int tablecnt
155a0 3b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a  ;.  char *name;.
155b0 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65  .  in = tplt_ope
155c0 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69  n(lemp);.  if( i
155d0 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
155e0 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e   out = file_open
155f0 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 22 29 3b  (lemp,".c","w");
15600 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b  .  if( out==0 ){
15610 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
15620 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
15630 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20  .  lineno = 1;. 
15640 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
15650 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
15660 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
15670 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75 64  erate the includ
15680 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a  e code, if any *
15690 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
156a0 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e  ut,lemp,lemp->in
156b0 63 6c 75 64 65 2c 6c 65 6d 70 2d 3e 69 6e 63 6c  clude,lemp->incl
156c0 75 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  udeln,&lineno);.
156d0 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a    if( mhflag ){.
156e0 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d      char *name =
156f0 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c   file_makename(l
15700 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20  emp, ".h");.    
15710 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e  fprintf(out,"#in
15720 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c  clude \"%s\"\n",
15730 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   name); lineno++
15740 3b 0a 20 20 20 20 66 72 65 65 28 6e 61 6d 65 29  ;.    free(name)
15750 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
15760 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
15770 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
15780 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64 65   /* Generate #de
15790 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f  fines for all to
157a0 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68  kens */.  if( mh
157b0 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72  flag ){.    char
157c0 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20 66 70   *prefix;.    fp
157d0 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49  rintf(out,"#if I
157e0 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69  NTERFACE\n"); li
157f0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20  neno++;.    if( 
15800 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
15810 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d  x ) prefix = lem
15820 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
15830 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
15840 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
15850 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72  ix = "";.    for
15860 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=1; i<lemp->nt
15870 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20  erminal; i++){. 
15880 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15890 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30  ,"#define %s%-30
158a0 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c  s %2d\n",prefix,
158b0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
158c0 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20  ->name,i);.     
158d0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
158e0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
158f0 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
15900 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
15910 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
15920 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
15930 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
15940 74 65 20 74 68 65 20 64 65 66 69 6e 65 73 20 2a  te the defines *
15950 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
15960 22 2f 2a 20 5c 30 30 31 20 2a 2f 5c 6e 22 29 3b  "/* \001 */\n");
15970 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
15980 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45 54 59  #define YYCODETY
15990 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6c 65  PE %s\n",.    le
159a0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3e 32 35 30 3f  mp->nsymbol>250?
159b0 22 69 6e 74 22 3a 22 75 6e 73 69 67 6e 65 64 20  "int":"unsigned 
159c0 63 68 61 72 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b  char");  lineno+
159d0 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
159e0 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f  ,"#define YYNOCO
159f0 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e  DE %d\n",lemp->n
15a00 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65  symbol+1);  line
15a10 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
15a20 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41  out,"#define YYA
15a30 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c  CTIONTYPE %s\n",
15a40 0a 20 20 20 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  .    lemp->nstat
15a50 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3e 32 35  e+lemp->nrule>25
15a60 30 3f 22 69 6e 74 22 3a 22 75 6e 73 69 67 6e 65  0?"int":"unsigne
15a70 64 20 63 68 61 72 22 29 3b 20 20 6c 69 6e 65 6e  d char");  linen
15a80 6f 2b 2b 3b 0a 20 20 70 72 69 6e 74 5f 73 74 61  o++;.  print_sta
15a90 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d  ck_union(out,lem
15aa0 70 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67  p,&lineno,mhflag
15ab0 29 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73  );.  if( lemp->s
15ac0 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20  tacksize ){.    
15ad0 69 66 28 20 61 74 6f 69 28 6c 65 6d 70 2d 3e 73  if( atoi(lemp->s
15ae0 74 61 63 6b 73 69 7a 65 29 3c 3d 30 20 29 7b 0a  tacksize)<=0 ){.
15af0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
15b00 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c  emp->filename,0,
15b10 0a 22 49 6c 6c 65 67 61 6c 20 73 74 61 63 6b 20  ."Illegal stack 
15b20 73 69 7a 65 3a 20 5b 25 73 5d 2e 20 20 54 68 65  size: [%s].  The
15b30 20 73 74 61 63 6b 20 73 69 7a 65 20 73 68 6f 75   stack size shou
15b40 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
15b50 20 63 6f 6e 73 74 61 6e 74 2e 22 2c 0a 20 20 20   constant.",.   
15b60 20 20 20 20 20 6c 65 6d 70 2d 3e 73 74 61 63 6b       lemp->stack
15b70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d  size);.      lem
15b80 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
15b90 20 20 20 20 20 6c 65 6d 70 2d 3e 73 74 61 63 6b       lemp->stack
15ba0 73 69 7a 65 20 3d 20 22 31 30 30 22 3b 0a 20 20  size = "100";.  
15bb0 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
15bc0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53  out,"#define YYS
15bd0 54 41 43 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c  TACKDEPTH %s\n",
15be0 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29  lemp->stacksize)
15bf0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
15c00 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
15c10 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
15c20 59 53 54 41 43 4b 44 45 50 54 48 20 31 30 30 5c  YSTACKDEPTH 100\
15c30 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n");  lineno++;.
15c40 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67    }.  if( mhflag
15c50 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
15c60 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41  out,"#if INTERFA
15c70 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  CE\n"); lineno++
15c80 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c  ;.  }.  name = l
15c90 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
15ca0 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
15cb0 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72  ;.  if( lemp->ar
15cc0 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30  g && lemp->arg[0
15cd0 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ] ){.    int i;.
15ce0 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 6c      i = strlen(l
15cf0 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77  emp->arg);.    w
15d00 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 69 73  hile( i>=1 && is
15d10 73 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b  space(lemp->arg[
15d20 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20  i-1]) ) i--;.   
15d30 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20   while( i>=1 && 
15d40 28 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61  (isalnum(lemp->a
15d50 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70  rg[i-1]) || lemp
15d60 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29  ->arg[i-1]=='_')
15d70 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69   ) i--;.    fpri
15d80 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
15d90 20 25 73 41 52 47 44 45 43 4c 20 2c 25 73 5c 6e   %sARGDECL ,%s\n
15da0 22 2c 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72  ",name,&lemp->ar
15db0 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  g[i]);  lineno++
15dc0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
15dd0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 58 41 52  t,"#define %sXAR
15de0 47 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d  GDECL %s;\n",nam
15df0 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c  e,lemp->arg);  l
15e00 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
15e10 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
15e20 65 20 25 73 41 4e 53 49 41 52 47 44 45 43 4c 20  e %sANSIARGDECL 
15e30 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70  ,%s\n",name,lemp
15e40 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ->arg);  lineno+
15e50 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
15e60 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
15e70 66 69 6e 65 20 25 73 41 52 47 44 45 43 4c 5c 6e  fine %sARGDECL\n
15e80 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f  ",name);  lineno
15e90 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
15ea0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 58  out,"#define %sX
15eb0 41 52 47 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  ARGDECL\n",name)
15ec0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
15ed0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
15ee0 65 66 69 6e 65 20 25 73 41 4e 53 49 41 52 47 44  efine %sANSIARGD
15ef0 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c  ECL\n",name);  l
15f00 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69  ineno++;.  }.  i
15f10 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
15f20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65   fprintf(out,"#e
15f30 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
15f40 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  ++;.  }.  fprint
15f50 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
15f60 59 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65  YNSTATE %d\n",le
15f70 6d 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69  mp->nstate);  li
15f80 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
15f90 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
15fa0 59 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d  YNRULE %d\n",lem
15fb0 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65  p->nrule);  line
15fc0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
15fd0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45  out,"#define YYE
15fe0 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22  RRORSYMBOL %d\n"
15ff0 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69  ,lemp->errsym->i
16000 6e 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  ndex);  lineno++
16010 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
16020 22 23 64 65 66 69 6e 65 20 59 59 45 52 52 53 59  "#define YYERRSY
16030 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70  MDT yy%d\n",lemp
16040 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29  ->errsym->dtnum)
16050 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74  ;  lineno++;.  t
16060 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
16070 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
16080 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
16090 61 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ate the action t
160a0 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
160b0 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
160c0 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 69  e action table i
160d0 73 20 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  s an element of 
160e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20  the following . 
160f0 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3a 0a 20   ** structure:. 
16100 20 2a 2a 20 20 20 73 74 72 75 63 74 20 79 79 41   **   struct yyA
16110 63 74 69 6f 6e 45 6e 74 72 79 20 7b 0a 20 20 2a  ctionEntry {.  *
16120 2a 20 20 20 20 20 20 20 59 59 43 4f 44 45 54 59  *       YYCODETY
16130 50 45 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f  PE            lo
16140 6f 6b 61 68 65 61 64 3b 0a 20 20 2a 2a 20 20 20  okahead;.  **   
16150 20 20 20 20 59 59 41 43 54 49 4f 4e 54 59 50 45      YYACTIONTYPE
16160 20 20 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e            action
16170 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 73 74 72  ;.  **       str
16180 75 63 74 20 79 79 41 63 74 69 6f 6e 45 6e 74 72  uct yyActionEntr
16190 79 20 2a 6e 65 78 74 3b 0a 20 20 2a 2a 20 20 20  y *next;.  **   
161a0 7d 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  }.  **.  ** The 
161b0 65 6e 74 72 69 65 73 20 61 72 65 20 67 72 6f 75  entries are grou
161c0 70 65 64 20 69 6e 74 6f 20 68 61 73 68 20 74 61  ped into hash ta
161d0 62 6c 65 73 2c 20 6f 6e 65 20 68 61 73 68 20 74  bles, one hash t
161e0 61 62 6c 65 20 66 6f 72 20 65 61 63 68 0a 20 20  able for each.  
161f0 2a 2a 20 70 61 72 73 65 72 20 73 74 61 74 65 2e  ** parser state.
16200 20 20 54 68 65 20 68 61 73 68 20 74 61 62 6c 65    The hash table
16210 20 68 61 73 20 61 20 73 69 7a 65 20 77 68 69 63   has a size whic
16220 68 20 69 73 20 74 68 65 20 73 6d 61 6c 6c 65 73  h is the smalles
16230 74 0a 20 20 2a 2a 20 70 6f 77 65 72 20 6f 66 20  t.  ** power of 
16240 74 77 6f 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  two needed to ho
16250 6c 64 20 61 6c 6c 20 65 6e 74 72 69 65 73 2e 0a  ld all entries..
16260 20 20 2a 2f 0a 20 20 74 61 62 6c 65 63 6e 74 20    */.  tablecnt 
16270 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  = 0;..  /* Loop 
16280 6f 76 65 72 20 70 61 72 73 65 72 20 73 74 61 74  over parser stat
16290 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  es */.  for(i=0;
162a0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
162b0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 74   i++){.    int t
162c0 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20 20  ablesize;       
162d0 20 20 20 20 20 20 20 2f 2a 20 73 69 7a 65 20 6f         /* size o
162e0 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  f the hash table
162f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 2c 6b 3b   */.    int j,k;
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
16320 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63  ter */.    int c
16330 6f 6c 6c 69 64 65 5b 32 30 34 38 5d 3b 20 20 20  ollide[2048];   
16340 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
16350 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f  llision chain fo
16360 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
16370 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e     struct action
16380 20 2a 74 61 62 6c 65 5b 32 30 34 38 5d 3b 20 2f   *table[2048]; /
16390 2a 20 42 75 69 6c 64 20 74 68 65 20 68 61 73 68  * Build the hash
163a0 20 74 61 62 6c 65 20 68 65 72 65 20 2a 2f 0a 0a   table here */..
163b0 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20      /* Find the 
163c0 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e  number of action
163d0 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  s and initialize
163e0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
163f0 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  */.    stp = lem
16400 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
16410 20 20 73 74 70 2d 3e 74 61 62 73 74 61 72 74 20    stp->tabstart 
16420 3d 20 74 61 62 6c 65 63 6e 74 3b 0a 20 20 20 20  = tablecnt;.    
16430 73 74 70 2d 3e 6e 61 63 74 69 6f 6e 20 3d 20 30  stp->naction = 0
16440 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
16450 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
16460 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
16470 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 21  ( ap->sp->index!
16480 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26  =lemp->nsymbol &
16490 26 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  & compute_action
164a0 28 6c 65 6d 70 2c 61 70 29 3e 3d 30 20 29 7b 0a  (lemp,ap)>=0 ){.
164b0 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 61 63          stp->nac
164c0 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  tion++;.      }.
164d0 20 20 20 20 7d 0a 20 20 20 20 74 61 62 6c 65 73      }.    tables
164e0 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 77 68 69  ize = 1;.    whi
164f0 6c 65 28 20 74 61 62 6c 65 73 69 7a 65 3c 73 74  le( tablesize<st
16500 70 2d 3e 6e 61 63 74 69 6f 6e 20 29 20 74 61 62  p->naction ) tab
16510 6c 65 73 69 7a 65 20 2b 3d 20 74 61 62 6c 65 73  lesize += tables
16520 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ize;.    assert(
16530 20 74 61 62 6c 65 73 69 7a 65 3c 3d 20 73 69 7a   tablesize<= siz
16540 65 6f 66 28 74 61 62 6c 65 29 2f 73 69 7a 65 6f  eof(table)/sizeo
16550 66 28 74 61 62 6c 65 5b 30 5d 29 20 29 3b 0a 20  f(table[0]) );. 
16560 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 74 61     for(j=0; j<ta
16570 62 6c 65 73 69 7a 65 3b 20 6a 2b 2b 29 7b 0a 20  blesize; j++){. 
16580 20 20 20 20 20 74 61 62 6c 65 5b 6a 5d 20 3d 20       table[j] = 
16590 30 3b 0a 20 20 20 20 20 20 63 6f 6c 6c 69 64 65  0;.      collide
165a0 5b 6a 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  [j] = -1;.    }.
165b0 0a 20 20 20 20 2f 2a 20 48 61 73 68 20 74 68 65  .    /* Hash the
165c0 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 74 68   actions into th
165d0 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  e hash table */.
165e0 20 20 20 20 73 74 70 2d 3e 74 61 62 64 66 6c 74      stp->tabdflt
165f0 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
16600 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
16610 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
16620 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
16630 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  >next){.      in
16640 74 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75  t action = compu
16650 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61  te_action(lemp,a
16660 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 68 3b  p);.      int h;
16670 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73  .      if( ap->s
16680 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e  p->index==lemp->
16690 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20  nsymbol ){.     
166a0 20 20 20 73 74 70 2d 3e 74 61 62 64 66 6c 74 61     stp->tabdflta
166b0 63 74 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20  ct = action;.   
166c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63 74     }else if( act
166d0 69 6f 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion>=0 ){.      
166e0 20 20 68 20 3d 20 61 70 2d 3e 73 70 2d 3e 69 6e    h = ap->sp->in
166f0 64 65 78 20 26 20 28 74 61 62 6c 65 73 69 7a 65  dex & (tablesize
16700 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 61 70 2d  -1);.        ap-
16710 3e 63 6f 6c 6c 69 64 65 20 3d 20 74 61 62 6c 65  >collide = table
16720 5b 68 5d 3b 0a 20 20 20 20 20 20 20 20 74 61 62  [h];.        tab
16730 6c 65 5b 68 5d 20 3d 20 61 70 3b 0a 20 20 20 20  le[h] = ap;.    
16740 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
16750 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6c 6c 69 73  * Resolve collis
16760 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ions */.    for(
16770 6a 3d 6b 3d 30 3b 20 6a 3c 74 61 62 6c 65 73 69  j=k=0; j<tablesi
16780 7a 65 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ze; j++){.      
16790 69 66 28 20 74 61 62 6c 65 5b 6a 5d 20 26 26 20  if( table[j] && 
167a0 74 61 62 6c 65 5b 6a 5d 2d 3e 63 6f 6c 6c 69 64  table[j]->collid
167b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
167c0 6c 65 28 20 74 61 62 6c 65 5b 6b 5d 20 29 20 6b  le( table[k] ) k
167d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 74 61 62 6c  ++;.        tabl
167e0 65 5b 6b 5d 20 3d 20 74 61 62 6c 65 5b 6a 5d 2d  e[k] = table[j]-
167f0 3e 63 6f 6c 6c 69 64 65 3b 0a 20 20 20 20 20 20  >collide;.      
16800 20 20 63 6f 6c 6c 69 64 65 5b 6a 5d 20 3d 20 6b    collide[j] = k
16810 3b 0a 20 20 20 20 20 20 20 20 74 61 62 6c 65 5b  ;.        table[
16820 6a 5d 2d 3e 63 6f 6c 6c 69 64 65 20 3d 20 30 3b  j]->collide = 0;
16830 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3c 6a  .        if( k<j
16840 20 29 20 6a 20 3d 20 6b 2d 31 3b 0a 20 20 20 20   ) j = k-1;.    
16850 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
16860 2a 20 50 72 69 6e 74 20 74 68 65 20 68 61 73 68  * Print the hash
16870 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 70   table */.    fp
16880 72 69 6e 74 66 28 6f 75 74 2c 22 2f 2a 20 53 74  rintf(out,"/* St
16890 61 74 65 20 25 64 20 2a 2f 5c 6e 22 2c 73 74 70  ate %d */\n",stp
168a0 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f  ->index); lineno
168b0 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ++;.    for(j=0;
168c0 20 6a 3c 74 61 62 6c 65 73 69 7a 65 3b 20 6a 2b   j<tablesize; j+
168d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 61  +){.      if( ta
168e0 62 6c 65 5b 6a 5d 3d 3d 30 20 29 7b 0a 20 20 20  ble[j]==0 ){.   
168f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
16900 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 7b  ,.          "  {
16910 59 59 4e 4f 43 4f 44 45 2c 30 2c 30 7d 2c 20 2f  YYNOCODE,0,0}, /
16920 2a 20 55 6e 75 73 65 64 20 2a 2f 5c 6e 22 29 3b  * Unused */\n");
16930 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16940 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
16950 74 2c 22 20 20 7b 25 34 64 2c 25 34 64 2c 20 22  t,"  {%4d,%4d, "
16960 2c 0a 20 20 20 20 20 20 20 20 20 20 74 61 62 6c  ,.          tabl
16970 65 5b 6a 5d 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c  e[j]->sp->index,
16980 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6d 70 75  .          compu
16990 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 74  te_action(lemp,t
169a0 61 62 6c 65 5b 6a 5d 29 29 3b 0a 20 20 20 20 20  able[j]));.     
169b0 20 20 20 69 66 28 20 63 6f 6c 6c 69 64 65 5b 6a     if( collide[j
169c0 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]>=0 ){.        
169d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 26    fprintf(out,"&
169e0 79 79 41 63 74 69 6f 6e 54 61 62 6c 65 5b 25 34  yyActionTable[%4
169f0 64 5d 20 7d 2c 20 2f 2a 20 22 2c 0a 20 20 20 20  d] }, /* ",.    
16a00 20 20 20 20 20 20 20 20 63 6f 6c 6c 69 64 65 5b          collide[
16a10 6a 5d 20 2b 20 74 61 62 6c 65 63 6e 74 29 3b 0a  j] + tablecnt);.
16a20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16a30 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
16a40 28 6f 75 74 2c 22 30 20 20 20 20 20 20 20 20 20  (out,"0         
16a50 20 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2f 2a             }, /*
16a60 20 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   ");.        }. 
16a70 20 20 20 20 20 20 20 50 72 69 6e 74 41 63 74 69         PrintActi
16a80 6f 6e 28 74 61 62 6c 65 5b 6a 5d 2c 6f 75 74 2c  on(table[j],out,
16a90 32 32 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  22);.        fpr
16aa0 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f 5c 6e 22  intf(out," */\n"
16ab0 29 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ); .      }.    
16ac0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
16ad0 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  }..    /* Update
16ae0 20 74 68 65 20 74 61 62 6c 65 20 63 6f 75 6e 74   the table count
16af0 20 2a 2f 0a 20 20 20 20 74 61 62 6c 65 63 6e 74   */.    tablecnt
16b00 20 2b 3d 20 74 61 62 6c 65 73 69 7a 65 3b 0a 20   += tablesize;. 
16b10 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
16b20 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
16b30 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 6c 65 6d  ,&lineno);.  lem
16b40 70 2d 3e 74 61 62 6c 65 73 69 7a 65 20 3d 20 74  p->tablesize = t
16b50 61 62 6c 65 63 6e 74 3b 0a 0a 20 20 2f 2a 20 47  ablecnt;..  /* G
16b60 65 6e 65 72 61 74 65 20 74 68 65 20 73 74 61 74  enerate the stat
16b70 65 20 74 61 62 6c 65 0a 20 20 2a 2a 0a 20 20 2a  e table.  **.  *
16b80 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 73 20  * Each entry is 
16b90 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  an element of th
16ba0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
16bb0 63 74 75 72 65 3a 0a 20 20 2a 2a 20 20 20 20 73  cture:.  **    s
16bc0 74 72 75 63 74 20 79 79 53 74 61 74 65 45 6e 74  truct yyStateEnt
16bd0 72 79 20 7b 0a 20 20 2a 2a 20 20 20 20 20 20 73  ry {.  **      s
16be0 74 72 75 63 74 20 79 79 41 63 74 69 6f 6e 45 6e  truct yyActionEn
16bf0 74 72 79 20 2a 68 61 73 68 74 62 6c 3b 0a 20 20  try *hashtbl;.  
16c00 2a 2a 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b  **      int mask
16c10 3b 0a 20 20 2a 2a 20 20 20 20 20 20 59 59 41 43  ;.  **      YYAC
16c20 54 49 4f 4e 54 59 50 45 20 61 63 74 69 6f 6e 44  TIONTYPE actionD
16c30 65 66 61 75 6c 74 3b 0a 20 20 2a 2a 20 20 20 20  efault;.  **    
16c40 7d 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  }.  */.  for(i=0
16c50 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
16c60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
16c70 74 61 62 6c 65 73 69 7a 65 3b 0a 20 20 20 20 73  tablesize;.    s
16c80 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
16c90 64 5b 69 5d 3b 0a 20 20 20 20 74 61 62 6c 65 73  d[i];.    tables
16ca0 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 77 68 69  ize = 1;.    whi
16cb0 6c 65 28 20 74 61 62 6c 65 73 69 7a 65 3c 73 74  le( tablesize<st
16cc0 70 2d 3e 6e 61 63 74 69 6f 6e 20 29 20 74 61 62  p->naction ) tab
16cd0 6c 65 73 69 7a 65 20 2b 3d 20 74 61 62 6c 65 73  lesize += tables
16ce0 69 7a 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  ize;.    fprintf
16cf0 28 6f 75 74 2c 22 20 20 7b 20 26 79 79 41 63 74  (out,"  { &yyAct
16d00 69 6f 6e 54 61 62 6c 65 5b 25 64 5d 2c 20 25 64  ionTable[%d], %d
16d10 2c 20 25 64 7d 2c 5c 6e 22 2c 0a 20 20 20 20 20  , %d},\n",.     
16d20 20 73 74 70 2d 3e 74 61 62 73 74 61 72 74 2c 0a   stp->tabstart,.
16d30 20 20 20 20 20 20 74 61 62 6c 65 73 69 7a 65 20        tablesize 
16d40 2d 20 31 2c 0a 20 20 20 20 20 20 73 74 70 2d 3e  - 1,.      stp->
16d50 74 61 62 64 66 6c 74 61 63 74 29 3b 20 6c 69 6e  tabdfltact); lin
16d60 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
16d70 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
16d80 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
16d90 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
16da0 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  e a table contai
16db0 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 69  ning the symboli
16dc0 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72 79 20  c name of every 
16dd0 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 66 6f 72 28  symbol */.  for(
16de0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
16df0 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
16e00 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22  sprintf(line,"\"
16e10 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d  %s\",",lemp->sym
16e20 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a  bols[i]->name);.
16e30 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
16e40 22 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b  "  %-15s",line);
16e50 0a 20 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d  .    if( (i&3)==
16e60 33 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74  3 ){ fprintf(out
16e70 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,"\n"); lineno++
16e80 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69  ; }.  }.  if( (i
16e90 26 33 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74  &3)!=0 ){ fprint
16ea0 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e  f(out,"\n"); lin
16eb0 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f  eno++; }.  tplt_
16ec0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
16ed0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
16ee0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
16ef0 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
16f00 74 65 73 20 65 76 65 72 79 20 74 69 6d 65 20 61  tes every time a
16f10 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65   symbol is poppe
16f20 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
16f30 73 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f 63  stack while proc
16f40 65 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f 72  essing errors or
16f50 20 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69 6e   while destroyin
16f60 67 20 74 68 65 20 70 61 72 73 65 72 2e 20 0a 20  g the parser. . 
16f70 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f   ** (In other wo
16f80 72 64 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68  rds, generate th
16f90 65 20 25 64 65 73 74 72 75 63 74 6f 72 20 61 63  e %destructor ac
16fa0 74 69 6f 6e 73 29 20 2a 2f 0a 20 20 69 66 28 20  tions) */.  if( 
16fb0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20  lemp->tokendest 
16fc0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
16fd0 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
16fe0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
16ff0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
17000 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
17010 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d  ];.      if( sp=
17020 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d  =0 || sp->type!=
17030 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69  TERMINAL ) conti
17040 6e 75 65 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  nue;.      fprin
17050 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
17060 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65   %d:\n",sp->inde
17070 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
17080 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
17090 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
170a0 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c   && lemp->symbol
170b0 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52 4d  s[i]->type!=TERM
170c0 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20 20  INAL; i++);.    
170d0 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  if( i<lemp->nsym
170e0 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d 69  bol ){.      emi
170f0 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
17100 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62  e(out,lemp->symb
17110 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e  ols[i],lemp,&lin
17120 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72 69  eno);.      fpri
17130 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
17140 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
17150 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  o++;.    }.  }. 
17160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
17170 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
17180 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
17190 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
171a0 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69  ymbols[i];.    i
171b0 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e  f( sp==0 || sp->
171c0 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c  type==TERMINAL |
171d0 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  | sp->destructor
171e0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
171f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17200 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22  "    case %d:\n"
17210 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e  ,sp->index); lin
17220 65 6e 6f 2b 2b 3b 0a 20 20 20 20 65 6d 69 74 5f  eno++;.    emit_
17230 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
17240 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  out,lemp->symbol
17250 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  s[i],lemp,&linen
17260 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  o);.    fprintf(
17270 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
17280 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
17290 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
172a0 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20  >vardest ){.    
172b0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
172c0 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20  flt_sp = 0;.    
172d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
172e0 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
172f0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
17300 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
17310 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
17320 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73    if( sp==0 || s
17330 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
17340 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73  L ||.          s
17350 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73  p->index<=0 || s
17360 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30  p->destructor!=0
17370 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
17380 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17390 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c      case %d:\n",
173a0 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65  sp->index); line
173b0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74  no++;.      dflt
173c0 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a  _sp = sp;.    }.
173d0 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21      if( dflt_sp!
173e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74  =0 ){.      emit
173f0 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65  _destructor_code
17400 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d  (out,dflt_sp,lem
17410 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
17420 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
17430 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
17440 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
17450 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
17460 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
17470 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
17480 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
17490 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
174a0 77 68 65 6e 65 76 65 72 20 74 68 65 20 70 61 72  whenever the par
174b0 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c  ser stack overfl
174c0 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  ows */.  tplt_pr
174d0 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
174e0 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 6c 65 6d 70  p->overflow,lemp
174f0 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 2c 26 6c 69  ->overflowln,&li
17500 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
17510 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
17520 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
17530 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
17540 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c 65 20  e table of rule 
17550 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a  information .  *
17560 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69  *.  ** Note: Thi
17570 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
17580 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
17590 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72  rules are number
175a0 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c  .  ** sequentual
175b0 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ly beginning wit
175c0 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  h 0..  */.  for(
175d0 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
175e0 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
175f0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
17600 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c  ,"  { %d, %d },\
17610 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65  n",rp->lhs->inde
17620 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e  x,rp->nrhs); lin
17630 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
17640 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
17650 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
17660 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
17670 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
17680 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61  cution during ea
17690 63 68 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e  ch REDUCE action
176a0 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
176b0 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
176c0 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66  rp->next){.    f
176d0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
176e0 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 72 70    case %d:\n",rp
176f0 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f  ->index); lineno
17700 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
17710 6f 75 74 2c 22 20 20 20 20 20 20 20 20 59 59 54  out,"        YYT
17720 52 41 43 45 28 5c 22 25 73 20 3a 3a 3d 22 2c 72  RACE(\"%s ::=",r
17730 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
17740 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
17750 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 66 70 72  ->nrhs; i++) fpr
17760 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 72  intf(out," %s",r
17770 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29  p->rhs[i]->name)
17780 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
17790 74 2c 22 5c 22 29 5c 6e 22 29 3b 20 6c 69 6e 65  t,"\")\n"); line
177a0 6e 6f 2b 2b 3b 0a 20 20 20 20 65 6d 69 74 5f 63  no++;.    emit_c
177b0 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c  ode(out,rp,lemp,
177c0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70  &lineno);.    fp
177d0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
177e0 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
177f0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
17800 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
17810 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
17820 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
17830 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
17840 78 65 63 75 74 65 73 20 69 66 20 61 20 70 61 72  xecutes if a par
17850 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70  se fails */.  tp
17860 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
17870 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c  p,lemp->failure,
17880 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 6c 6e 2c  lemp->failureln,
17890 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
178a0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
178b0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
178c0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
178d0 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
178e0 75 74 65 73 20 77 68 65 6e 20 61 20 73 79 6e 74  utes when a synt
178f0 61 78 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ax error occurs 
17900 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
17910 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65  out,lemp,lemp->e
17920 72 72 6f 72 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72  rror,lemp->error
17930 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  ln,&lineno);.  t
17940 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
17950 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
17960 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
17970 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
17980 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65  xecutes when the
17990 20 70 61 72 73 65 72 20 61 63 63 65 70 74 73 20   parser accepts 
179a0 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74  its input */.  t
179b0 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
179c0 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c  mp,lemp->accept,
179d0 6c 65 6d 70 2d 3e 61 63 63 65 70 74 6c 6e 2c 26  lemp->acceptln,&
179e0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
179f0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
17a00 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
17a10 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e  ..  /* Append an
17a20 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64 65 20  y addition code 
17a30 74 68 65 20 75 73 65 72 20 64 65 73 69 72 65 73  the user desires
17a40 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
17a50 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
17a60 65 78 74 72 61 63 6f 64 65 2c 6c 65 6d 70 2d 3e  extracode,lemp->
17a70 65 78 74 72 61 63 6f 64 65 6c 6e 2c 26 6c 69 6e  extracodeln,&lin
17a80 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28  eno);..  fclose(
17a90 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75  in);.  fclose(ou
17aa0 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
17ab0 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  ./* Generate a h
17ac0 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74  eader file for t
17ad0 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69  he parser */.voi
17ae0 64 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 6c  d ReportHeader(l
17af0 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
17b00 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c  n *lemp;.{.  FIL
17b10 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63  E *out, *in;.  c
17b20 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63  har *prefix;.  c
17b30 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
17b40 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65  E];.  char patte
17b50 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  rn[LINESIZE];.  
17b60 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65  int i;..  if( le
17b70 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20  mp->tokenprefix 
17b80 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d  ) prefix = lemp-
17b90 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
17ba0 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
17bb0 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
17bc0 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65   "";.  in = file
17bd0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c  _open(lemp,".h",
17be0 22 72 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29  "r");.  if( in )
17bf0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  {.    for(i=1; i
17c00 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
17c10 20 26 26 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c   && fgets(line,L
17c20 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b  INESIZE,in); i++
17c30 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
17c40 28 70 61 74 74 65 72 6e 2c 22 23 64 65 66 69 6e  (pattern,"#defin
17c50 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22  e %s%-30s %2d\n"
17c60 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79  ,prefix,lemp->sy
17c70 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
17c80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
17c90 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e  cmp(line,pattern
17ca0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
17cb0 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
17cc0 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70  .    if( i==lemp
17cd0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20  ->nterminal ){. 
17ce0 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67       /* No chang
17cf0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  e in the file.  
17d00 44 6f 6e 27 74 20 72 65 77 72 69 74 65 20 69 74  Don't rewrite it
17d10 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
17d20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f  n;.    }.  }.  o
17d30 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  ut = file_open(l
17d40 65 6d 70 2c 22 2e 68 22 2c 22 77 22 29 3b 0a 20  emp,".h","w");. 
17d50 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
17d60 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
17d70 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
17d80 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
17d90 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
17da0 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
17db0 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
17dc0 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
17dd0 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f    }.    fclose(o
17de0 75 74 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74  ut);  .  }.  ret
17df0 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63  urn;.}../* Reduc
17e00 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
17e10 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c  e action tables,
17e20 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79   if possible, by
17e30 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f   making use.** o
17e40 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a  f defaults..**.*
17e50 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
17e60 6e 2c 20 69 66 20 61 6c 6c 20 52 45 44 55 43 45  n, if all REDUCE
17e70 20 61 63 74 69 6f 6e 73 20 75 73 65 20 74 68 65   actions use the
17e80 20 73 61 6d 65 20 72 75 6c 65 2c 20 6d 61 6b 65   same rule, make
17e90 0a 2a 2a 20 74 68 65 6d 20 74 68 65 20 64 65 66  .** them the def
17ea0 61 75 6c 74 2e 20 20 4f 6e 6c 79 20 64 65 66 61  ault.  Only defa
17eb0 75 6c 74 20 74 68 65 6d 20 69 66 20 74 68 65 72  ult them if ther
17ec0 65 20 61 72 65 20 6d 6f 72 65 20 74 68 61 6e 20  e are more than 
17ed0 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d  one..*/.void Com
17ee0 70 72 65 73 73 54 61 62 6c 65 73 28 6c 65 6d 70  pressTables(lemp
17ef0 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
17f00 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  lemp;.{.  struct
17f10 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
17f20 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
17f30 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
17f40 2a 72 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *rp;.  int i;.  
17f50 69 6e 74 20 63 6e 74 3b 0a 0a 20 20 66 6f 72 28  int cnt;..  for(
17f60 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
17f70 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
17f80 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
17f90 64 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  d[i];..    /* Fi
17fa0 6e 64 20 74 68 65 20 66 69 72 73 74 20 52 45 44  nd the first RED
17fb0 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  UCE action */.  
17fc0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
17fd0 3b 20 61 70 20 26 26 20 61 70 2d 3e 74 79 70 65  ; ap && ap->type
17fe0 21 3d 52 45 44 55 43 45 3b 20 61 70 3d 61 70 2d  !=REDUCE; ap=ap-
17ff0 3e 6e 65 78 74 29 3b 0a 20 20 20 20 69 66 28 20  >next);.    if( 
18000 61 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ap==0 ) continue
18010 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62  ;..    /* Rememb
18020 65 72 20 74 68 65 20 72 75 6c 65 20 75 73 65 64  er the rule used
18030 20 2a 2f 0a 20 20 20 20 72 70 20 3d 20 61 70 2d   */.    rp = ap-
18040 3e 78 2e 72 70 3b 0a 0a 20 20 20 20 2f 2a 20 53  >x.rp;..    /* S
18050 65 65 20 69 66 20 61 6c 6c 20 6f 74 68 65 72 20  ee if all other 
18060 52 45 44 55 43 45 20 61 63 69 74 6f 6e 73 20 75  REDUCE acitons u
18070 73 65 20 74 68 65 20 73 61 6d 65 20 72 75 6c 65  se the same rule
18080 20 2a 2f 0a 20 20 20 20 63 6e 74 20 3d 20 31 3b   */.    cnt = 1;
18090 0a 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e  .    for(ap=ap->
180a0 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d  next; ap; ap=ap-
180b0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
180c0 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55  ( ap->type==REDU
180d0 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  CE ){.        if
180e0 28 20 61 70 2d 3e 78 2e 72 70 21 3d 72 70 20 29  ( ap->x.rp!=rp )
180f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
18100 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
18110 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 70 20     }.    if( ap 
18120 7c 7c 20 63 6e 74 3d 3d 31 20 29 20 63 6f 6e 74  || cnt==1 ) cont
18130 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  inue;..    /* Co
18140 6d 62 69 6e 65 20 61 6c 6c 20 52 45 44 55 43 45  mbine all REDUCE
18150 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20   actions into a 
18160 73 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20 2a  single default *
18170 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  /.    for(ap=stp
18180 2d 3e 61 70 3b 20 61 70 20 26 26 20 61 70 2d 3e  ->ap; ap && ap->
18190 74 79 70 65 21 3d 52 45 44 55 43 45 3b 20 61 70  type!=REDUCE; ap
181a0 3d 61 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  =ap->next);.    
181b0 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20  assert( ap );.  
181c0 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f    ap->sp = Symbo
181d0 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d  l_new("{default}
181e0 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61  ");.    for(ap=a
181f0 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d  p->next; ap; ap=
18200 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
18210 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52   if( ap->type==R
18220 45 44 55 43 45 20 29 20 61 70 2d 3e 74 79 70 65  EDUCE ) ap->type
18230 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20   = NOT_USED;.   
18240 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d   }.    stp->ap =
18250 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70   Action_sort(stp
18260 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a  ->ap);.  }.}./**
18270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
18280 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
18290 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  et.c" **********
182a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
182b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
182c0 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61 74 69  * Set manipulati
182d0 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20  on routines for 
182e0 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
182f0 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
18300 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a 65 20  static int size 
18310 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65  = 0;../* Set the
18320 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76 6f 69   set size */.voi
18330 64 20 53 65 74 53 69 7a 65 28 6e 29 0a 69 6e 74  d SetSize(n).int
18340 20 6e 3b 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e   n;.{.  size = n
18350 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  +1;.}../* Alloca
18360 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a  te a new set */.
18370 63 68 61 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a  char *SetNew(){.
18380 20 20 63 68 61 72 20 2a 73 3b 0a 20 20 69 6e 74    char *s;.  int
18390 20 69 3b 0a 20 20 73 20 3d 20 28 63 68 61 72 2a   i;.  s = (char*
183a0 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 20 29 3b  )malloc( size );
183b0 0a 20 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20  .  if( s==0 ){. 
183c0 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d     extern void m
183d0 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20  emory_error();. 
183e0 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28     memory_error(
183f0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
18400 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 73  ; i<size; i++) s
18410 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [i] = 0;.  retur
18420 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c  n s;.}../* Deall
18430 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 76  ocate a set */.v
18440 6f 69 64 20 53 65 74 46 72 65 65 28 73 29 0a 63  oid SetFree(s).c
18450 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 66 72 65 65  har *s;.{.  free
18460 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  (s);.}../* Add a
18470 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
18480 74 68 65 20 73 65 74 2e 20 20 52 65 74 75 72 6e  the set.  Return
18490 20 54 52 55 45 20 69 66 20 74 68 65 20 65 6c 65   TRUE if the ele
184a0 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64 0a 2a  ment was added.*
184b0 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 69  * and FALSE if i
184c0 74 20 77 61 73 20 61 6c 72 65 61 64 79 20 74 68  t was already th
184d0 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41  ere. */.int SetA
184e0 64 64 28 73 2c 65 29 0a 63 68 61 72 20 2a 73 3b  dd(s,e).char *s;
184f0 0a 69 6e 74 20 65 3b 0a 7b 0a 20 20 69 6e 74 20  .int e;.{.  int 
18500 72 76 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b  rv;.  rv = s[e];
18510 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72  .  s[e] = 1;.  r
18520 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a  eturn !rv;.}../*
18530 20 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d 65   Add every eleme
18540 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e 20  nt of s2 to s1. 
18550 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
18560 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69  s1 changes. */.i
18570 6e 74 20 53 65 74 55 6e 69 6f 6e 28 73 31 2c 73  nt SetUnion(s1,s
18580 32 29 0a 63 68 61 72 20 2a 73 31 3b 0a 63 68 61  2).char *s1;.cha
18590 72 20 2a 73 32 3b 0a 7b 0a 20 20 69 6e 74 20 69  r *s2;.{.  int i
185a0 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 70 72  , progress;.  pr
185b0 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f  ogress = 0;.  fo
185c0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
185d0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 32 5b  ++){.    if( s2[
185e0 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
185f0 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69 5d 3d  ;.    if( s1[i]=
18600 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 67  =0 ){.      prog
18610 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ress = 1;.      
18620 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d  s1[i] = 1;.    }
18630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72  .  }.  return pr
18640 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  ogress;.}./*****
18650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18660 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
18670 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a  "table.c" ******
18680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18690 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c  ******/./*.** Al
186a0 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  l code in this f
186b0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75 74  ile has been aut
186c0 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72  omatically gener
186d0 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73  ated.** from a s
186e0 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20  pecification in 
186f0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  the file.**     
18700 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e           "table.
18710 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73  q".** by the ass
18720 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 63  ociative array c
18730 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f  ode building pro
18740 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a  gram "aagen"..**
18750 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69   Do not edit thi
18760 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64  s file!  Instead
18770 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63 69  , edit the speci
18780 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65  fication.** file
18790 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67  , then rerun aag
187a0 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64  en..*/./*.** Cod
187b0 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  e for processing
187c0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c   tables in the L
187d0 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
187e0 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41  rator..*/..PRIVA
187f0 54 45 20 69 6e 74 20 73 74 72 68 61 73 68 28 78  TE int strhash(x
18800 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 69  ).char *x;.{.  i
18810 6e 74 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nt h = 0;.  whil
18820 65 28 20 2a 78 29 20 68 20 3d 20 68 2a 31 33 20  e( *x) h = h*13 
18830 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75  + *(x++);.  retu
18840 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b  rn h;.}../* Work
18850 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20 73  s like strdup, s
18860 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61 20  ort of.  Save a 
18870 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63  string in malloc
18880 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a  ed memory, but.*
18890 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20 69  * keep strings i
188a0 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68 61  n a table so tha
188b0 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e  t the same strin
188c0 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65  g is not in more
188d0 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61  .** than one pla
188e0 63 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 53 74 72  ce..*/.char *Str
188f0 73 61 66 65 28 79 29 0a 63 68 61 72 20 2a 79 3b  safe(y).char *y;
18900 0a 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  .{.  char *z;.. 
18910 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e   z = Strsafe_fin
18920 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  d(y);.  if( z==0
18930 20 26 26 20 28 7a 3d 6d 61 6c 6c 6f 63 28 20 73   && (z=malloc( s
18940 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d 30  trlen(y)+1 ))!=0
18950 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28 7a   ){.    strcpy(z
18960 2c 79 29 3b 0a 20 20 20 20 53 74 72 73 61 66 65  ,y);.    Strsafe
18970 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a  _insert(z);.  }.
18980 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29    MemoryCheck(z)
18990 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
189a0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
189b0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
189c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
189d0 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  ture for each.**
189e0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
189f0 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e  ay of type "x1".
18a00 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 31 20  .*/.struct s_x1 
18a10 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  {.  int size;   
18a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18a30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
18a40 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f  ilable slots. */
18a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
18a70 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  Must be a power 
18a80 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61  of 2 greater tha
18a90 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  n or */.        
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ab0 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20    /*   equal to 
18ac0 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74  1 */.  int count
18ad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
18ae0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  * Number of curr
18af0 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c  ently slots fill
18b00 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ed */.  struct s
18b10 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f  _x1node *tbl;  /
18b20 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65  * The data store
18b30 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75  d here */.  stru
18b40 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74  ct s_x1node **ht
18b50 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65  ;  /* Hash table
18b60 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a   for lookups */.
18b70 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  };../* There is 
18b80 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
18b90 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
18ba0 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c  or every data el
18bb0 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61  ement.** in an a
18bc0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
18bd0 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a   of type "x1"..*
18be0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
18bf0 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63 68   s_x1node {.  ch
18c00 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ar *data;       
18c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18c20 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
18c30 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78  ct s_x1node *nex
18c40 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
18c50 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
18c60 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
18c70 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x1node **fro
18c80 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
18c90 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65  link */.} x1node
18ca0 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
18cb0 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
18cc0 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
18cd0 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
18ce0 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
18cf0 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78 31 61  struct s_x1 *x1a
18d00 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
18d10 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
18d20 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53   array */.void S
18d30 74 72 73 61 66 65 5f 69 6e 69 74 28 29 7b 0a 20  trsafe_init(){. 
18d40 20 69 66 28 20 78 31 61 20 29 20 72 65 74 75 72   if( x1a ) retur
18d50 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73 74 72 75  n;.  x1a = (stru
18d60 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28  ct s_x1*)malloc(
18d70 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
18d80 5f 78 31 29 20 29 3b 0a 20 20 69 66 28 20 78 31  _x1) );.  if( x1
18d90 61 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69  a ){.    x1a->si
18da0 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 78  ze = 1024;.    x
18db0 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  1a->count = 0;. 
18dc0 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78     x1a->tbl = (x
18dd0 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a  1node*)malloc( .
18de0 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 31        (sizeof(x1
18df0 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
18e00 31 6e 6f 64 65 2a 29 29 2a 31 30 32 34 20 29 3b  1node*))*1024 );
18e10 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e 74 62  .    if( x1a->tb
18e20 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
18e30 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20 20 78  ee(x1a);.      x
18e40 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  1a = 0;.    }els
18e50 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
18e60 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20 3d 20        x1a->ht = 
18e70 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d  (x1node**)&(x1a-
18e80 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20  >tbl[1024]);.   
18e90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30     for(i=0; i<10
18ea0 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74  24; i++) x1a->ht
18eb0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
18ec0 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
18ed0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
18ee0 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
18ef0 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
18f00 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
18f10 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
18f20 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
18f30 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
18f40 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74  t Strsafe_insert
18f50 28 64 61 74 61 29 0a 63 68 61 72 20 2a 64 61 74  (data).char *dat
18f60 61 3b 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e  a;.{.  x1node *n
18f70 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  p;.  int h;.  in
18f80 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31 61  t ph;..  if( x1a
18f90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
18fa0 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 64    ph = strhash(d
18fb0 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26  ata);.  h = ph &
18fc0 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
18fd0 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68    np = x1a->ht[h
18fe0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
18ff0 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
19000 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d  (np->data,data)=
19010 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
19020 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
19030 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
19040 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
19050 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
19060 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
19070 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
19080 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
19090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
190a0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
190b0 20 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e   if( x1a->count>
190c0 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x1a->size ){.  
190d0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
190e0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
190f0 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
19100 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73  nt i,size;.    s
19110 74 72 75 63 74 20 73 5f 78 31 20 61 72 72 61 79  truct s_x1 array
19120 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
19130 20 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d 3e 73   = size = x1a->s
19140 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
19150 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f  .count = x1a->co
19160 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
19170 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61  bl = (x1node*)ma
19180 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a  lloc(.      (siz
19190 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69  eof(x1node) + si
191a0 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 73  zeof(x1node*))*s
191b0 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61  ize );.    if( a
191c0 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
191d0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
191e0 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
191f0 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
19200 72 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65  ray.ht = (x1node
19210 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73  **)&(array.tbl[s
19220 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
19230 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
19240 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
19250 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19260 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x1a->count; i++
19270 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64 65 20  ){.      x1node 
19280 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
19290 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
192a0 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x1a->tbl[i]);.  
192b0 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28      h = strhash(
192c0 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28  oldnp->data) & (
192d0 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  size-1);.      n
192e0 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
192f0 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
19300 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
19310 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
19320 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
19330 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
19340 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
19350 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
19360 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e  ->data = oldnp->
19370 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e  data;.      newn
19380 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61  p->from = &(arra
19390 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20  y.ht[h]);.      
193a0 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65  array.ht[h] = ne
193b0 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  wnp;.    }.    f
193c0 72 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20  ree(x1a->tbl);. 
193d0 20 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79 3b     *x1a = array;
193e0 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74  .  }.  /* Insert
193f0 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f   the new data */
19400 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61  .  h = ph & (x1a
19410 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
19420 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61  = &(x1a->tbl[x1a
19430 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e  ->count++]);.  n
19440 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
19450 20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d    if( x1a->ht[h]
19460 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x1a->ht[h]->f
19470 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
19480 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
19490 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31  x1a->ht[h];.  x1
194a0 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
194b0 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31   np->from = &(x1
194c0 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
194d0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
194e0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
194f0 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
19500 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
19510 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
19520 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
19530 20 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73 61 66   */.char *Strsaf
19540 65 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68 61 72  e_find(key).char
19550 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68   *key;.{.  int h
19560 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a  ;.  x1node *np;.
19570 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20  .  if( x1a==0 ) 
19580 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20  return 0;.  h = 
19590 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20 28  strhash(key) & (
195a0 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x1a->size-1);.  
195b0 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  np = x1a->ht[h];
195c0 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
195d0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e      if( strcmp(n
195e0 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20  p->data,key)==0 
195f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20  ) break;.    np 
19600 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
19610 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70    return np ? np
19620 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->data : 0;.}../
19630 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
19640 65 72 20 74 6f 20 74 68 65 20 28 74 65 72 6d 69  er to the (termi
19650 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e  nal or nontermin
19660 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22 2e 0a  al) symbol "x"..
19670 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
19680 73 79 6d 62 6f 6c 20 69 66 20 74 68 69 73 20 69  symbol if this i
19690 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
196a0 20 22 78 22 20 68 61 73 20 62 65 65 6e 20 73 65   "x" has been se
196b0 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 79  en..*/.struct sy
196c0 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77  mbol *Symbol_new
196d0 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20  (x).char *x;.{. 
196e0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
196f0 73 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62  sp;..  sp = Symb
19700 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69 66  ol_find(x);.  if
19710 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ( sp==0 ){.    s
19720 70 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  p = (struct symb
19730 6f 6c 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  ol *)malloc( siz
19740 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
19750 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79  l) );.    Memory
19760 43 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73  Check(sp);.    s
19770 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66  p->name = Strsaf
19780 65 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79  e(x);.    sp->ty
19790 70 65 20 3d 20 69 73 75 70 70 65 72 28 2a 78 29  pe = isupper(*x)
197a0 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f   ? TERMINAL : NO
197b0 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73  NTERMINAL;.    s
197c0 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  p->rule = 0;.   
197d0 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a   sp->prec = -1;.
197e0 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20      sp->assoc = 
197f0 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72  UNK;.    sp->fir
19800 73 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73  stset = 0;.    s
19810 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 46 41 4c 53  p->lambda = FALS
19820 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 72  E;.    sp->destr
19830 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73  uctor = 0;.    s
19840 70 2d 3e 64 61 74 61 74 79 70 65 20 3d 20 30 3b  p->datatype = 0;
19850 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .    Symbol_inse
19860 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b  rt(sp,sp->name);
19870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 70  .  }.  return sp
19880 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
19890 74 77 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 69  two symbols */.i
198a0 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 61 2c  nt Symbolcmpp(a,
198b0 62 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  b).struct symbol
198c0 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73 79 6d   **a;.struct sym
198d0 62 6f 6c 20 2a 2a 62 3b 0a 7b 0a 20 20 72 65 74  bol **b;.{.  ret
198e0 75 72 6e 20 73 74 72 63 6d 70 28 28 2a 2a 61 29  urn strcmp((**a)
198f0 2e 6e 61 6d 65 2c 28 2a 2a 62 29 2e 6e 61 6d 65  .name,(**b).name
19900 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  );.}../* There i
19910 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
19920 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
19930 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
19940 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
19950 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
19960 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x2"..*/.struct 
19970 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x2 {.  int siz
19980 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
19990 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
199a0 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
199b0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
199c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199d0 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
199e0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
199f0 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
19a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a10 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
19a20 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
19a30 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
19a40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19a50 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
19a60 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
19a70 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62  uct s_x2node *tb
19a80 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
19a90 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
19aa0 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
19ab0 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
19ac0 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
19ad0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
19ae0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
19af0 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
19b00 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
19b10 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
19b20 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
19b30 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
19b40 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  2"..*/.typedef s
19b50 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b  truct s_x2node {
19b60 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
19b70 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
19b80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19b90 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
19ba0 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  key;            
19bb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
19bc0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  y */.  struct s_
19bd0 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x2node *next;   
19be0 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
19bf0 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
19c00 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
19c10 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  2node **from;  /
19c20 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
19c30 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x2node;../*
19c40 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
19c50 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
19c60 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
19c70 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
19c80 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
19c90 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a  t s_x2 *x2a;../*
19ca0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
19cb0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
19cc0 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c  y */.void Symbol
19cd0 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
19ce0 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  2a ) return;.  x
19cf0 32 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  2a = (struct s_x
19d00 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  2*)malloc( sizeo
19d10 66 28 73 74 72 75 63 74 20 73 5f 78 32 29 20 29  f(struct s_x2) )
19d20 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20  ;.  if( x2a ){. 
19d30 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31     x2a->size = 1
19d40 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75  28;.    x2a->cou
19d50 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d  nt = 0;.    x2a-
19d60 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29  >tbl = (x2node*)
19d70 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
19d80 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
19d90 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
19da0 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28  )*128 );.    if(
19db0 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x2a->tbl==0 ){.
19dc0 20 20 20 20 20 20 66 72 65 65 28 78 32 61 29 3b        free(x2a);
19dd0 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30 3b 0a  .      x2a = 0;.
19de0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19df0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 32   int i;.      x2
19e00 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a  a->ht = (x2node*
19e10 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38  *)&(x2a->tbl[128
19e20 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ]);.      for(i=
19e30 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78  0; i<128; i++) x
19e40 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  2a->ht[i] = 0;. 
19e50 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
19e60 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
19e70 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
19e80 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
19e90 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
19ea0 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
19eb0 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
19ec0 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
19ed0 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69   */.int Symbol_i
19ee0 6e 73 65 72 74 28 64 61 74 61 2c 6b 65 79 29 0a  nsert(data,key).
19ef0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
19f00 61 74 61 3b 0a 63 68 61 72 20 2a 6b 65 79 3b 0a  ata;.char *key;.
19f10 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x2node *np;.
19f20 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70    int h;.  int p
19f30 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  h;..  if( x2a==0
19f40 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
19f50 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
19f60 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  ;.  h = ph & (x2
19f70 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
19f80 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
19f90 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
19fa0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
19fb0 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a  >key,key)==0 ){.
19fc0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
19fd0 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
19fe0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
19ff0 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
1a000 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
1a010 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
1a020 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
1a030 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1a040 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
1a050 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
1a060 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e  2a->count>=x2a->
1a070 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
1a080 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
1a090 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
1a0a0 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73  r */.    int i,s
1a0b0 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ize;.    struct 
1a0c0 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20 20  s_x2 array;.    
1a0d0 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a  array.size = siz
1a0e0 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b  e = x2a->size*2;
1a0f0 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
1a100 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x2a->count;. 
1a110 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
1a120 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a  x2node*)malloc(.
1a130 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32        (sizeof(x2
1a140 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
1a150 32 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b  2node*))*size );
1a160 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
1a170 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
1a180 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
1a190 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
1a1a0 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
1a1b0 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61   = (x2node**)&(a
1a1c0 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b  rray.tbl[size]);
1a1d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a1e0 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
1a1f0 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
1a200 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e  for(i=0; i<x2a->
1a210 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
1a220 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x2node *oldnp
1a230 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
1a240 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74  oldnp = &(x2a->t
1a250 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
1a260 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d  = strhash(oldnp-
1a270 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29  >key) & (size-1)
1a280 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
1a290 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
1a2a0 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
1a2b0 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
1a2c0 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
1a2d0 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
1a2e0 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
1a2f0 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
1a300 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d      newnp->key =
1a310 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20   oldnp->key;.   
1a320 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
1a330 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
1a340 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
1a350 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
1a360 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
1a370 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
1a380 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61 2d   }.    free(x2a-
1a390 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20  >tbl);.    *x2a 
1a3a0 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
1a3b0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
1a3c0 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
1a3d0 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  h & (x2a->size-1
1a3e0 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61 2d  );.  np = &(x2a-
1a3f0 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x2a->count+
1a400 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d  +]);.  np->key =
1a410 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61   key;.  np->data
1a420 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
1a430 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d  2a->ht[h] ) x2a-
1a440 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
1a450 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
1a460 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68 74  ->next = x2a->ht
1a470 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68  [h];.  x2a->ht[h
1a480 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
1a490 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68  om = &(x2a->ht[h
1a4a0 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
1a4b0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
1a4c0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
1a4d0 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
1a4e0 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
1a4f0 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
1a500 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
1a510 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
1a520 6f 6c 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68 61  ol_find(key).cha
1a530 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20  r *key;.{.  int 
1a540 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b  h;.  x2node *np;
1a550 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ..  if( x2a==0 )
1a560 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
1a570 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20   strhash(key) & 
1a580 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x2a->size-1);. 
1a590 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d   np = x2a->ht[h]
1a5a0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1a5b0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1a5c0 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
1a5d0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20  ) break;.    np 
1a5e0 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
1a5f0 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70    return np ? np
1a600 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->data : 0;.}../
1a610 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d 74  * Return the n-t
1a620 68 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20  h data.  Return 
1a630 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75 74  NULL if n is out
1a640 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74   of range. */.st
1a650 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
1a660 62 6f 6c 5f 4e 74 68 28 6e 29 0a 69 6e 74 20 6e  bol_Nth(n).int n
1a670 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ;.{.  struct sym
1a680 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66 28  bol *data;.  if(
1a690 20 78 32 61 20 26 26 20 6e 3e 30 20 26 26 20 6e   x2a && n>0 && n
1a6a0 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a  <=x2a->count ){.
1a6b0 20 20 20 20 64 61 74 61 20 3d 20 78 32 61 2d 3e      data = x2a->
1a6c0 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20  tbl[n-1].data;. 
1a6d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61   }else{.    data
1a6e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1a6f0 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52  rn data;.}../* R
1a700 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1a710 66 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 69  f the array */.i
1a720 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28  nt Symbol_count(
1a730 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78 32 61  ).{.  return x2a
1a740 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20   ? x2a->count : 
1a750 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
1a760 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
1a770 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61  ters to all data
1a780 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1a790 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f  * The array is o
1a7a0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
1a7b0 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  loc.  Return NUL
1a7c0 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  L if memory allo
1a7d0 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65  cation.** proble
1a7e0 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72  ms, or if the ar
1a7f0 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ray is empty. */
1a800 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
1a810 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28  *Symbol_arrayof(
1a820 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ).{.  struct sym
1a830 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69  bol **array;.  i
1a840 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28  nt i,size;.  if(
1a850 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
1a860 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 32 61   0;.  size = x2a
1a870 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79  ->count;.  array
1a880 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
1a890 6c 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  l **)malloc( siz
1a8a0 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
1a8b0 6c 20 2a 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69  l *)*size );.  i
1a8c0 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20  f( array ){.    
1a8d0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1a8e0 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d   i++) array[i] =
1a8f0 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74   x2a->tbl[i].dat
1a900 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  a;.  }.  return 
1a910 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  array;.}../* Com
1a920 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75  pare two configu
1a930 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43  rations */.int C
1a940 6f 6e 66 69 67 63 6d 70 28 61 2c 62 29 0a 73 74  onfigcmp(a,b).st
1a950 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a  ruct config *a;.
1a960 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
1a970 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78  ;.{.  int x;.  x
1a980 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20   = a->rp->index 
1a990 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a  - b->rp->index;.
1a9a0 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d    if( x==0 ) x =
1a9b0 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74   a->dot - b->dot
1a9c0 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a  ;.  return x;.}.
1a9d0 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
1a9e0 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54  states */.PRIVAT
1a9f0 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28 61  E int statecmp(a
1aa00 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ,b).struct confi
1aa10 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e  g *a;.struct con
1aa20 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20  fig *b;.{.  int 
1aa30 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20  rc;.  for(rc=0; 
1aa40 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62 3b  rc==0 && a && b;
1aa50 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e    a=a->bp, b=b->
1aa60 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d  bp){.    rc = a-
1aa70 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e  >rp->index - b->
1aa80 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69  rp->index;.    i
1aa90 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
1aaa0 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b  a->dot - b->dot;
1aab0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
1aac0 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29 20   ){.    if( a ) 
1aad0 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  rc = 1;.    if( 
1aae0 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d  b ) rc = -1;.  }
1aaf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ab00 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74 65  ./* Hash a state
1ab10 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20   */.PRIVATE int 
1ab20 73 74 61 74 65 68 61 73 68 28 61 29 0a 73 74 72  statehash(a).str
1ab30 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b  uct config *a;.{
1ab40 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68  .  int h=0;.  wh
1ab50 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20  ile( a ){.    h 
1ab60 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d  = h*571 + a->rp-
1ab70 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64  >index*37 + a->d
1ab80 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62  ot;.    a = a->b
1ab90 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
1aba0 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  h;.}../* Allocat
1abb0 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73 74  e a new state st
1abc0 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63  ructure */.struc
1abd0 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
1abe0 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  ew().{.  struct 
1abf0 73 74 61 74 65 20 2a 6e 65 77 3b 0a 20 20 6e 65  state *new;.  ne
1ac00 77 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74  w = (struct stat
1ac10 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  e *)malloc( size
1ac20 6f 66 28 73 74 72 75 63 74 20 73 74 61 74 65 29  of(struct state)
1ac30 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63   );.  MemoryChec
1ac40 6b 28 6e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e  k(new);.  return
1ac50 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72   new;.}../* Ther
1ac60 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1ac70 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1ac80 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
1ac90 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
1aca0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
1acb0 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x3"..*/.stru
1acc0 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20  ct s_x3 {.  int 
1acd0 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
1ace0 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
1acf0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
1ad00 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
1ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
1ad30 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
1ad40 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
1ad70 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
1ad80 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
1ad90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ada0 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
1adb0 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
1adc0 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
1add0 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
1ade0 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
1adf0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
1ae00 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
1ae10 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
1ae20 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
1ae30 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
1ae40 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
1ae50 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
1ae60 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
1ae70 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
1ae80 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
1ae90 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x3"..*/.typede
1aea0 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64  f struct s_x3nod
1aeb0 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  e {.  struct sta
1aec0 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  te *data;       
1aed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1aee0 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
1aef0 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20  ct config *key; 
1af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af10 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
1af20 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
1af30 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
1af40 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
1af50 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
1af60 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
1af70 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
1af80 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
1af90 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x3node;../* Ther
1afa0 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
1afb0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
1afc0 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
1afd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
1afe0 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
1aff0 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  3 *x3a;../* Allo
1b000 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
1b010 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
1b020 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28  void State_init(
1b030 29 7b 0a 20 20 69 66 28 20 78 33 61 20 29 20 72  ){.  if( x3a ) r
1b040 65 74 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28  eturn;.  x3a = (
1b050 73 74 72 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c  struct s_x3*)mal
1b060 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
1b070 63 74 20 73 5f 78 33 29 20 29 3b 0a 20 20 69 66  ct s_x3) );.  if
1b080 28 20 78 33 61 20 29 7b 0a 20 20 20 20 78 33 61  ( x3a ){.    x3a
1b090 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20  ->size = 128;.  
1b0a0 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x3a->count = 0
1b0b0 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d  ;.    x3a->tbl =
1b0c0 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x3node*)malloc
1b0d0 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  ( .      (sizeof
1b0e0 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x3node) + sizeo
1b0f0 66 28 78 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20  f(x3node*))*128 
1b100 29 3b 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e  );.    if( x3a->
1b110 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
1b120 66 72 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20  free(x3a);.     
1b130 20 78 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x3a = 0;.    }e
1b140 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1b150 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20  ;.      x3a->ht 
1b160 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33  = (x3node**)&(x3
1b170 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20  a->tbl[128]);.  
1b180 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
1b190 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74  28; i++) x3a->ht
1b1a0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
1b1b0 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
1b1c0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
1b1d0 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
1b1e0 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
1b1f0 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
1b200 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
1b210 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
1b220 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
1b230 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 64  t State_insert(d
1b240 61 74 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20  ata,key).struct 
1b250 73 74 61 74 65 20 2a 64 61 74 61 3b 0a 73 74 72  state *data;.str
1b260 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b  uct config *key;
1b270 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b  .{.  x3node *np;
1b280 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
1b290 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d  ph;..  if( x3a==
1b2a0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1b2b0 70 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b  ph = statehash(k
1b2c0 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ey);.  h = ph & 
1b2d0 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
1b2e0 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d   np = x3a->ht[h]
1b2f0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1b300 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d  .    if( statecm
1b310 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
1b320 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
1b330 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
1b340 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
1b350 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
1b360 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
1b370 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
1b380 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
1b390 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1b3a0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
1b3b0 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
1b3c0 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x3a->count>=
1b3d0 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x3a->size ){.   
1b3e0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
1b3f0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
1b400 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
1b410 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74  t i,size;.    st
1b420 72 75 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b  ruct s_x3 array;
1b430 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
1b440 3d 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69  = size = x3a->si
1b450 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
1b460 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75  count = x3a->cou
1b470 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
1b480 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c  l = (x3node*)mal
1b490 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65  loc(.      (size
1b4a0 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
1b4b0 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 73 69  eof(x3node*))*si
1b4c0 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72  ze );.    if( ar
1b4d0 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
1b4e0 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
1b4f0 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
1b500 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
1b510 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a  ay.ht = (x3node*
1b520 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
1b530 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
1b540 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
1b550 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
1b560 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1b570 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x3a->count; i++)
1b580 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a  {.      x3node *
1b590 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
1b5a0 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
1b5b0 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  3a->tbl[i]);.   
1b5c0 20 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68     h = statehash
1b5d0 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28  (oldnp->key) & (
1b5e0 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  size-1);.      n
1b5f0 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
1b600 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
1b610 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
1b620 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
1b630 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
1b640 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
1b650 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
1b660 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
1b670 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b  ->key = oldnp->k
1b680 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ey;.      newnp-
1b690 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
1b6a0 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
1b6b0 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
1b6c0 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
1b6d0 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
1b6e0 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
1b6f0 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x3a->tbl);.  
1b700 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79 3b 0a    *x3a = array;.
1b710 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
1b720 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
1b730 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d    h = ph & (x3a-
1b740 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
1b750 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d   &(x3a->tbl[x3a-
1b760 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
1b770 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e  ->key = key;.  n
1b780 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
1b790 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d    if( x3a->ht[h]
1b7a0 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x3a->ht[h]->f
1b7b0 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
1b7c0 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
1b7d0 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33  x3a->ht[h];.  x3
1b7e0 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
1b7f0 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33   np->from = &(x3
1b800 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
1b810 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
1b820 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1b830 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
1b840 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
1b850 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
1b860 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
1b870 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65   */.struct state
1b880 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 6b 65 79   *State_find(key
1b890 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
1b8a0 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b  *key;.{.  int h;
1b8b0 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x3node *np;..
1b8c0 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72    if( x3a==0 ) r
1b8d0 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73  eturn 0;.  h = s
1b8e0 74 61 74 65 68 61 73 68 28 6b 65 79 29 20 26 20  tatehash(key) & 
1b8f0 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
1b900 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d   np = x3a->ht[h]
1b910 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1b920 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d  .    if( statecm
1b930 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
1b940 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
1b950 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
1b960 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
1b970 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
1b980 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72  ./* Return an ar
1b990 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
1b9a0 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74  to all data in t
1b9b0 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65  he table..** The
1b9c0 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e   array is obtain
1b9d0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
1b9e0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1b9f0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1ba00 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f  n.** problems, o
1ba10 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20 69  r if the array i
1ba20 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75  s empty. */.stru
1ba30 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65  ct state **State
1ba40 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73  _arrayof().{.  s
1ba50 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72  truct state **ar
1ba60 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a  ray;.  int i,siz
1ba70 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  e;.  if( x3a==0 
1ba80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69  ) return 0;.  si
1ba90 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b  ze = x3a->count;
1baa0 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75  .  array = (stru
1bab0 63 74 20 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c  ct state **)mall
1bac0 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
1bad0 74 20 73 74 61 74 65 20 2a 29 2a 73 69 7a 65 20  t state *)*size 
1bae0 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
1baf0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1bb00 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
1bb10 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b  y[i] = x3a->tbl[
1bb20 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72  i].data;.  }.  r
1bb30 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a  eturn array;.}..
1bb40 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66 69 67  /* Hash a config
1bb50 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41  uration */.PRIVA
1bb60 54 45 20 69 6e 74 20 63 6f 6e 66 69 67 68 61 73  TE int confighas
1bb70 68 28 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  h(a).struct conf
1bb80 69 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68  ig *a;.{.  int h
1bb90 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20  =0;.  h = h*571 
1bba0 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33  + a->rp->index*3
1bbb0 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65  7 + a->dot;.  re
1bbc0 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn h;.}../* Th
1bbd0 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
1bbe0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1bbf0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
1bc00 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
1bc10 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
1bc20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74  type "x4"..*/.st
1bc30 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e  ruct s_x4 {.  in
1bc40 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
1bc50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
1bc60 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1bc70 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
1bca0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
1bcb0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
1bcc0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1bce0 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
1bcf0 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
1bd00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1bd10 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
1bd20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
1bd30 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
1bd40 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
1bd50 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
1bd60 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1bd70 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  4node **ht;  /* 
1bd80 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
1bd90 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
1bda0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
1bdb0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
1bdc0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
1bdd0 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
1bde0 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
1bdf0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
1be00 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x4"..*/.type
1be10 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e  def struct s_x4n
1be20 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63  ode {.  struct c
1be30 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20  onfig *data;    
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1be50 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
1be60 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
1be70 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
1be80 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
1be90 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
1bea0 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a  ruct s_x4node **
1beb0 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
1bec0 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e  us link */.} x4n
1bed0 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
1bee0 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
1bef0 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
1bf00 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
1bf10 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
1bf20 69 63 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a  ic struct s_x4 *
1bf30 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x4a;../* Allocat
1bf40 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
1bf50 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
1bf60 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  d Configtable_in
1bf70 69 74 28 29 7b 0a 20 20 69 66 28 20 78 34 61 20  it(){.  if( x4a 
1bf80 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20  ) return;.  x4a 
1bf90 3d 20 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29  = (struct s_x4*)
1bfa0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
1bfb0 74 72 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20  truct s_x4) );. 
1bfc0 20 69 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20   if( x4a ){.    
1bfd0 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a  x4a->size = 64;.
1bfe0 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d      x4a->count =
1bff0 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c   0;.    x4a->tbl
1c000 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x4node*)mall
1c010 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
1c020 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x4node) + siz
1c030 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 36 34  eof(x4node*))*64
1c040 20 29 3b 0a 20 20 20 20 69 66 28 20 78 34 61 2d   );.    if( x4a-
1c050 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
1c060 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20 20 20   free(x4a);.    
1c070 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x4a = 0;.    }
1c080 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1c090 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e 68 74  i;.      x4a->ht
1c0a0 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78   = (x4node**)&(x
1c0b0 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20  4a->tbl[64]);.  
1c0c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36      for(i=0; i<6
1c0d0 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b  4; i++) x4a->ht[
1c0e0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
1c0f0 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
1c100 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
1c110 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
1c120 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
1c130 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
1c140 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
1c150 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
1c160 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
1c170 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
1c180 65 72 74 28 64 61 74 61 29 0a 73 74 72 75 63 74  ert(data).struct
1c190 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 0a 7b   config *data;.{
1c1a0 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x4node *np;. 
1c1b0 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68   int h;.  int ph
1c1c0 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  ;..  if( x4a==0 
1c1d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
1c1e0 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61   = confighash(da
1c1f0 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ta);.  h = ph & 
1c200 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
1c210 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d   np = x4a->ht[h]
1c220 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1c230 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63  .    if( Configc
1c240 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61  mp(np->data,data
1c250 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
1c260 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
1c270 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
1c280 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
1c290 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
1c2a0 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
1c2b0 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
1c2c0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1c2d0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
1c2e0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
1c2f0 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e  .  if( x4a->coun
1c300 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x4a->size ){.
1c310 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
1c320 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
1c330 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
1c340 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20   int i,size;.   
1c350 20 73 74 72 75 63 74 20 73 5f 78 34 20 61 72 72   struct s_x4 arr
1c360 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
1c370 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 34 61 2d  ze = size = x4a-
1c380 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
1c390 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e  ay.count = x4a->
1c3a0 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
1c3b0 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29  .tbl = (x4node*)
1c3c0 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73  malloc(.      (s
1c3d0 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20  izeof(x4node) + 
1c3e0 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29  sizeof(x4node*))
1c3f0 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  *size );.    if(
1c400 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
1c410 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
1c420 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
1c430 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
1c440 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f  array.ht = (x4no
1c450 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
1c460 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  [size]);.    for
1c470 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
1c480 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
1c490 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
1c4a0 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x4a->count; i
1c4b0 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64  ++){.      x4nod
1c4c0 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
1c4d0 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
1c4e0 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x4a->tbl[i]);.
1c4f0 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66 69 67        h = config
1c500 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
1c510 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
1c520 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
1c530 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
1c540 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
1c550 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
1c560 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
1c570 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
1c580 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
1c590 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
1c5a0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
1c5b0 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
1c5c0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
1c5d0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
1c5e0 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
1c5f0 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
1c600 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62      free(x4a->tb
1c610 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61  l);.    *x4a = a
1c620 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
1c630 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
1c640 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
1c650 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
1c660 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62    np = &(x4a->tb
1c670 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x4a->count++])
1c680 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
1c690 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e  ata;.  if( x4a->
1c6a0 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b  ht[h] ) x4a->ht[
1c6b0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
1c6c0 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
1c6d0 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  xt = x4a->ht[h];
1c6e0 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x4a->ht[h] = 
1c6f0 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
1c700 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x4a->ht[h]);.
1c710 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1c720 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1c730 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
1c740 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
1c750 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
1c760 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
1c770 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
1c780 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61  config *Configta
1c790 62 6c 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74  ble_find(key).st
1c7a0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
1c7b0 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ;.{.  int h;.  x
1c7c0 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  4node *np;..  if
1c7d0 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
1c7e0 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69  n 0;.  h = confi
1c7f0 67 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 34  ghash(key) & (x4
1c800 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1c810 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
1c820 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
1c830 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
1c840 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30  np->data,key)==0
1c850 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
1c860 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
1c870 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
1c880 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
1c890 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61  /* Remove all da
1c8a0 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  ta from the tabl
1c8b0 65 2e 20 20 50 61 73 73 20 65 61 63 68 20 64 61  e.  Pass each da
1c8c0 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ta to the functi
1c8d0 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20  on "f".** as it 
1c8e0 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66  is removed.  ("f
1c8f0 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f  " may be null to
1c900 20 61 76 6f 69 64 20 74 68 69 73 20 73 74 65 70   avoid this step
1c910 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  .) */.void Confi
1c920 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 66 29 0a  gtable_clear(f).
1c930 69 6e 74 28 2a 66 29 28 2f 2a 20 73 74 72 75 63  int(*f)(/* struc
1c940 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a  t config * */);.
1c950 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1c960 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e   x4a==0 || x4a->
1c970 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72  count==0 ) retur
1c980 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72  n;.  if( f ) for
1c990 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75  (i=0; i<x4a->cou
1c9a0 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34  nt; i++) (*f)(x4
1c9b0 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b  a->tbl[i].data);
1c9c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34  .  for(i=0; i<x4
1c9d0 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34  a->size; i++) x4
1c9e0 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
1c9f0 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x4a->count = 0;.
1ca00 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.