/ Hex Artifact Content
Login

Artifact 0bd764091cd818717ee62193015873d73ca87e09:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 0a 65 78 74   <stdlib.h>..ext
0190: 65 72 6e 20 76 6f 69 64 20 71 73 6f 72 74 28 29  ern void qsort()
01a0: 3b 0a 65 78 74 65 72 6e 20 64 6f 75 62 6c 65 20  ;.extern double 
01b0: 73 74 72 74 6f 64 28 29 3b 0a 65 78 74 65 72 6e  strtod();.extern
01c0: 20 6c 6f 6e 67 20 73 74 72 74 6f 6c 28 29 3b 0a   long strtol();.
01d0: 65 78 74 65 72 6e 20 76 6f 69 64 20 66 72 65 65  extern void free
01e0: 28 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 61  ();.extern int a
01f0: 63 63 65 73 73 28 29 3b 0a 65 78 74 65 72 6e 20  ccess();.extern 
0200: 69 6e 74 20 61 74 6f 69 28 29 3b 0a 0a 23 69 66  int atoi();..#if
0210: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
0220: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
0230: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
0240: 28 57 49 4e 33 32 29 0a 23 09 64 65 66 69 6e 65  (WIN32).#.define
0250: 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23 20 20 20 65   __WIN32__.#   e
0260: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  ndif.#endif../* 
0270: 23 64 65 66 69 6e 65 20 50 52 49 56 41 54 45 20  #define PRIVATE 
0280: 73 74 61 74 69 63 20 2a 2f 0a 23 64 65 66 69 6e  static */.#defin
0290: 65 20 50 52 49 56 41 54 45 0a 0a 23 69 66 64 65  e PRIVATE..#ifde
02a0: 66 20 54 45 53 54 0a 23 64 65 66 69 6e 65 20 4d  f TEST.#define M
02b0: 41 58 52 48 53 20 35 20 20 20 20 20 20 20 2f 2a  AXRHS 5       /*
02c0: 20 53 65 74 20 6c 6f 77 20 74 6f 20 65 78 65 72   Set low to exer
02d0: 63 69 73 65 20 65 78 63 65 70 74 69 6f 6e 20 63  cise exception c
02e0: 6f 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65  ode */.#else.#de
02f0: 66 69 6e 65 20 4d 41 58 52 48 53 20 31 30 30 30  fine MAXRHS 1000
0300: 0a 23 65 6e 64 69 66 0a 0a 63 68 61 72 20 2a 6d  .#endif..char *m
0310: 73 6f 72 74 28 29 3b 0a 65 78 74 65 72 6e 20 76  sort();.extern v
0320: 6f 69 64 20 2a 6d 61 6c 6c 6f 63 28 29 3b 0a 0a  oid *malloc();..
0330: 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  /******** From t
0340: 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e  he file "action.
0350: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74  ********/.struct
0380: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
0390: 6e 65 77 28 29 3b 0a 73 74 72 75 63 74 20 61 63  new();.struct ac
03a0: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72  tion *Action_sor
03b0: 74 28 29 3b 0a 76 6f 69 64 20 41 63 74 69 6f 6e  t();.void Action
03c0: 5f 61 64 64 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  _add();../******
03d0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
03e0: 65 20 22 61 73 73 65 72 74 2e 68 22 20 2a 2a 2a  e "assert.h" ***
03f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0410: 2a 2f 0a 76 6f 69 64 20 6d 79 61 73 73 65 72 74  */.void myassert
0420: 28 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ();.#ifndef NDEB
0430: 55 47 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  UG.#  define ass
0440: 65 72 74 28 58 29 20 69 66 28 21 28 58 29 29 6d  ert(X) if(!(X))m
0450: 79 61 73 73 65 72 74 28 5f 5f 46 49 4c 45 5f 5f  yassert(__FILE__
0460: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65  ,__LINE__).#else
0470: 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
0480: 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a  t(X).#endif../**
0490: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
04a0: 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68 22  e file "build.h"
04b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
04c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04d0: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  *****/.void Find
04e0: 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28  RulePrecedences(
04f0: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73  );.void FindFirs
0500: 74 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46 69  tSets();.void Fi
0510: 6e 64 53 74 61 74 65 73 28 29 3b 0a 76 6f 69 64  ndStates();.void
0520: 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a 76 6f   FindLinks();.vo
0530: 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74  id FindFollowSet
0540: 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 41 63  s();.void FindAc
0550: 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  tions();../*****
0560: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
0570: 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68  le "configlist.h
0580: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
0590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05a0: 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  ***/.void Config
05b0: 6c 69 73 74 5f 69 6e 69 74 28 2f 2a 20 76 6f 69  list_init(/* voi
05c0: 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f  d */);.struct co
05d0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
05e0: 5f 61 64 64 28 2f 2a 20 73 74 72 75 63 74 20 72  _add(/* struct r
05f0: 75 6c 65 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a  ule *, int */);.
0600: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
0610: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
0620: 69 73 28 2f 2a 20 73 74 72 75 63 74 20 72 75 6c  is(/* struct rul
0630: 65 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f  e *, int */);.vo
0640: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c  id Configlist_cl
0650: 6f 73 75 72 65 28 2f 2a 20 76 6f 69 64 20 2a 2f  osure(/* void */
0660: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  );.void Configli
0670: 73 74 5f 73 6f 72 74 28 2f 2a 20 76 6f 69 64 20  st_sort(/* void 
0680: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0690: 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 2f  list_sortbasis(/
06a0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75  * void */);.stru
06b0: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
06c0: 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 2f 2a 20  glist_return(/* 
06d0: 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74  void */);.struct
06e0: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
06f0: 69 73 74 5f 62 61 73 69 73 28 2f 2a 20 76 6f 69  ist_basis(/* voi
0700: 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  d */);.void Conf
0710: 69 67 6c 69 73 74 5f 65 61 74 28 2f 2a 20 73 74  iglist_eat(/* st
0720: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f  ruct config * */
0730: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  );.void Configli
0740: 73 74 5f 72 65 73 65 74 28 2f 2a 20 76 6f 69 64  st_reset(/* void
0750: 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   */);../********
0760: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0770: 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a  "error.h" ******
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07a0: 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67  */.void ErrorMsg
07b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69  (const char *, i
07c0: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  nt,const char *,
07d0: 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20   ...);../****** 
07e0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f  From the file "o
07f0: 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  ption.h" *******
0800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0820: 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 6f 70  ***/.struct s_op
0830: 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 7b  tions {.  enum {
0840: 20 4f 50 54 5f 46 4c 41 47 3d 31 2c 20 20 4f 50   OPT_FLAG=1,  OP
0850: 54 5f 49 4e 54 2c 20 20 4f 50 54 5f 44 42 4c 2c  T_INT,  OPT_DBL,
0860: 20 20 4f 50 54 5f 53 54 52 2c 0a 20 20 20 20 20    OPT_STR,.     
0870: 20 20 20 20 4f 50 54 5f 46 46 4c 41 47 2c 20 4f      OPT_FFLAG, O
0880: 50 54 5f 46 49 4e 54 2c 20 4f 50 54 5f 46 44 42  PT_FINT, OPT_FDB
0890: 4c 2c 20 4f 50 54 5f 46 53 54 52 7d 20 74 79 70  L, OPT_FSTR} typ
08a0: 65 3b 0a 20 20 63 68 61 72 20 2a 6c 61 62 65 6c  e;.  char *label
08b0: 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 0a 20  ;.  char *arg;. 
08c0: 20 63 68 61 72 20 2a 6d 65 73 73 61 67 65 3b 0a   char *message;.
08d0: 7d 3b 0a 69 6e 74 20 20 20 20 4f 70 74 49 6e 69  };.int    OptIni
08e0: 74 28 2f 2a 20 63 68 61 72 2a 2a 2c 73 74 72 75  t(/* char**,stru
08f0: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 2a 2c 46 49  ct s_options*,FI
0900: 4c 45 2a 20 2a 2f 29 3b 0a 69 6e 74 20 20 20 20  LE* */);.int    
0910: 4f 70 74 4e 41 72 67 73 28 2f 2a 20 76 6f 69 64  OptNArgs(/* void
0920: 20 2a 2f 29 3b 0a 63 68 61 72 20 20 2a 4f 70 74   */);.char  *Opt
0930: 41 72 67 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a  Arg(/* int */);.
0940: 76 6f 69 64 20 20 20 4f 70 74 45 72 72 28 2f 2a  void   OptErr(/*
0950: 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64 20 20   int */);.void  
0960: 20 4f 70 74 50 72 69 6e 74 28 2f 2a 20 76 6f 69   OptPrint(/* voi
0970: 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  d */);../*******
0980: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0990: 22 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a  "parse.h" ******
09a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09c0: 2a 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28  ***/.void Parse(
09d0: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
09e0: 2a 6c 65 6d 70 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a  *lemp */);../***
09f0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
0a00: 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68 22 20 2a  file "plink.h" *
0a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a30: 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 70  ******/.struct p
0a40: 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28  link *Plink_new(
0a50: 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69  /* void */);.voi
0a60: 64 20 50 6c 69 6e 6b 5f 61 64 64 28 2f 2a 20 73  d Plink_add(/* s
0a70: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20  truct plink **, 
0a80: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
0a90: 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  */);.void Plink_
0aa0: 63 6f 70 79 28 2f 2a 20 73 74 72 75 63 74 20 70  copy(/* struct p
0ab0: 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74 20  link **, struct 
0ac0: 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a 76 6f 69  plink * */);.voi
0ad0: 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 2f  d Plink_delete(/
0ae0: 2a 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  * struct plink *
0af0: 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   */);../********
0b00: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0b10: 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a 2a 2a   "report.h" ****
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b40: 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28  */.void Reprint(
0b50: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
0b60: 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65 70 6f  * */);.void Repo
0b70: 72 74 4f 75 74 70 75 74 28 2f 2a 20 73 74 72 75  rtOutput(/* stru
0b80: 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a  ct lemon * */);.
0b90: 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65  void ReportTable
0ba0: 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (/* struct lemon
0bb0: 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65 70   * */);.void Rep
0bc0: 6f 72 74 48 65 61 64 65 72 28 2f 2a 20 73 74 72  ortHeader(/* str
0bd0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b  uct lemon * */);
0be0: 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61  .void CompressTa
0bf0: 62 6c 65 73 28 2f 2a 20 73 74 72 75 63 74 20 6c  bles(/* struct l
0c00: 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a  emon * */);../**
0c10: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
0c20: 65 20 66 69 6c 65 20 22 73 65 74 2e 68 22 20 2a  e file "set.h" *
0c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c50: 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 20 53  *******/.void  S
0c60: 65 74 53 69 7a 65 28 2f 2a 20 69 6e 74 20 4e 20  etSize(/* int N 
0c70: 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  */);            
0c80: 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69 6c   /* All sets wil
0c90: 6c 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a  l be of size N *
0ca0: 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 2f  /.char *SetNew(/
0cb0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 20 20 20 20 20  * void */);     
0cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e            /* A n
0cd0: 65 77 20 73 65 74 20 66 6f 72 20 65 6c 65 6d 65  ew set for eleme
0ce0: 6e 74 20 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64 20  nt 0..N */.void 
0cf0: 20 53 65 74 46 72 65 65 28 2f 2a 20 63 68 61 72   SetFree(/* char
0d00: 2a 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20  * */);          
0d10: 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
0d20: 20 61 20 73 65 74 20 2a 2f 0a 0a 69 6e 74 20 53   a set */..int S
0d30: 65 74 41 64 64 28 2f 2a 20 63 68 61 72 2a 2c 69  etAdd(/* char*,i
0d40: 6e 74 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20  nt */);         
0d50: 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d 65 6e     /* Add elemen
0d60: 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a 69 6e  t to a set */.in
0d70: 74 20 53 65 74 55 6e 69 6f 6e 28 2f 2a 20 63 68  t SetUnion(/* ch
0d80: 61 72 20 2a 41 2c 63 68 61 72 20 2a 42 20 2a 2f  ar *A,char *B */
0d90: 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20 41 20  );    /* A <- A 
0da0: 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d 65 6e  U B, thru elemen
0db0: 74 20 4e 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  t N */..#define 
0dc0: 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58 5b  SetFind(X,Y) (X[
0dd0: 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72 75  Y])       /* Tru
0de0: 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65 74  e if Y is in set
0df0: 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   X */../********
0e00: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0e10: 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a 2a   "struct.h" ****
0e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e40: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69 70  */./*.** Princip
0e50: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
0e60: 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  es for the LEMON
0e70: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0e80: 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 65  r..*/..typedef e
0e90: 6e 75 6d 20 7b 42 5f 46 41 4c 53 45 3d 30 2c 20  num {B_FALSE=0, 
0ea0: 42 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e 3b  B_TRUE} Boolean;
0eb0: 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74 65  ../* Symbols (te
0ec0: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
0ed0: 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68 65  erminals) of the
0ee0: 20 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74 6f   grammar are sto
0ef0: 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f  red.** in the fo
0f00: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73 74 72 75  llowing: */.stru
0f10: 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20 20 63 68  ct symbol {.  ch
0f20: 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
0f30: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0f40: 66 20 74 68 65 20 73 79 6d 62 6f 6c 20 2a 2f 0a  f the symbol */.
0f50: 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20    int index;    
0f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0f70: 64 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  dex number for t
0f80: 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  his symbol */.  
0f90: 65 6e 75 6d 20 7b 0a 20 20 20 20 54 45 52 4d 49  enum {.    TERMI
0fa0: 4e 41 4c 2c 0a 20 20 20 20 4e 4f 4e 54 45 52 4d  NAL,.    NONTERM
0fb0: 49 4e 41 4c 0a 20 20 7d 20 74 79 70 65 3b 20 20  INAL.  } type;  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 2f 2a 20 53 79 6d 62 6f 6c 73 20 61 72 65 20 61  /* Symbols are a
0fe0: 6c 6c 20 65 69 74 68 65 72 20 54 45 52 4d 49 4e  ll either TERMIN
0ff0: 41 4c 53 20 6f 72 20 4e 54 73 20 2a 2f 0a 20 20  ALS or NTs */.  
1000: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c  struct rule *rul
1010: 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b  e;       /* Link
1020: 65 64 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73  ed list of rules
1030: 20 6f 66 20 74 68 69 73 20 28 69 66 20 61 6e 20   of this (if an 
1040: 4e 54 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  NT) */.  struct 
1050: 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b  symbol *fallback
1060: 3b 20 2f 2a 20 66 61 6c 6c 62 61 63 6b 20 74 6f  ; /* fallback to
1070: 6b 65 6e 20 69 6e 20 63 61 73 65 20 74 68 69 73  ken in case this
1080: 20 74 6f 6b 65 6e 20 64 6f 65 73 6e 27 74 20 70   token doesn't p
1090: 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74 20 70 72  arse */.  int pr
10a0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
10b0: 20 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65     /* Precedence
10c0: 20 69 66 20 64 65 66 69 6e 65 64 20 28 2d 31 20   if defined (-1 
10d0: 6f 74 68 65 72 77 69 73 65 29 20 2a 2f 0a 20 20  otherwise) */.  
10e0: 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 7b 0a 20  enum e_assoc {. 
10f0: 20 20 20 4c 45 46 54 2c 0a 20 20 20 20 52 49 47     LEFT,.    RIG
1100: 48 54 2c 0a 20 20 20 20 4e 4f 4e 45 2c 0a 20 20  HT,.    NONE,.  
1110: 20 20 55 4e 4b 0a 20 20 7d 20 61 73 73 6f 63 3b    UNK.  } assoc;
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 2f 2a 20 41 73 73 6f 63 69 61 74 69 76 69 74   /* Associativit
1140: 79 20 69 66 20 70 72 65 64 65 63 65 6e 63 65 20  y if predecence 
1150: 69 73 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  is defined */.  
1160: 63 68 61 72 20 2a 66 69 72 73 74 73 65 74 3b 20  char *firstset; 
1170: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1180: 74 2d 73 65 74 20 66 6f 72 20 61 6c 6c 20 72 75  t-set for all ru
1190: 6c 65 73 20 6f 66 20 74 68 69 73 20 73 79 6d 62  les of this symb
11a0: 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20  ol */.  Boolean 
11b0: 6c 61 6d 62 64 61 3b 20 20 20 20 20 20 20 20 20  lambda;         
11c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 4e 54 20 61   /* True if NT a
11d0: 6e 64 20 63 61 6e 20 67 65 6e 65 72 61 74 65 20  nd can generate 
11e0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
11f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73 74 72  */.  char *destr
1200: 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20 2f 2a  uctor;        /*
1210: 20 43 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   Code which exec
1220: 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68  utes whenever th
1230: 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20 20 20  is symbol is.   
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70 70 65          ** poppe
1260: 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
1270: 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20 70 72   during error pr
1280: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
1290: 74 20 64 65 73 74 72 75 63 74 6f 72 6c 6e 3b 20  t destructorln; 
12a0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
12b0: 75 6d 62 65 72 20 6f 66 20 64 65 73 74 72 75 63  umber of destruc
12c0: 74 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  tor code */.  ch
12d0: 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20 20 20  ar *datatype;   
12e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
12f0: 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66 6f 72  ta type of infor
1300: 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79 20 74  mation held by t
1310: 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  his.            
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1330: 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79 20 75  * object. Only u
1340: 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e 4f 4e  sed if type==NON
1350: 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69 6e  TERMINAL */.  in
1360: 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  t dtnum;        
1370: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1380: 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72 2e 20  ta type number. 
1390: 20 49 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   In the parser, 
13a0: 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20 69 73       ** stack is
13d0: 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65 20 2e   a union.  The .
13e0: 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  yy%d element of 
13f0: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68 65 20  ** union is the 
1420: 63 6f 72 72 65 63 74 20 64 61 74 61 20 74 79 70  correct data typ
1430: 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a 65 63  e for this objec
1440: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68  t */.};../* Each
1450: 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65   production rule
1460: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
1470: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
1480: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
1490: 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72  ructure.  */.str
14a0: 75 63 74 20 72 75 6c 65 20 7b 0a 20 20 73 74 72  uct rule {.  str
14b0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b  uct symbol *lhs;
14c0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61        /* Left-ha
14d0: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 72  nd side of the r
14e0: 75 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ule */.  char *l
14f0: 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20 20 20  hsalias;        
1500: 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74    /* Alias for t
1510: 68 65 20 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20  he LHS (NULL if 
1520: 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 72  none) */.  int r
1530: 75 6c 65 6c 69 6e 65 3b 20 20 20 20 20 20 20 20  uleline;        
1540: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
1550: 65 72 20 66 6f 72 20 74 68 65 20 72 75 6c 65 20  er for the rule 
1560: 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20  */.  int nrhs;  
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1580: 20 4e 75 6d 62 65 72 20 6f 66 20 52 48 53 20 73   Number of RHS s
1590: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75  ymbols */.  stru
15a0: 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 72 68 73 3b  ct symbol **rhs;
15b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20       /* The RHS 
15c0: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61  symbols */.  cha
15d0: 72 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20  r **rhsalias;   
15e0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 6c 69 61        /* An alia
15f0: 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 73  s for each RHS s
1600: 79 6d 62 6f 6c 20 28 4e 55 4c 4c 20 69 66 20 6e  ymbol (NULL if n
1610: 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 69  one) */.  int li
1620: 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ne;             
1630: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
1640: 72 20 61 74 20 77 68 69 63 68 20 63 6f 64 65 20  r at which code 
1650: 62 65 67 69 6e 73 20 2a 2f 0a 20 20 63 68 61 72  begins */.  char
1660: 20 2a 63 6f 64 65 3b 20 20 20 20 20 20 20 20 20   *code;         
1670: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
1680: 20 65 78 65 63 75 74 65 64 20 77 68 65 6e 20 74   executed when t
1690: 68 69 73 20 72 75 6c 65 20 69 73 20 72 65 64 75  his rule is redu
16a0: 63 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ced */.  struct 
16b0: 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d 3b  symbol *precsym;
16c0: 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20    /* Precedence 
16d0: 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73 20  symbol for this 
16e0: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  rule */.  int in
16f0: 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1700: 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6e     /* An index n
1710: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 72  umber for this r
1720: 75 6c 65 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e  ule */.  Boolean
1730: 20 63 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20   canReduce;     
1740: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1750: 73 20 72 75 6c 65 20 69 73 20 65 76 65 72 20 72  s rule is ever r
1760: 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74 72 75  educed */.  stru
1770: 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 6c 68 73  ct rule *nextlhs
1780: 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c  ;    /* Next rul
1790: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
17a0: 4c 48 53 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  LHS */.  struct 
17b0: 72 75 6c 65 20 2a 6e 65 78 74 3b 20 20 20 20 20  rule *next;     
17c0: 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20 69    /* Next rule i
17d0: 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73  n the global lis
17e0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 20 63 6f  t */.};../* A co
17f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 61  nfiguration is a
1800: 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65   production rule
1810: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
1820: 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a  together with.**
1830: 20 61 20 6d 61 72 6b 20 28 64 6f 74 29 20 73 68   a mark (dot) sh
1840: 6f 77 69 6e 67 20 68 6f 77 20 6d 75 63 68 20 6f  owing how much o
1850: 66 20 74 68 61 74 20 72 75 6c 65 20 68 61 73 20  f that rule has 
1860: 62 65 65 6e 20 70 72 6f 63 65 73 73 65 64 20 73  been processed s
1870: 6f 20 66 61 72 2e 0a 2a 2a 20 43 6f 6e 66 69 67  o far..** Config
1880: 75 72 61 74 69 6f 6e 73 20 61 6c 73 6f 20 63 6f  urations also co
1890: 6e 74 61 69 6e 20 61 20 66 6f 6c 6c 6f 77 2d 73  ntain a follow-s
18a0: 65 74 20 77 68 69 63 68 20 69 73 20 61 20 6c 69  et which is a li
18b0: 73 74 20 6f 66 20 74 65 72 6d 69 6e 61 6c 0a 2a  st of terminal.*
18c0: 2a 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  * symbols which 
18d0: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 69  are allowed to i
18e0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
18f0: 77 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  w the end of the
1900: 20 72 75 6c 65 2e 0a 2a 2a 20 45 76 65 72 79 20   rule..** Every 
1910: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73  configuration is
1920: 20 72 65 63 6f 72 64 65 64 20 61 73 20 61 6e 20   recorded as an 
1930: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1940: 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73 74  following: */.st
1950: 72 75 63 74 20 63 6f 6e 66 69 67 20 7b 0a 20 20  ruct config {.  
1960: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
1970: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1980: 72 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20  rule upon which 
1990: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
19a0: 6e 20 69 73 20 62 61 73 65 64 20 2a 2f 0a 20 20  n is based */.  
19b0: 69 6e 74 20 64 6f 74 3b 20 20 20 20 20 20 20 20  int dot;        
19c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19d0: 70 61 72 73 65 20 70 6f 69 6e 74 20 2a 2f 0a 20  parse point */. 
19e0: 20 63 68 61 72 20 2a 66 77 73 3b 20 20 20 20 20   char *fws;     
19f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 6c            /* Fol
1a00: 6c 6f 77 2d 73 65 74 20 66 6f 72 20 74 68 69 73  low-set for this
1a10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
1a20: 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1a30: 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b 20 20 20 20  plink *fplp;    
1a40: 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20    /* Follow-set 
1a50: 66 6f 72 77 61 72 64 20 70 72 6f 70 61 67 61 74  forward propagat
1a60: 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73  ion links */.  s
1a70: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 62 70 6c  truct plink *bpl
1a80: 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f  p;      /* Follo
1a90: 77 2d 73 65 74 20 62 61 63 6b 77 61 72 64 73 20  w-set backwards 
1aa0: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
1ab0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  s */.  struct st
1ac0: 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 20 20  ate *stp;       
1ad0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  /* Pointer to st
1ae0: 61 74 65 20 77 68 69 63 68 20 63 6f 6e 74 61 69  ate which contai
1af0: 6e 73 20 74 68 69 73 20 2a 2f 0a 20 20 65 6e 75  ns this */.  enu
1b00: 6d 20 7b 0a 20 20 20 20 43 4f 4d 50 4c 45 54 45  m {.    COMPLETE
1b10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1b20: 2a 20 54 68 65 20 73 74 61 74 75 73 20 69 73 20  * The status is 
1b30: 75 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c  used during foll
1b40: 6f 77 73 65 74 20 61 6e 64 20 2a 2f 0a 20 20 20  owset and */.   
1b50: 20 49 4e 43 4f 4d 50 4c 45 54 45 20 20 20 20 20   INCOMPLETE     
1b60: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 73 68          /*    sh
1b70: 69 66 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 73  ift computations
1b80: 20 2a 2f 0a 20 20 7d 20 73 74 61 74 75 73 3b 0a   */.  } status;.
1b90: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
1ba0: 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65  *next;     /* Ne
1bb0: 78 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  xt configuration
1bc0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f   in the state */
1bd0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
1be0: 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *bp;       /* T
1bf0: 68 65 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f  he next basis co
1c00: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d  nfiguration */.}
1c10: 3b 0a 0a 2f 2a 20 45 76 65 72 79 20 73 68 69 66  ;../* Every shif
1c20: 74 20 6f 72 20 72 65 64 75 63 65 20 6f 70 65 72  t or reduce oper
1c30: 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20  ation is stored 
1c40: 61 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  as one of the fo
1c50: 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 72 75 63  llowing */.struc
1c60: 74 20 61 63 74 69 6f 6e 20 7b 0a 20 20 73 74 72  t action {.  str
1c70: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20  uct symbol *sp; 
1c80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
1c90: 6b 2d 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 2a  k-ahead symbol *
1ca0: 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f  /.  enum e_actio
1cb0: 6e 20 7b 0a 20 20 20 20 53 48 49 46 54 2c 0a 20  n {.    SHIFT,. 
1cc0: 20 20 20 41 43 43 45 50 54 2c 0a 20 20 20 20 52     ACCEPT,.    R
1cd0: 45 44 55 43 45 2c 0a 20 20 20 20 45 52 52 4f 52  EDUCE,.    ERROR
1ce0: 2c 0a 20 20 20 20 43 4f 4e 46 4c 49 43 54 2c 20  ,.    CONFLICT, 
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d00: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
1d10: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
1d20: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 53 48  nflict */.    SH
1d30: 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20  _RESOLVED,      
1d40: 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20         /* Was a 
1d50: 73 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e  shift.  Preceden
1d60: 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66  ce resolved conf
1d70: 6c 69 63 74 20 2a 2f 0a 20 20 20 20 52 44 5f 52  lict */.    RD_R
1d80: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
1d90: 20 20 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75       /* Was redu
1da0: 63 65 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20  ce.  Precedence 
1db0: 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63  resolved conflic
1dc0: 74 20 2a 2f 0a 20 20 20 20 4e 4f 54 5f 55 53 45  t */.    NOT_USE
1dd0: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
1de0: 20 20 2f 2a 20 44 65 6c 65 74 65 64 20 62 79 20    /* Deleted by 
1df0: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  compression */. 
1e00: 20 7d 20 74 79 70 65 3b 0a 20 20 75 6e 69 6f 6e   } type;.  union
1e10: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74   {.    struct st
1e20: 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a  ate *stp;     /*
1e30: 20 54 68 65 20 6e 65 77 20 73 74 61 74 65 2c 20   The new state, 
1e40: 69 66 20 61 20 73 68 69 66 74 20 2a 2f 0a 20 20  if a shift */.  
1e50: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1e60: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
1e70: 72 75 6c 65 2c 20 69 66 20 61 20 72 65 64 75 63  rule, if a reduc
1e80: 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20 20 73 74  e */.  } x;.  st
1e90: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78  ruct action *nex
1ea0: 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61  t;     /* Next a
1eb0: 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 73  ction for this s
1ec0: 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  tate */.  struct
1ed0: 20 61 63 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65   action *collide
1ee0: 3b 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f  ;  /* Next actio
1ef0: 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
1f00: 68 61 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45  hash */.};../* E
1f10: 61 63 68 20 73 74 61 74 65 20 6f 66 20 74 68 65  ach state of the
1f20: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
1f30: 72 27 73 20 66 69 6e 69 74 65 20 73 74 61 74 65  r's finite state
1f40: 20 6d 61 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65   machine.** is e
1f50: 6e 63 6f 64 65 64 20 61 73 20 61 6e 20 69 6e 73  ncoded as an ins
1f60: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1f70: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1f80: 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
1f90: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  e {.  struct con
1fa0: 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f  fig *bp;       /
1fb0: 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66  * The basis conf
1fc0: 69 67 75 72 61 74 69 6f 6e 73 20 66 6f 72 20 74  igurations for t
1fd0: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
1fe0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
1ff0: 70 3b 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63  p;      /* All c
2000: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 69 6e  onfigurations in
2010: 20 74 68 69 73 20 73 65 74 20 2a 2f 0a 20 20 69   this set */.  i
2020: 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20  nt index;       
2030: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65          /* Seque
2040: 6e 63 69 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72  ncial number for
2050: 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20   this state */. 
2060: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
2070: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ap;       /* Arr
2080: 61 79 20 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f  ay of actions fo
2090: 72 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a  r this state */.
20a0: 20 20 69 6e 74 20 6e 54 6b 6e 41 63 74 2c 20 6e    int nTknAct, n
20b0: 4e 74 41 63 74 3b 20 20 20 20 20 2f 2a 20 4e 75  NtAct;     /* Nu
20c0: 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
20d0: 6f 6e 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  on terminals and
20e0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 2a 2f   nonterminals */
20f0: 0a 20 20 69 6e 74 20 69 54 6b 6e 4f 66 73 74 2c  .  int iTknOfst,
2100: 20 69 4e 74 4f 66 73 74 3b 20 20 20 2f 2a 20 79   iNtOfst;   /* y
2110: 79 5f 61 63 74 69 6f 6e 5b 5d 20 6f 66 66 73 65  y_action[] offse
2120: 74 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 73 20  t for terminals 
2130: 61 6e 64 20 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a  and nonterms */.
2140: 20 20 69 6e 74 20 69 44 66 6c 74 3b 20 20 20 20    int iDflt;    
2150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
2160: 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 2a 2f 0a  fault action */.
2170: 7d 3b 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46  };.#define NO_OF
2180: 46 53 45 54 20 28 2d 32 31 34 37 34 38 33 36 34  FSET (-214748364
2190: 37 29 0a 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73  7)../* A follows
21a0: 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  et propagation l
21b0: 69 6e 6b 20 69 6e 64 69 63 61 74 65 73 20 74 68  ink indicates th
21c0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
21d0: 6f 66 20 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67  of one.** config
21e0: 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65  uration followse
21f0: 74 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 70  t should be prop
2200: 61 67 61 74 65 64 20 74 6f 20 61 6e 6f 74 68 65  agated to anothe
2210: 72 20 77 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68  r whenever.** th
2220: 65 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 2e  e first changes.
2230: 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b   */.struct plink
2240: 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
2250: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
2260: 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   The configurati
2270: 6f 6e 20 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b  on to which link
2280: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70  ed */.  struct p
2290: 6c 69 6e 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20  link *next;     
22a0: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 72 6f   /* The next pro
22b0: 70 61 67 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d  pagate link */.}
22c0: 3b 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20  ;../* The state 
22d0: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 65  vector for the e
22e0: 6e 74 69 72 65 20 70 61 72 73 65 72 20 67 65 6e  ntire parser gen
22f0: 65 72 61 74 6f 72 20 69 73 20 72 65 63 6f 72 64  erator is record
2300: 65 64 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  ed as.** follows
2310: 2e 20 20 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e  .  (LEMON uses n
2320: 6f 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  o global variabl
2330: 65 73 20 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74  es and makes lit
2340: 74 6c 65 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74  tle use of.** st
2350: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 2e 20  atic variables. 
2360: 20 46 69 65 6c 64 73 20 69 6e 20 74 68 65 20 66   Fields in the f
2370: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2380: 72 65 20 63 61 6e 20 62 65 20 74 68 6f 75 67 68  re can be though
2390: 74 0a 2a 2a 20 6f 66 20 61 73 20 62 65 67 69 6e  t.** of as begin
23a0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
23b0: 73 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d  s in the program
23c0: 2e 29 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d  .) */.struct lem
23d0: 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  on {.  struct st
23e0: 61 74 65 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20  ate **sorted;   
23f0: 2f 2a 20 54 61 62 6c 65 20 6f 66 20 73 74 61 74  /* Table of stat
2400: 65 73 20 73 6f 72 74 65 64 20 62 79 20 73 74 61  es sorted by sta
2410: 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  te number */.  s
2420: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65  truct rule *rule
2430: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
2440: 6f 66 20 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a  of all rules */.
2450: 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20 20    int nstate;   
2460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2470: 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20 2a  mber of states *
2480: 2f 0a 20 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20  /.  int nrule;  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a0: 4e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20  Number of rules 
24b0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c  */.  int nsymbol
24c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24d0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 69   Number of termi
24e0: 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69  nal and nontermi
24f0: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  nal symbols */. 
2500: 20 69 6e 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20   int nterminal; 
2510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2520: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
2530: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72  symbols */.  str
2540: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d  uct symbol **sym
2550: 62 6f 6c 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20  bols; /* Sorted 
2560: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
2570: 73 20 74 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  s to symbols */.
2580: 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
2590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25a0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a  mber of errors *
25b0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
25c0: 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20  l *errsym;   /* 
25d0: 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c  The error symbol
25e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65   */.  char *name
25f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2600: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 67 65  * Name of the ge
2610: 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a  nerated parser *
2620: 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 20 20  /.  char *arg;  
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2640: 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74  Declaration of t
2650: 68 65 20 33 74 68 20 61 72 67 75 6d 65 6e 74 20  he 3th argument 
2660: 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63  to parser */.  c
2670: 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70 65 3b 20  har *tokentype; 
2680: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
2690: 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  of terminal symb
26a0: 6f 6c 73 20 69 6e 20 74 68 65 20 70 61 72 73 65  ols in the parse
26b0: 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61  r stack */.  cha
26c0: 72 20 2a 76 61 72 74 79 70 65 3b 20 20 20 20 20  r *vartype;     
26d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 65 66        /* The def
26e0: 61 75 6c 74 20 74 79 70 65 20 6f 66 20 6e 6f 6e  ault type of non
26f0: 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  -terminal symbol
2700: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 61  s */.  char *sta
2710: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rt;             
2720: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
2730: 74 61 72 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20  tart symbol for 
2740: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
2750: 20 63 68 61 72 20 2a 73 74 61 63 6b 73 69 7a 65   char *stacksize
2760: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ;         /* Siz
2770: 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  e of the parser 
2780: 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20  stack */.  char 
2790: 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20 20 20 20  *include;       
27a0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70      /* Code to p
27b0: 75 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ut at the start 
27c0: 6f 66 20 74 68 65 20 43 20 66 69 6c 65 20 2a 2f  of the C file */
27d0: 0a 20 20 69 6e 74 20 20 69 6e 63 6c 75 64 65 6c  .  int  includel
27e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  n;          /* L
27f0: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  ine number for s
2800: 74 61 72 74 20 6f 66 20 69 6e 63 6c 75 64 65 20  tart of include 
2810: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
2820: 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  error;          
2830: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2840: 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65 72  ecute when an er
2850: 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  ror is seen */. 
2860: 20 69 6e 74 20 20 65 72 72 6f 72 6c 6e 3b 20 20   int  errorln;  
2870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
2880: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61  e number for sta
2890: 72 74 20 6f 66 20 65 72 72 6f 72 20 63 6f 64 65  rt of error code
28a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65 72   */.  char *over
28b0: 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f  flow;          /
28c0: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
28d0: 65 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76 65  e on a stack ove
28e0: 72 66 6c 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 20  rflow */.  int  
28f0: 6f 76 65 72 66 6c 6f 77 6c 6e 3b 20 20 20 20 20  overflowln;     
2900: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
2910: 65 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  er for start of 
2920: 6f 76 65 72 66 6c 6f 77 20 63 6f 64 65 20 2a 2f  overflow code */
2930: 0a 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65  .  char *failure
2940: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
2950: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
2960: 6e 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65  n parser failure
2970: 20 2a 2f 0a 20 20 69 6e 74 20 20 66 61 69 6c 75   */.  int  failu
2980: 72 65 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  reln;          /
2990: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
29a0: 72 20 73 74 61 72 74 20 6f 66 20 66 61 69 6c 75  r start of failu
29b0: 72 65 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  re code */.  cha
29c0: 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20  r *accept;      
29d0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
29e0: 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 74 68   execute when th
29f0: 65 20 70 61 72 73 65 72 20 65 78 63 65 70 74 73  e parser excepts
2a00: 20 2a 2f 0a 20 20 69 6e 74 20 20 61 63 63 65 70   */.  int  accep
2a10: 74 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  tln;           /
2a20: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
2a30: 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  r the start of a
2a40: 63 63 65 70 74 20 63 6f 64 65 20 2a 2f 0a 20 20  ccept code */.  
2a50: 63 68 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b  char *extracode;
2a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2a70: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2a80: 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20   generated file 
2a90: 2a 2f 0a 20 20 69 6e 74 20 20 65 78 74 72 61 63  */.  int  extrac
2aa0: 6f 64 65 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a  odeln;        /*
2ab0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
2ac0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2ad0: 65 20 65 78 74 72 61 20 63 6f 64 65 20 2a 2f 0a  e extra code */.
2ae0: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65 73    char *tokendes
2af0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  t;         /* Co
2b00: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74 6f  de to execute to
2b10: 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20 64   destroy token d
2b20: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 20 74 6f  ata */.  int  to
2b30: 6b 65 6e 64 65 73 74 6c 6e 3b 20 20 20 20 20 20  kendestln;      
2b40: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
2b50: 20 66 6f 72 20 74 6f 6b 65 6e 20 64 65 73 74 72   for token destr
2b60: 6f 79 65 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  oyer code */.  c
2b70: 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20 20  har *vardest;   
2b80: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2b90: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
2ba0: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73  non-terminal des
2bb0: 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  tructor */.  int
2bc0: 20 20 76 61 72 64 65 73 74 6c 6e 3b 20 20 20 20    vardestln;    
2bd0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
2be0: 6d 62 65 72 20 66 6f 72 20 64 65 66 61 75 6c 74  mber for default
2bf0: 20 6e 6f 6e 2d 74 65 72 6d 20 64 65 73 74 72 75   non-term destru
2c00: 63 74 6f 72 20 63 6f 64 65 2a 2f 0a 20 20 63 68  ctor code*/.  ch
2c10: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
2c20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2c30: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
2c40: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e   */.  char *outn
2c50: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
2c60: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  * Name of the cu
2c70: 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c  rrent output fil
2c80: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
2c90: 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20  enprefix;       
2ca0: 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65  /* A prefix adde
2cb0: 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73  d to token names
2cc0: 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20   in the .h file 
2cd0: 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69  */.  int nconfli
2ce0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct;           /*
2cf0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69   Number of parsi
2d00: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ng conflicts */.
2d10: 20 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b    int tablesize;
2d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2d30: 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 20  ze of the parse 
2d40: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  tables */.  int 
2d50: 62 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20  basisflag;      
2d60: 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e       /* Print on
2d70: 6c 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  ly basis configu
2d80: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
2d90: 20 68 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20   has_fallback;  
2da0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2db0: 20 61 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69   any %fallback i
2dc0: 73 20 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72  s seen in the gr
2dd0: 61 6d 6d 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  ammer */.  char 
2de0: 2a 61 72 67 76 30 3b 20 20 20 20 20 20 20 20 20  *argv0;         
2df0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2e00: 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b  he program */.};
2e10: 0a 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79  ..#define Memory
2e20: 43 68 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d  Check(X) if((X)=
2e30: 3d 30 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20  =0){ \.  extern 
2e40: 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
2e50: 72 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f  r(); \.  memory_
2e60: 65 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a  error(); \.}../*
2e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2e80: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
2e90: 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.h" ********
2ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
2ec0: 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69   All code in thi
2ed0: 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  s file has been 
2ee0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
2ef0: 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  nerated.** from 
2f00: 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  a specification 
2f10: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62              "tab
2f30: 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20  le.q".** by the 
2f40: 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
2f50: 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20  y code building 
2f60: 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e  program "aagen".
2f70: 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20  .** Do not edit 
2f80: 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74  this file!  Inst
2f90: 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70  ead, edit the sp
2fa0: 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66  ecification.** f
2fb0: 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20  ile, then rerun 
2fc0: 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  aagen..*/./*.** 
2fd0: 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73  Code for process
2fe0: 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ing tables in th
2ff0: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
3000: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
3010: 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61   Routines for ha
3020: 6e 64 6c 69 6e 67 20 61 20 73 74 72 69 6e 67 73  ndling a strings
3030: 20 2a 2f 0a 0a 63 68 61 72 20 2a 53 74 72 73 61   */..char *Strsa
3040: 66 65 28 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73  fe();..void Strs
3050: 61 66 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  afe_init(/* void
3060: 20 2a 2f 29 3b 0a 69 6e 74 20 53 74 72 73 61 66   */);.int Strsaf
3070: 65 5f 69 6e 73 65 72 74 28 2f 2a 20 63 68 61 72  e_insert(/* char
3080: 20 2a 20 2a 2f 29 3b 0a 63 68 61 72 20 2a 53 74   * */);.char *St
3090: 72 73 61 66 65 5f 66 69 6e 64 28 2f 2a 20 63 68  rsafe_find(/* ch
30a0: 61 72 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f  ar * */);../* Ro
30b0: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
30c0: 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74  ing symbols of t
30d0: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73  he grammar */..s
30e0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
30f0: 6d 62 6f 6c 5f 6e 65 77 28 29 3b 0a 69 6e 74 20  mbol_new();.int 
3100: 53 79 6d 62 6f 6c 63 6d 70 70 28 2f 2a 20 73 74  Symbolcmpp(/* st
3110: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 2c 20  ruct symbol **, 
3120: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3130: 20 2a 2f 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f   */);.void Symbo
3140: 6c 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a  l_init(/* void *
3150: 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69  /);.int Symbol_i
3160: 6e 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74 20  nsert(/* struct 
3170: 73 79 6d 62 6f 6c 20 2a 2c 20 63 68 61 72 20 2a  symbol *, char *
3180: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 79 6d   */);.struct sym
3190: 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
31a0: 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a  (/* char * */);.
31b0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
31c0: 79 6d 62 6f 6c 5f 4e 74 68 28 2f 2a 20 69 6e 74  ymbol_Nth(/* int
31d0: 20 2a 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c   */);.int Symbol
31e0: 5f 63 6f 75 6e 74 28 2f 2a 20 20 2a 2f 29 3b 0a  _count(/*  */);.
31f0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3200: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 2f  Symbol_arrayof(/
3210: 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74  *  */);../* Rout
3220: 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67 65 20 74  ines to manage t
3230: 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a  he state table *
3240: 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70  /..int Configcmp
3250: 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69  (/* struct confi
3260: 67 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  g *, struct conf
3270: 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ig * */);.struct
3280: 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65   state *State_ne
3290: 77 28 29 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f  w();.void State_
32a0: 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  init(/* void */)
32b0: 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  ;.int State_inse
32c0: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 73 74 61  rt(/* struct sta
32d0: 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e  te *, struct con
32e0: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
32f0: 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66  t state *State_f
3300: 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63 6f  ind(/* struct co
3310: 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75  nfig * */);.stru
3320: 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65  ct state **State
3330: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
3340: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75  ;../* Routines u
3350: 73 65 64 20 66 6f 72 20 65 66 66 69 63 69 65 6e  sed for efficien
3360: 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74  cy in Configlist
3370: 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f  _add */..void Co
3380: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 2f  nfigtable_init(/
3390: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
33a0: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65  Configtable_inse
33b0: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e  rt(/* struct con
33c0: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
33d0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
33e0: 74 61 62 6c 65 5f 66 69 6e 64 28 2f 2a 20 73 74  table_find(/* st
33f0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f  ruct config * */
3400: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  );.void Configta
3410: 62 6c 65 5f 63 6c 65 61 72 28 2f 2a 20 69 6e 74  ble_clear(/* int
3420: 28 2a 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69  (*)(struct confi
3430: 67 20 2a 29 20 2a 2f 29 3b 0a 2f 2a 2a 2a 2a 2a  g *) */);./*****
3440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
3450: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61 63 74  om the file "act
3460: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
3470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3480: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
3490: 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
34a0: 67 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73  g parser actions
34b0: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
34c0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
34d0: 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  */../* Allocate 
34e0: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
34f0: 69 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 61 63  ion */.struct ac
3500: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77  tion *Action_new
3510: 28 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  (){.  static str
3520: 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65 65  uct action *free
3530: 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  list = 0;.  stru
3540: 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a  ct action *new;.
3550: 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d  .  if( freelist=
3560: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
3570: 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31  .    int amt = 1
3580: 30 30 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74  00;.    freelist
3590: 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f   = (struct actio
35a0: 6e 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  n *)malloc( size
35b0: 6f 66 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  of(struct action
35c0: 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69 66 28  )*amt );.    if(
35d0: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
35e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
35f0: 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20  derr,"Unable to 
3600: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
3610: 66 6f 72 20 61 20 6e 65 77 20 70 61 72 73 65 72  for a new parser
3620: 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20   action.");.    
3630: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
3640: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3650: 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65  amt-1; i++) free
3660: 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26  list[i].next = &
3670: 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
3680: 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d     freelist[amt-
3690: 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  1].next = 0;.  }
36a0: 0a 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73  .  new = freelis
36b0: 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20  t;.  freelist = 
36c0: 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
36d0: 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a    return new;.}.
36e0: 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
36f0: 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  actions */.stati
3700: 63 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28  c int actioncmp(
3710: 61 70 31 2c 61 70 32 29 0a 73 74 72 75 63 74 20  ap1,ap2).struct 
3720: 61 63 74 69 6f 6e 20 2a 61 70 31 3b 0a 73 74 72  action *ap1;.str
3730: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 32 3b  uct action *ap2;
3740: 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  .{.  int rc;.  r
3750: 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64  c = ap1->sp->ind
3760: 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e  ex - ap2->sp->in
3770: 64 65 78 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  dex;.  if( rc==0
3780: 20 29 20 72 63 20 3d 20 28 69 6e 74 29 61 70 31   ) rc = (int)ap1
3790: 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61 70  ->type - (int)ap
37a0: 32 2d 3e 74 79 70 65 3b 0a 20 20 69 66 28 20 72  2->type;.  if( r
37b0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  c==0 ){.    asse
37c0: 72 74 28 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52  rt( ap1->type==R
37d0: 45 44 55 43 45 20 7c 7c 20 61 70 31 2d 3e 74 79  EDUCE || ap1->ty
37e0: 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20  pe==RD_RESOLVED 
37f0: 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d 3d 43 4f  || ap1->type==CO
3800: 4e 46 4c 49 43 54 29 3b 0a 20 20 20 20 61 73 73  NFLICT);.    ass
3810: 65 72 74 28 20 61 70 32 2d 3e 74 79 70 65 3d 3d  ert( ap2->type==
3820: 52 45 44 55 43 45 20 7c 7c 20 61 70 32 2d 3e 74  REDUCE || ap2->t
3830: 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44  ype==RD_RESOLVED
3840: 20 7c 7c 20 61 70 32 2d 3e 74 79 70 65 3d 3d 43   || ap2->type==C
3850: 4f 4e 46 4c 49 43 54 29 3b 0a 20 20 20 20 72 63  ONFLICT);.    rc
3860: 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e   = ap1->x.rp->in
3870: 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d  dex - ap2->x.rp-
3880: 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 72 65  >index;.  }.  re
3890: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53  turn rc;.}../* S
38a0: 6f 72 74 20 70 61 72 73 65 72 20 61 63 74 69 6f  ort parser actio
38b0: 6e 73 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74  ns */.struct act
38c0: 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74  ion *Action_sort
38d0: 28 61 70 29 0a 73 74 72 75 63 74 20 61 63 74 69  (ap).struct acti
38e0: 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20 61 70 20 3d  on *ap;.{.  ap =
38f0: 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20   (struct action 
3900: 2a 29 6d 73 6f 72 74 28 61 70 2c 26 61 70 2d 3e  *)msort(ap,&ap->
3910: 6e 65 78 74 2c 61 63 74 69 6f 6e 63 6d 70 29 3b  next,actioncmp);
3920: 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a  .  return ap;.}.
3930: 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64 64  .void Action_add
3940: 28 61 70 70 2c 74 79 70 65 2c 73 70 2c 61 72 67  (app,type,sp,arg
3950: 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ).struct action 
3960: 2a 2a 61 70 70 3b 0a 65 6e 75 6d 20 65 5f 61 63  **app;.enum e_ac
3970: 74 69 6f 6e 20 74 79 70 65 3b 0a 73 74 72 75 63  tion type;.struc
3980: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 63 68  t symbol *sp;.ch
3990: 61 72 20 2a 61 72 67 3b 0a 7b 0a 20 20 73 74 72  ar *arg;.{.  str
39a0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b  uct action *new;
39b0: 0a 20 20 6e 65 77 20 3d 20 41 63 74 69 6f 6e 5f  .  new = Action_
39c0: 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65  new();.  new->ne
39d0: 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70  xt = *app;.  *ap
39e0: 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e  p = new;.  new->
39f0: 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e  type = type;.  n
3a00: 65 77 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69  ew->sp = sp;.  i
3a10: 66 28 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29  f( type==SHIFT )
3a20: 7b 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 73 74 70  {.    new->x.stp
3a30: 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65   = (struct state
3a40: 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b   *)arg;.  }else{
3a50: 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 72 70 20 3d  .    new->x.rp =
3a60: 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29   (struct rule *)
3a70: 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a  arg;.  }.}./****
3a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a90: 2a 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f 20 69  ** New code to i
3aa0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 61 63  mplement the "ac
3ab0: 74 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a  ttab" module ***
3ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
3ad0: 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70 6c  This module impl
3ae0: 65 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65 73 20  ements routines 
3af0: 75 73 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  use to construct
3b00: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
3b10: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   table..*/../*.*
3b20: 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74  * The state of t
3b30: 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62  he yy_action tab
3b40: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
3b50: 63 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74  ction is an inst
3b60: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ance of.** the f
3b70: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
3b80: 72 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  re.*/.typedef st
3b90: 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74 74  ruct acttab actt
3ba0: 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61  ab;.struct actta
3bb0: 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f  b {.  int nActio
3bc0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3bd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3be0: 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41  used slots in aA
3bf0: 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ction[] */.  int
3c00: 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20   nActionAlloc;  
3c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f            /* Slo
3c20: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ts allocated for
3c30: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
3c40: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 69 6e 74  struct {.    int
3c50: 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20   lookahead;     
3c60: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
3c70: 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   of the lookahea
3c80: 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 69  d token */.    i
3c90: 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20 20  nt action;      
3ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74            /* Act
3cb0: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74  ion to take on t
3cc0: 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65  he given lookahe
3cd0: 61 64 20 2a 2f 0a 20 20 7d 20 2a 61 41 63 74 69  ad */.  } *aActi
3ce0: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
3cf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61       /* The yy_a
3d00: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e  ction[] table un
3d10: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
3d20: 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68   */.    *aLookah
3d30: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3d40: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e     /* A single n
3d50: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  ew transaction s
3d60: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f  et */.  int mnLo
3d70: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
3d80: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
3d90: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f  aLookahead[].loo
3da0: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
3db0: 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  mnAction;       
3dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69           /* Acti
3dd0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
3de0: 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a  th mnLookahead *
3df0: 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68  /.  int mxLookah
3e00: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3e10: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f   /* Maximum aLoo
3e20: 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65  kahead[].lookahe
3e30: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ad */.  int nLoo
3e40: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
3e50: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f       /* Used slo
3e60: 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64  ts in aLookahead
3e70: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  [] */.  int nLoo
3e80: 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20  kaheadAlloc;    
3e90: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c       /* Slots al
3ea0: 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b  located in aLook
3eb0: 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  ahead[] */.};../
3ec0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
3ed0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3ee0: 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  n the yy_action 
3ef0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
3f00: 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58 29 20   acttab_size(X) 
3f10: 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a  ((X)->nAction)..
3f20: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72  /* The value for
3f30: 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20   the N-th entry 
3f40: 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a  in yy_action */.
3f50: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
3f60: 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28  yaction(X,N)  ((
3f70: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61  X)->aAction[N].a
3f80: 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76  ction)../* The v
3f90: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74  alue for the N-t
3fa0: 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f  h entry in yy_lo
3fb0: 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69  okahead */.#defi
3fc0: 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b  ne acttab_yylook
3fd0: 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29  ahead(X,N)  ((X)
3fe0: 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f  ->aAction[N].loo
3ff0: 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65  kahead)../* Free
4000: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
4010: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
4020: 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a  given acttab */.
4030: 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72 65 65  void acttab_free
4040: 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66  (acttab *p){.  f
4050: 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20  ree( p->aAction 
4060: 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c  );.  free( p->aL
4070: 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72  ookahead );.  fr
4080: 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41  ee( p );.}../* A
4090: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63  llocate a new ac
40a0: 74 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a  ttab structure *
40b0: 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74 61 62  /.acttab *acttab
40c0: 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20  _alloc(void){.  
40d0: 61 63 74 74 61 62 20 2a 70 20 3d 20 6d 61 6c 6c  acttab *p = mall
40e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
40f0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
4100: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
4110: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
4120: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
4130: 72 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22  r a new acttab."
4140: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
4150: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
4160: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
4170: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
4180: 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63 74 69  * Add a new acti
4190: 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  on to the curren
41a0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
41b0: 74 0a 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62  t.*/.void acttab
41c0: 5f 61 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a  _action(acttab *
41d0: 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64  p, int lookahead
41e0: 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20  , int action){. 
41f0: 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65   if( p->nLookahe
4200: 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ad>=p->nLookahea
4210: 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d  dAlloc ){.    p-
4220: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63  >nLookaheadAlloc
4230: 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61   += 25;.    p->a
4240: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 72 65 61 6c  Lookahead = real
4250: 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  loc( p->aLookahe
4260: 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ad,.            
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b   sizeof(p->aLook
4290: 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f  ahead[0])*p->nLo
42a0: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a  okaheadAlloc );.
42b0: 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b      if( p->aLook
42c0: 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ahead==0 ){.    
42d0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
42e0: 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
42f0: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
4300: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
4310: 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  if( p->nLookahea
4320: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d  d==0 ){.    p->m
4330: 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  xLookahead = loo
4340: 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d  kahead;.    p->m
4350: 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  nLookahead = loo
4360: 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d  kahead;.    p->m
4370: 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e  nAction = action
4380: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
4390: 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61  f( p->mxLookahea
43a0: 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d  d<lookahead ) p-
43b0: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mxLookahead = l
43c0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66  ookahead;.    if
43d0: 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  ( p->mnLookahead
43e0: 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20  >lookahead ){.  
43f0: 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65      p->mnLookahe
4400: 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a  ad = lookahead;.
4410: 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f        p->mnActio
4420: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  n = action;.    
4430: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b  }.  }.  p->aLook
4440: 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68  ahead[p->nLookah
4450: 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d  ead].lookahead =
4460: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d   lookahead;.  p-
4470: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e  >aLookahead[p->n
4480: 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f  Lookahead].actio
4490: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d  n = action;.  p-
44a0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d  >nLookahead++;.}
44b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  ../*.** Add the 
44c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20  transaction set 
44d0: 62 75 69 6c 74 20 75 70 20 77 69 74 68 20 70 72  built up with pr
44e0: 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ior calls to act
44f0: 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20  tab_action().** 
4500: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
4510: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20   action table.  
4520: 54 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 74  Then reset the t
4530: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62  ransaction set b
4540: 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70  ack.** to an emp
4550: 74 79 20 73 65 74 20 69 6e 20 70 72 65 70 61 72  ty set in prepar
4560: 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20  ation for a new 
4570: 72 6f 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f  round of acttab_
4580: 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a  action() calls..
4590: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
45a0: 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   offset into the
45b0: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66   action table of
45c0: 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63   the new transac
45d0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74  tion..*/.int act
45e0: 74 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61  tab_insert(actta
45f0: 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  b *p){.  int i, 
4600: 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72  j, k, n;.  asser
4610: 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  t( p->nLookahead
4620: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  >0 );..  /* Make
4630: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 65 6e   sure we have en
4640: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f  ough space to ho
4650: 6c 64 20 74 68 65 20 65 78 70 61 6e 64 65 64 20  ld the expanded 
4660: 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a  action table.  *
4670: 2a 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63  * in the worst c
4680: 61 73 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20  ase.  The worst 
4690: 63 61 73 65 20 6f 63 63 75 72 73 20 69 66 20 74  case occurs if t
46a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
46b0: 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  et.  ** must be 
46c0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
46d0: 63 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74  current action t
46e0: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20  able.  */.  n = 
46f0: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mxLookahead +
4700: 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63   1;.  if( p->nAc
4710: 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e  tion + n >= p->n
4720: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ActionAlloc ){. 
4730: 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20     int oldAlloc 
4740: 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  = p->nActionAllo
4750: 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f  c;.    p->nActio
4760: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74  nAlloc = p->nAct
4770: 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63  ion + n + p->nAc
4780: 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a  tionAlloc + 20;.
4790: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d      p->aAction =
47a0: 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63   realloc( p->aAc
47b0: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f  sizeof(p->aActio
47e0: 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e  n[0])*p->nAction
47f0: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20  Alloc);.    if( 
4800: 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b  p->aAction==0 ){
4810: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
4820: 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61  tderr,"malloc fa
4830: 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20  iled\n");.      
4840: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
4850: 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f     for(i=oldAllo
4860: 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41  c; i<p->nActionA
4870: 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lloc; i++){.    
4880: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e    p->aAction[i].
4890: 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a  lookahead = -1;.
48a0: 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e        p->aAction
48b0: 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b  [i].action = -1;
48c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
48d0: 20 53 63 61 6e 20 74 68 65 20 65 78 69 73 74 69   Scan the existi
48e0: 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  ng action table 
48f0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f  looking for an o
4900: 66 66 73 65 74 20 77 68 65 72 65 20 77 65 20 63  ffset where we c
4910: 61 6e 0a 20 20 2a 2a 20 69 6e 73 65 72 74 20 74  an.  ** insert t
4920: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
4930: 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c  action set.  Fal
4940: 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  l out of the loo
4950: 70 20 77 68 65 6e 20 74 68 61 74 0a 20 20 2a 2a  p when that.  **
4960: 20 6f 66 66 73 65 74 20 69 73 20 66 6f 75 6e 64   offset is found
4970: 2e 20 20 49 6e 20 74 68 65 20 77 6f 72 73 74 20  .  In the worst 
4980: 63 61 73 65 2c 20 77 65 20 66 61 6c 6c 20 6f 75  case, we fall ou
4990: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68  t of the loop wh
49a0: 65 6e 0a 20 20 2a 2a 20 69 20 72 65 61 63 68 65  en.  ** i reache
49b0: 73 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77 68  s p->nAction, wh
49c0: 69 63 68 20 6d 65 61 6e 73 20 77 65 20 61 70 70  ich means we app
49d0: 65 6e 64 20 74 68 65 20 6e 65 77 20 74 72 61 6e  end the new tran
49e0: 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a 20 20 2a  saction set..  *
49f0: 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20  *.  ** i is the 
4a00: 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63 74  index in p->aAct
4a10: 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d  ion[] where p->m
4a20: 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69 6e  nLookahead is in
4a30: 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66  serted..  */.  f
4a40: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63  or(i=0; i<p->nAc
4a50: 74 69 6f 6e 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68  tion+p->mnLookah
4a60: 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ead; i++){.    i
4a70: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
4a80: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a  .lookahead<0 ){.
4a90: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4aa0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
4ab0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
4ac0: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
4ad0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
4ae0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
4af0: 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  i;.        if( k
4b00: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
4b10: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
4b20: 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e  on[k].lookahead>
4b30: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
4b40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c    }.      if( j<
4b50: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20  p->nLookahead ) 
4b60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
4b70: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41  for(j=0; j<p->nA
4b80: 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ction; j++){.   
4b90: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
4ba0: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
4bb0: 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ==j+p->mnLookahe
4bc0: 61 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  ad-i ) break;.  
4bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4be0: 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b  j==p->nAction ){
4bf0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20  .        break; 
4c00: 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d 70 74   /* Fits in empt
4c10: 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20  y slots */.     
4c20: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
4c30: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
4c40: 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c  ookahead==p->mnL
4c50: 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20  ookahead ){.    
4c60: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
4c70: 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d  [i].action!=p->m
4c80: 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e 74 69 6e  nAction ) contin
4c90: 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ue;.      for(j=
4ca0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
4cb0: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ad; j++){.      
4cc0: 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68    k = p->aLookah
4cd0: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
4ce0: 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61   - p->mnLookahea
4cf0: 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69  d + i;.        i
4d00: 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e  f( k<0 || k>=p->
4d10: 6e 41 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b  nAction ) break;
4d20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
4d30: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
4d40: 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61 41 63 74  okahead!=p->aAct
4d50: 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[k].lookahead
4d60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4d70: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
4d80: 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70  ead[j].action!=p
4d90: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74  ->aAction[k].act
4da0: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
4db0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
4dc0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
4dd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
4de0: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f   n = 0;.      fo
4df0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74  r(j=0; j<p->nAct
4e00: 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ion; j++){.     
4e10: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
4e20: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30  n[j].lookahead<0
4e30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4e40: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
4e50: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
4e60: 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ==j+p->mnLookahe
4e70: 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  ad-i ) n++;.    
4e80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d    }.      if( n=
4e90: 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  =p->nLookahead )
4ea0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
4eb0: 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 61 20 70    /* Same as a p
4ec0: 72 69 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rior transaction
4ed0: 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a   set */.      }.
4ee0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49      }.  }.  /* I
4ef0: 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74 69 6f  nsert transactio
4f00: 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78 20 69  n set at index i
4f10: 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  . */.  for(j=0; 
4f20: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b  j<p->nLookahead;
4f30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70   j++){.    k = p
4f40: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
4f50: 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d  lookahead - p->m
4f60: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a  nLookahead + i;.
4f70: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b      p->aAction[k
4f80: 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  ] = p->aLookahea
4f90: 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e  d[j];.    if( k>
4fa0: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d  =p->nAction ) p-
4fb0: 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a  >nAction = k+1;.
4fc0: 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68    }.  p->nLookah
4fd0: 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52  ead = 0;..  /* R
4fe0: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
4ff0: 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20 74   that is added t
5000: 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  o the lookahead 
5010: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
5020: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  the.  ** index i
5030: 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66  nto yy_action of
5040: 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20   the action */. 
5050: 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d   return i - p->m
5060: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f  nLookahead;.}../
5070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5080: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
5090: 66 69 6c 65 20 22 61 73 73 65 72 74 2e 63 22 20  file "assert.c" 
50a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
50c0: 0a 2a 2a 20 41 20 6d 6f 72 65 20 65 66 66 69 63  .** A more effic
50d0: 69 65 6e 74 20 77 61 79 20 6f 66 20 68 61 6e 64  ient way of hand
50e0: 6c 69 6e 67 20 61 73 73 65 72 74 69 6f 6e 73 2e  ling assertions.
50f0: 0a 2a 2f 0a 76 6f 69 64 20 6d 79 61 73 73 65 72  .*/.void myasser
5100: 74 28 66 69 6c 65 2c 6c 69 6e 65 29 0a 63 68 61  t(file,line).cha
5110: 72 20 2a 66 69 6c 65 3b 0a 69 6e 74 20 6c 69 6e  r *file;.int lin
5120: 65 3b 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 73  e;.{.  fprintf(s
5130: 74 64 65 72 72 2c 22 41 73 73 65 72 74 69 6f 6e  tderr,"Assertion
5140: 20 66 61 69 6c 65 64 20 6f 6e 20 6c 69 6e 65 20   failed on line 
5150: 25 64 20 6f 66 20 66 69 6c 65 20 5c 22 25 73 5c  %d of file \"%s\
5160: 22 5c 6e 22 2c 6c 69 6e 65 2c 66 69 6c 65 29 3b  "\n",line,file);
5170: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 2f 2a  .  exit(1);.}./*
5180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5190: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
51a0: 69 6c 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a  ile "build.c" **
51b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
51d0: 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63  ** Routines to c
51e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20  onstruction the 
51f0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
5200: 68 69 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d  hine for the LEM
5210: 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e  ON.** parser gen
5220: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46  erator..*/../* F
5230: 69 6e 64 20 61 20 70 72 65 63 65 64 65 6e 63 65  ind a precedence
5240: 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79   symbol of every
5250: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61   rule in the gra
5260: 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f  mmar..** .** Tho
5270: 73 65 20 72 75 6c 65 73 20 77 68 69 63 68 20 68  se rules which h
5280: 61 76 65 20 61 20 70 72 65 63 65 64 65 6e 63 65  ave a precedence
5290: 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e   symbol coded in
52a0: 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72   the input.** gr
52b0: 61 6d 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20  ammar using the 
52c0: 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74  "[symbol]" const
52d0: 72 75 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64  ruct will alread
52e0: 79 20 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70  y have the.** rp
52f0: 2d 3e 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20  ->precsym field 
5300: 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72  filled.  Other r
5310: 75 6c 65 73 20 74 61 6b 65 20 61 73 20 74 68 65  ules take as the
5320: 69 72 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a  ir precedence.**
5330: 20 73 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73   symbol the firs
5340: 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74  t RHS symbol wit
5350: 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63  h a defined prec
5360: 65 64 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72  edence.  If ther
5370: 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53  e.** are not RHS
5380: 20 73 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20   symbols with a 
5390: 64 65 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e  defined preceden
53a0: 63 65 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e  ce, the preceden
53b0: 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65  ce.** symbol fie
53c0: 6c 64 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b  ld is left blank
53d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75  ..*/.void FindRu
53e0: 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28 78 70  lePrecedences(xp
53f0: 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
5400: 78 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  xp;.{.  struct r
5410: 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72  ule *rp;.  for(r
5420: 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  p=xp->rule; rp; 
5430: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
5440: 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79    if( rp->precsy
5450: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  m==0 ){.      in
5460: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
5470: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
5480: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
5490: 28 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 70 72  ( rp->rhs[i]->pr
54a0: 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ec>=0 ){.       
54b0: 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d     rp->precsym =
54c0: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
54d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d         break;..}
54e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
54f0: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
5500: 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74  /* Find all nont
5510: 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 77  erminals which w
5520: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65  ill generate the
5530: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a   empty string..*
5540: 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b 20 61  * Then go back a
5550: 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65 20 66  nd compute the f
5560: 69 72 73 74 20 73 65 74 73 20 6f 66 20 65 76 65  irst sets of eve
5570: 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a  ry nonterminal..
5580: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73 65 74  ** The first set
5590: 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20 61   is the set of a
55a0: 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  ll terminal symb
55b0: 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 62 65  ols which can be
55c0: 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20  gin.** a string 
55d0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 61  generated by tha
55e0: 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a  t nonterminal..*
55f0: 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74  /.void FindFirst
5600: 53 65 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  Sets(lemp).struc
5610: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
5620: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
5630: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69  ct rule *rp;.  i
5640: 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20  nt progress;..  
5650: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
5660: 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
5670: 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c      lemp->symbol
5680: 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 42  s[i]->lambda = B
5690: 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f  _FALSE;.  }.  fo
56a0: 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  r(i=lemp->ntermi
56b0: 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  nal; i<lemp->nsy
56c0: 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
56d0: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
56e0: 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53 65 74  ->firstset = Set
56f0: 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  New();.  }..  /*
5700: 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65 20 61   First compute a
5710: 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20  ll lambdas */.  
5720: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
5730: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70   = 0;.    for(rp
5740: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
5750: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
5760: 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
5770: 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74 69  ->lambda ) conti
5780: 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  nue;.      for(i
5790: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
57a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 69  i++){.         i
57b0: 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6c  f( rp->rhs[i]->l
57c0: 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29  ambda==B_FALSE )
57d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
57e0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d        if( i==rp-
57f0: 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  >nrhs ){.       
5800: 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61   rp->lhs->lambda
5810: 20 3d 20 42 5f 54 52 55 45 3b 0a 20 20 20 20 20   = B_TRUE;.     
5820: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
5830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5840: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
5850: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
5860: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
5870: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
5880: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
5890: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
58a0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
58b0: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
58c0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
58d0: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
58e0: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
58f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
5900: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
5910: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
5920: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
5930: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
5940: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
5950: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
5960: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
5970: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
5980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65        break;..}e
5990: 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29  lse if( s1==s2 )
59a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
59b0: 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41  s1->lambda==B_FA
59c0: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65  LSE ) break;..}e
59d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
59e0: 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 55 6e  rogress += SetUn
59f0: 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73 65 74  ion(s1->firstset
5a00: 2c 73 32 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a  ,s2->firstset);.
5a10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 32            if( s2
5a20: 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53  ->lambda==B_FALS
5a30: 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20  E ) break;..}.  
5a40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
5a50: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
5a60: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
5a70: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
5a80: 28 30 29 20 73 74 61 74 65 73 20 66 6f 72 20 74  (0) states for t
5a90: 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e  he grammar.  Lin
5aa0: 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20  ks.** are added 
5ab0: 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d 65 20  to between some 
5ac0: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 74  states so that t
5ad0: 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20  he LR(1) follow 
5ae0: 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  sets.** can be c
5af0: 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a  omputed later..*
5b00: 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74  /.PRIVATE struct
5b10: 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65   state *getstate
5b20: 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (/* struct lemon
5b30: 20 2a 20 2a 2f 29 3b 20 20 2f 2a 20 66 6f 72 77   * */);  /* forw
5b40: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5b50: 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73  .void FindStates
5b60: 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
5b70: 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73  mon *lemp;.{.  s
5b80: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
5b90: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
5ba0: 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69  *rp;..  Configli
5bb0: 73 74 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a  st_init();..  /*
5bc0: 20 46 69 6e 64 20 74 68 65 20 73 74 61 72 74 20   Find the start 
5bd0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20  symbol */.  if( 
5be0: 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20  lemp->start ){. 
5bf0: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66     sp = Symbol_f
5c00: 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29  ind(lemp->start)
5c10: 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
5c20: 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73  ){.      ErrorMs
5c30: 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
5c40: 2c 30 2c 0a 22 54 68 65 20 73 70 65 63 69 66 69  ,0,."The specifi
5c50: 65 64 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  ed start symbol 
5c60: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a  \"%s\" is not \.
5c70: 69 6e 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  in a nonterminal
5c80: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e   of the grammar.
5c90: 20 20 5c 22 25 73 5c 22 20 77 69 6c 6c 20 62 65    \"%s\" will be
5ca0: 20 75 73 65 64 20 61 73 20 74 68 65 20 73 74 61   used as the sta
5cb0: 72 74 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74  rt \.symbol inst
5cc0: 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72  ead.",lemp->star
5cd0: 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  t,lemp->rule->lh
5ce0: 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
5cf0: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
5d00: 3b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d  ;.      sp = lem
5d10: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  p->rule->lhs;.  
5d20: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
5d30: 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65   sp = lemp->rule
5d40: 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ->lhs;.  }..  /*
5d50: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
5d60: 74 61 72 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73  tart symbol does
5d70: 6e 27 74 20 6f 63 63 75 72 20 6f 6e 20 74 68 65  n't occur on the
5d80: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
5d90: 20 6f 66 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c   of.  ** any rul
5da0: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
5db0: 72 6f 72 20 69 66 20 69 74 20 64 6f 65 73 2e 20  ror if it does. 
5dc0: 20 28 59 41 43 43 20 77 6f 75 6c 64 20 67 65 6e   (YACC would gen
5dd0: 65 72 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  erate a new.  **
5de0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e   start symbol in
5df0: 20 74 68 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a   this case.) */.
5e00: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
5e10: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
5e20: 6e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  next){.    int i
5e30: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5e40: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
5e50: 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72  .      if( rp->r
5e60: 68 73 5b 69 5d 3d 3d 73 70 20 29 7b 0a 20 20 20  hs[i]==sp ){.   
5e70: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
5e80: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
5e90: 22 54 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f  "The start symbo
5ea0: 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20  l \"%s\" occurs 
5eb0: 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68  on the \.right-h
5ec0: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 72 75  and side of a ru
5ed0: 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65  le. This will re
5ee0: 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72  sult in a parser
5ef0: 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f   which \.does no
5f00: 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e  t work properly.
5f10: 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ",sp->name);.   
5f20: 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
5f30: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
5f40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
5f50: 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  he basis configu
5f60: 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74  ration set for t
5f70: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 0a 20  he first state. 
5f80: 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73   ** is all rules
5f90: 20 77 68 69 63 68 20 68 61 76 65 20 74 68 65 20   which have the 
5fa0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20  start symbol as 
5fb0: 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d  their.  ** left-
5fc0: 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66  hand side */.  f
5fd0: 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20  or(rp=sp->rule; 
5fe0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c  rp; rp=rp->nextl
5ff0: 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  hs){.    struct 
6000: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a  config *newcfp;.
6010: 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e      newcfp = Con
6020: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
6030: 28 72 70 2c 30 29 3b 0a 20 20 20 20 53 65 74 41  (rp,0);.    SetA
6040: 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30  dd(newcfp->fws,0
6050: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
6060: 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73  pute the first s
6070: 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72  tate.  All other
6080: 20 73 74 61 74 65 73 20 77 69 6c 6c 20 62 65 0a   states will be.
6090: 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 61 75    ** computed au
60a0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 75 72 69  tomatically duri
60b0: 6e 67 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  ng the computati
60c0: 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
60d0: 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65  one..  ** The re
60e0: 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 74  turned pointer t
60f0: 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  o the first stat
6100: 65 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a  e is not used. *
6110: 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 73 74 61  /.  (void)getsta
6120: 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75  te(lemp);.  retu
6130: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  rn;.}../* Return
6140: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6150: 73 74 61 74 65 20 77 68 69 63 68 20 69 73 20 64  state which is d
6160: 65 73 63 72 69 62 65 64 20 62 79 20 74 68 65 20  escribed by the 
6170: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a  configuration.**
6180: 20 6c 69 73 74 20 77 68 69 63 68 20 68 61 73 20   list which has 
6190: 62 65 65 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20  been built from 
61a0: 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c  calls to Configl
61b0: 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56  ist_add..*/.PRIV
61c0: 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68  ATE void buildsh
61d0: 69 66 74 73 28 2f 2a 20 73 74 72 75 63 74 20 6c  ifts(/* struct l
61e0: 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73  emon *, struct s
61f0: 74 61 74 65 20 2a 20 2a 2f 29 3b 20 2f 2a 20 46  tate * */); /* F
6200: 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56  orwd ref */.PRIV
6210: 41 54 45 20 73 74 72 75 63 74 20 73 74 61 74 65  ATE struct state
6220: 20 2a 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29   *getstate(lemp)
6230: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
6240: 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp;.{.  struct 
6250: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 62 70  config *cfp, *bp
6260: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
6270: 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74   *stp;..  /* Ext
6280: 72 61 63 74 20 74 68 65 20 73 6f 72 74 65 64 20  ract the sorted 
6290: 62 61 73 69 73 20 6f 66 20 74 68 65 20 6e 65 77  basis of the new
62a0: 20 73 74 61 74 65 2e 20 20 54 68 65 20 62 61 73   state.  The bas
62b0: 69 73 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  is was construct
62c0: 65 64 0a 20 20 2a 2a 20 62 79 20 70 72 69 6f 72  ed.  ** by prior
62d0: 20 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69   calls to "Confi
62e0: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 29  glist_addbasis()
62f0: 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69  ". */.  Configli
6300: 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 3b 0a  st_sortbasis();.
6310: 20 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73    bp = Configlis
6320: 74 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a  t_basis();..  /*
6330: 20 47 65 74 20 61 20 73 74 61 74 65 20 77 69 74   Get a state wit
6340: 68 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73  h the same basis
6350: 20 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74 61 74   */.  stp = Stat
6360: 65 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20 69 66  e_find(bp);.  if
6370: 28 20 73 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( stp ){.    /* 
6380: 41 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65  A state with the
6390: 20 73 61 6d 65 20 62 61 73 69 73 20 61 6c 72 65   same basis alre
63a0: 61 64 79 20 65 78 69 73 74 73 21 20 20 43 6f 70  ady exists!  Cop
63b0: 79 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  y all the follow
63c0: 2d 73 65 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70  -set.    ** prop
63d0: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72  agation links fr
63e0: 6f 6d 20 74 68 65 20 73 74 61 74 65 20 75 6e 64  om the state und
63f0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
6400: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
6410: 70 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74  preexisting stat
6420: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  e, then return a
6430: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6440: 70 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74  preexisting stat
6450: 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
6460: 63 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20  config *x, *y;. 
6470: 20 20 20 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73     for(x=bp, y=s
6480: 74 70 2d 3e 62 70 3b 20 78 20 26 26 20 79 3b 20  tp->bp; x && y; 
6490: 78 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70  x=x->bp, y=y->bp
64a0: 29 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63  ){.      Plink_c
64b0: 6f 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e  opy(&y->bplp,x->
64c0: 62 70 6c 70 29 3b 0a 20 20 20 20 20 20 50 6c 69  bplp);.      Pli
64d0: 6e 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c  nk_delete(x->fpl
64e0: 70 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c  p);.      x->fpl
64f0: 70 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b  p = x->bplp = 0;
6500: 0a 20 20 20 20 7d 0a 20 20 20 20 63 66 70 20 3d  .    }.    cfp =
6510: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75   Configlist_retu
6520: 72 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67  rn();.    Config
6530: 6c 69 73 74 5f 65 61 74 28 63 66 70 29 3b 0a 20  list_eat(cfp);. 
6540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
6550: 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 20  his really is a 
6560: 6e 65 77 20 73 74 61 74 65 2e 20 20 43 6f 6e 73  new state.  Cons
6570: 74 72 75 63 74 20 61 6c 6c 20 74 68 65 20 64 65  truct all the de
6580: 74 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e  tails */.    Con
6590: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
65a0: 6c 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d  lemp);    /* Com
65b0: 70 75 74 65 20 74 68 65 20 63 6f 6e 66 69 67 75  pute the configu
65c0: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
65d0: 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  /.    Configlist
65e0: 5f 73 6f 72 74 28 29 3b 20 20 20 20 20 20 20 20  _sort();        
65f0: 20 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20 63     /* Sort the c
6600: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f  onfiguration clo
6610: 73 75 72 65 20 2a 2f 0a 20 20 20 20 63 66 70 20  sure */.    cfp 
6620: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74  = Configlist_ret
6630: 75 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65 74 20  urn();   /* Get 
6640: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6650: 20 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a   config list */.
6660: 20 20 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f      stp = State_
6670: 6e 65 77 28 29 3b 20 20 20 20 20 20 20 20 20 20  new();          
6680: 20 2f 2a 20 41 20 6e 65 77 20 73 74 61 74 65 20   /* A new state 
6690: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
66a0: 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 74 70   MemoryCheck(stp
66b0: 29 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70 20 3d  );.    stp->bp =
66c0: 20 62 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   bp;            
66d0: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
66e0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
66f0: 6e 20 62 61 73 69 73 20 2a 2f 0a 20 20 20 20 73  n basis */.    s
6700: 74 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b 20 20  tp->cfp = cfp;  
6710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6720: 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66  emember the conf
6730: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
6740: 65 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 69 6e  e */.    stp->in
6750: 64 65 78 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  dex = lemp->nsta
6760: 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73  te++; /* Every s
6770: 74 61 74 65 20 67 65 74 73 20 61 20 73 65 71 75  tate gets a sequ
6780: 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ence number */. 
6790: 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20     stp->ap = 0; 
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79  /* No actions, y
67c0: 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  et. */.    State
67d0: 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d  _insert(stp,stp-
67e0: 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74  >bp);   /* Add t
67f0: 6f 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  o the state tabl
6800: 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68  e */.    buildsh
6810: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20  ifts(lemp,stp); 
6820: 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69        /* Recursi
6830: 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63  vely compute suc
6840: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f  cessor states */
6850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74  .  }.  return st
6860: 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75  p;.}../* Constru
6870: 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72  ct all successor
6880: 20 73 74 61 74 65 73 20 74 6f 20 74 68 65 20 67   states to the g
6890: 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22  iven state.  A "
68a0: 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74  successor".** st
68b0: 61 74 65 20 69 73 20 61 6e 79 20 73 74 61 74 65  ate is any state
68c0: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 72 65   which can be re
68d0: 61 63 68 65 64 20 62 79 20 61 20 73 68 69 66 74  ached by a shift
68e0: 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56   action..*/.PRIV
68f0: 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68  ATE void buildsh
6900: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 0a 73  ifts(lemp,stp).s
6910: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
6920: 70 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  p;.struct state 
6930: 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  *stp;     /* The
6940: 20 73 74 61 74 65 20 66 72 6f 6d 20 77 68 69 63   state from whic
6950: 68 20 73 75 63 63 65 73 73 6f 72 73 20 61 72 65  h successors are
6960: 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 7b 0a 20   computed */.{. 
6970: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
6980: 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  cfp;  /* For loo
6990: 70 69 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f  ping thru the co
69a0: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
69b0: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
69c0: 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20  t config *bcfp; 
69d0: 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72  /* For the inner
69e0: 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20   loop on config 
69f0: 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22  closure of "stp"
6a00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
6a10: 66 69 67 20 2a 6e 65 77 3b 20 20 2f 2a 20 2a 2f  fig *new;  /* */
6a20: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
6a30: 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f   *sp;   /* Symbo
6a40: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
6a50: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
6a60: 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20  tion "cfp" */.  
6a70: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62  struct symbol *b
6a80: 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66  sp;  /* Symbol f
6a90: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74  ollowing the dot
6aa0: 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   in configuratio
6ab0: 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74  n "bcfp" */.  st
6ac0: 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73  ruct state *news
6ad0: 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  tp; /* A pointer
6ae0: 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20   to a successor 
6af0: 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45  state */..  /* E
6b00: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
6b10: 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65  n becomes comple
6b20: 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74  te after it cont
6b30: 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63 63  ibutes to a succ
6b40: 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  essor.  ** state
6b50: 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c  .  Initially, al
6b60: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  l configurations
6b70: 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20   are incomplete 
6b80: 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70  */.  for(cfp=stp
6b90: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
6ba0: 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e  cfp->next) cfp->
6bb0: 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c  status = INCOMPL
6bc0: 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  ETE;..  /* Loop 
6bd0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66  through all conf
6be0: 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  igurations of th
6bf0: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f  e state "stp" */
6c00: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
6c10: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
6c20: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
6c30: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
6c40: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
6c50: 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64  ue;    /* Alread
6c60: 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20  y used by inner 
6c70: 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  loop */.    if( 
6c80: 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72  cfp->dot>=cfp->r
6c90: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
6ca0: 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68  ue;  /* Can't sh
6cb0: 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ift this config 
6cc0: 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  */.    Configlis
6cd0: 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20 20  t_reset();      
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65 77  /* Reset the new
6d00: 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20   config set */. 
6d10: 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d     sp = cfp->rp-
6d20: 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20  >rhs[cfp->dot]; 
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6d40: 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20  ymbol after the 
6d50: 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  dot */..    /* F
6d60: 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75  or every configu
6d70: 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74  ration in the st
6d80: 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20  ate "stp" which 
6d90: 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22  has the symbol "
6da0: 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  sp".    ** follo
6db0: 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64  wing its dot, ad
6dc0: 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69  d the same confi
6dd0: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
6de0: 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a  basis set under.
6df0: 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
6e00: 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68 65  ion but with the
6e10: 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65   dot shifted one
6e20: 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72   symbol to the r
6e30: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ight. */.    for
6e40: 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b  (bcfp=cfp; bcfp;
6e50: 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74   bcfp=bcfp->next
6e60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63 66  ){.      if( bcf
6e70: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
6e80: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ETE ) continue; 
6e90: 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73     /* Already us
6ea0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
6eb0: 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d  bcfp->dot>=bcfp-
6ec0: 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  >rp->nrhs ) cont
6ed0: 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73  inue; /* Can't s
6ee0: 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f  hift this one */
6ef0: 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63 66  .      bsp = bcf
6f00: 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d  p->rp->rhs[bcfp-
6f10: 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20  >dot];          
6f20: 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61   /* Get symbol a
6f30: 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20  fter dot */.    
6f40: 20 20 69 66 28 20 62 73 70 21 3d 73 70 20 29 20    if( bsp!=sp ) 
6f50: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 20  continue;       
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
6f70: 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20 66  ust be same as f
6f80: 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20  or "cfp" */.    
6f90: 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d    bcfp->status =
6fa0: 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20   COMPLETE;      
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
6fc0: 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ark this config 
6fd0: 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  as used */.     
6fe0: 20 6e 65 77 20 3d 20 43 6f 6e 66 69 67 6c 69 73   new = Configlis
6ff0: 74 5f 61 64 64 62 61 73 69 73 28 62 63 66 70 2d  t_addbasis(bcfp-
7000: 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29  >rp,bcfp->dot+1)
7010: 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64  ;.      Plink_ad
7020: 64 28 26 6e 65 77 2d 3e 62 70 6c 70 2c 62 63 66  d(&new->bplp,bcf
7030: 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  p);.    }..    /
7040: 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20  * Get a pointer 
7050: 74 6f 20 74 68 65 20 73 74 61 74 65 20 64 65 73  to the state des
7060: 63 72 69 62 65 64 20 62 79 20 74 68 65 20 62 61  cribed by the ba
7070: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
7080: 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e  n set.    ** con
7090: 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 65 20  structed in the 
70a0: 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a  preceding loop *
70b0: 2f 0a 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67  /.    newstp = g
70c0: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a  etstate(lemp);..
70d0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
70e0: 20 22 6e 65 77 73 74 70 22 20 69 73 20 72 65 61   "newstp" is rea
70f0: 63 68 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ched from the st
7100: 61 74 65 20 22 73 74 70 22 20 62 79 20 61 20 73  ate "stp" by a s
7110: 68 69 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20  hift action.    
7120: 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c  ** on the symbol
7130: 20 22 73 70 22 20 2a 2f 0a 20 20 20 20 41 63 74   "sp" */.    Act
7140: 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70  ion_add(&stp->ap
7150: 2c 53 48 49 46 54 2c 73 70 2c 6e 65 77 73 74 70  ,SHIFT,sp,newstp
7160: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7170: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70 72  Construct the pr
7180: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
7190: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b  */.void FindLink
71a0: 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
71b0: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
71c0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
71d0: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74  config *cfp, *ot
71e0: 68 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73 74  her;.  struct st
71f0: 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
7200: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a  ct plink *plp;..
7210: 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e    /* Housekeepin
7220: 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41  g detail:.  ** A
7230: 64 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f 70  dd to every prop
7240: 61 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69  agate link a poi
7250: 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65  nter back to the
7260: 20 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77   state to.  ** w
7270: 68 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69 73  hich the link is
7280: 20 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20   attached. */.  
7290: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
72a0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
72b0: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
72c0: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
72d0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
72e0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
72f0: 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e  xt){.      cfp->
7300: 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d  stp = stp;.    }
7310: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  .  }..  /* Conve
7320: 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73  rt all backlinks
7330: 20 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c 69   into forward li
7340: 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  nks.  Only the f
7350: 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b  orward.  ** link
7360: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
7370: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d  e follow-set com
7380: 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  putation. */.  f
7390: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
73a0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
73b0: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
73c0: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
73d0: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
73e0: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
73f0: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 6c  t){.      for(pl
7400: 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70  p=cfp->bplp; plp
7410: 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29  ; plp=plp->next)
7420: 7b 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20  {.        other 
7430: 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20  = plp->cfp;.    
7440: 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f      Plink_add(&o
7450: 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b  ther->fplp,cfp);
7460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7470: 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65   }.}../* Compute
7480: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e   all followsets.
7490: 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73  .**.** A follows
74a0: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
74b0: 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69   all symbols whi
74c0: 63 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65  ch can come imme
74d0: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
74e0: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
74f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f  ..*/.void FindFo
7500: 6c 6c 6f 77 53 65 74 73 28 6c 65 6d 70 29 0a 73  llowSets(lemp).s
7510: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
7520: 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p;.{.  int i;.  
7530: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
7540: 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  fp;.  struct pli
7550: 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20 70  nk *plp;.  int p
7560: 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20 63  rogress;.  int c
7570: 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  hange;..  for(i=
7580: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7590: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  e; i++){.    for
75a0: 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  (cfp=lemp->sorte
75b0: 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20  d[i]->cfp; cfp; 
75c0: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
75d0: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
75e0: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
75f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 64      }.  }.  .  d
7600: 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20  o{.    progress 
7610: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
7620: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
7630: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
7640: 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  r(cfp=lemp->sort
7650: 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b  ed[i]->cfp; cfp;
7660: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
7670: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66 70  .        if( cfp
7680: 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45  ->status==COMPLE
7690: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TE ) continue;. 
76a0: 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63         for(plp=c
76b0: 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20 70  fp->fplp; plp; p
76c0: 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20  lp=plp->next){. 
76d0: 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 20           change 
76e0: 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e  = SetUnion(plp->
76f0: 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66 77  cfp->fws,cfp->fw
7700: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
7710: 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  ( change ){.    
7720: 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66 70          plp->cfp
7730: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
7740: 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20  PLETE;.         
7750: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
7760: 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20  ..  }..}.       
7770: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43   cfp->status = C
7780: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  OMPLETE;.      }
7790: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
77a0: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a   progress );.}..
77b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
77c0: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 29 3b 0a 0a  ve_conflict();..
77d0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72  /* Compute the r
77e0: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61  educe actions, a
77f0: 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c  nd resolve confl
7800: 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  icts..*/.void Fi
7810: 6e 64 41 63 74 69 6f 6e 73 28 6c 65 6d 70 29 0a  ndActions(lemp).
7820: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7830: 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b  mp;.{.  int i,j;
7840: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
7850: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
7860: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
7870: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
7880: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
7890: 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c  rp;..  /* Add al
78a0: 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63 65 20  l of the reduce 
78b0: 61 63 74 69 6f 6e 73 20 0a 20 20 2a 2a 20 41 20  actions .  ** A 
78c0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69 73  reduce action is
78d0: 20 61 64 64 65 64 20 66 6f 72 20 65 61 63 68 20   added for each 
78e0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  element of the f
78f0: 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a  ollowset of.  **
7900: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
7910: 20 77 68 69 63 68 20 68 61 73 20 69 74 73 20 64   which has its d
7920: 6f 74 20 61 74 20 74 68 65 20 65 78 74 72 65 6d  ot at the extrem
7930: 65 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20  e right..  */.  
7940: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7950: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20  >nstate; i++){  
7960: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
7970: 6c 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 20 20  l states */.    
7980: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
7990: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
79a0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
79b0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
79c0: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  {  /* Loop over 
79d0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
79e0: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
79f0: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63  cfp->rp->nrhs==c
7a00: 66 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20 20 20  fp->dot ){      
7a10: 20 20 2f 2a 20 49 73 20 64 6f 74 20 61 74 20 65    /* Is dot at e
7a20: 78 74 72 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f  xtreme right? */
7a30: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7a40: 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; j<lemp->ntermi
7a50: 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nal; j++){.     
7a60: 20 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64       if( SetFind
7a70: 28 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a  (cfp->fws,j) ){.
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7a90: 64 64 20 61 20 72 65 64 75 63 65 20 61 63 74 69  dd a reduce acti
7aa0: 6f 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  on to the state 
7ab0: 22 73 74 70 22 20 77 68 69 63 68 20 77 69 6c 6c  "stp" which will
7ac0: 20 72 65 64 75 63 65 20 62 79 20 74 68 65 0a 20   reduce by the. 
7ad0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 75             ** ru
7ae0: 6c 65 20 22 63 66 70 2d 3e 72 70 22 20 69 66 20  le "cfp->rp" if 
7af0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79  the lookahead sy
7b00: 6d 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73  mbol is "lemp->s
7b10: 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20  ymbols[j]" */.  
7b20: 20 20 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e            Action
7b30: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 52 45  _add(&stp->ap,RE
7b40: 44 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  DUCE,lemp->symbo
7b50: 6c 73 5b 6a 5d 2c 63 66 70 2d 3e 72 70 29 3b 0a  ls[j],cfp->rp);.
7b60: 20 20 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20            }..}. 
7b70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7b80: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61  ..  /* Add the a
7b90: 63 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a  ccepting token *
7ba0: 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  /.  if( lemp->st
7bb0: 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  art ){.    sp = 
7bc0: 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70  Symbol_find(lemp
7bd0: 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66  ->start);.    if
7be0: 28 20 73 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c  ( sp==0 ) sp = l
7bf0: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a  emp->rule->lhs;.
7c00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20    }else{.    sp 
7c10: 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  = lemp->rule->lh
7c20: 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20  s;.  }.  /* Add 
7c30: 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61  to the first sta
7c40: 74 65 20 28 77 68 69 63 68 20 69 73 20 61 6c 77  te (which is alw
7c50: 61 79 73 20 74 68 65 20 73 74 61 72 74 69 6e 67  ays the starting
7c60: 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20   state of the.  
7c70: 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74 65 20  ** finite state 
7c80: 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69  machine) an acti
7c90: 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69 66 20  on to ACCEPT if 
7ca0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73  the lookahead is
7cb0: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20   the.  ** start 
7cc0: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f  nonterminal.  */
7cd0: 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c  .  Action_add(&l
7ce0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e  emp->sorted[0]->
7cf0: 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b  ap,ACCEPT,sp,0);
7d00: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63  ..  /* Resolve c
7d10: 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f  onflicts */.  fo
7d20: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
7d30: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
7d40: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
7d50: 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74  ap, *nap;.    st
7d60: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
7d70: 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
7d80: 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
7d90: 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61 70 20  assert( stp->ap 
7da0: 29 3b 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d  );.    stp->ap =
7db0: 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70   Action_sort(stp
7dc0: 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61  ->ap);.    for(a
7dd0: 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26  p=stp->ap; ap &&
7de0: 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70   ap->next; ap=ap
7df0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66  ->next){.      f
7e00: 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  or(nap=ap->next;
7e10: 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d   nap && nap->sp=
7e20: 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70  =ap->sp; nap=nap
7e30: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
7e40: 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74    /* The two act
7e50: 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e  ions "ap" and "n
7e60: 61 70 22 20 68 61 76 65 20 74 68 65 20 73 61 6d  ap" have the sam
7e70: 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20  e lookahead..   
7e80: 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20        ** Figure 
7e90: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68  out which one sh
7ea0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a  ould be used */.
7eb0: 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e           lemp->n
7ec0: 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f  conflict += reso
7ed0: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c  lve_conflict(ap,
7ee0: 6e 61 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  nap,lemp->errsym
7ef0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7f00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72  .  }..  /* Repor
7f10: 74 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65  t an error for e
7f20: 61 63 68 20 72 75 6c 65 20 74 68 61 74 20 63 61  ach rule that ca
7f30: 6e 20 6e 65 76 65 72 20 62 65 20 72 65 64 75 63  n never be reduc
7f40: 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ed. */.  for(rp=
7f50: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
7f60: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d  rp=rp->next) rp-
7f70: 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 42 5f 46  >canReduce = B_F
7f80: 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ALSE;.  for(i=0;
7f90: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
7fa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
7fb0: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
7fc0: 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73    for(ap=lemp->s
7fd0: 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70  orted[i]->ap; ap
7fe0: 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
7ff0: 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
8000: 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61 70 2d  pe==REDUCE ) ap-
8010: 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63 65  >x.rp->canReduce
8020: 20 3d 20 42 5f 54 52 55 45 3b 0a 20 20 20 20 7d   = B_TRUE;.    }
8030: 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
8040: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8050: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
8060: 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63  if( rp->canReduc
8070: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8080: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
8090: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
80a0: 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c  leline,"This rul
80b0: 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64  e can not be red
80c0: 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c  uced.\n");.    l
80d0: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
80e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c  .  }.}../* Resol
80f0: 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65  ve a conflict be
8100: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
8110: 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66  ven actions.  If
8120: 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74   the.** conflict
8130: 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76   can't be resolv
8140: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  e, return non-ze
8150: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e  ro..**.** NO LON
8160: 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54  GER TRUE:.**   T
8170: 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66  o resolve a conf
8180: 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b  lict, first look
8190: 20 74 6f 20 73 65 65 20 69 66 20 65 69 74 68 65   to see if eithe
81a0: 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73  r action.**   is
81b0: 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c   on an error rul
81c0: 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
81d0: 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f  , take the actio
81e0: 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20  n which.**   is 
81f0: 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  not associated w
8200: 69 74 68 20 74 68 65 20 65 72 72 6f 72 20 72 75  ith the error ru
8210: 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20  le.  If neither 
8220: 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74  or both.**   act
8230: 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61  ions are associa
8240: 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
8250: 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79  r rule, then try
8260: 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65   to.**   use pre
8270: 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c  cedence to resol
8280: 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e  ve the conflict.
8290: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
82a0: 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49   action is a SHI
82b0: 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  FT, then it must
82c0: 20 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a   be apx.  This.*
82d0: 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74  * function won't
82e0: 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79   work if apx->ty
82f0: 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61  pe==REDUCE and a
8300: 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e  py->type==SHIFT.
8310: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
8320: 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28  esolve_conflict(
8330: 61 70 78 2c 61 70 79 2c 65 72 72 73 79 6d 29 0a  apx,apy,errsym).
8340: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
8350: 70 78 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f  px;.struct actio
8360: 6e 20 2a 61 70 79 3b 0a 73 74 72 75 63 74 20 73  n *apy;.struct s
8370: 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20  ymbol *errsym;  
8380: 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 73 79   /* The error sy
8390: 6d 62 6f 6c 20 28 69 66 20 64 65 66 69 6e 65 64  mbol (if defined
83a0: 2e 20 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73  .  NULL otherwis
83b0: 65 29 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74  e) */.{.  struct
83c0: 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73   symbol *spx, *s
83d0: 70 79 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74  py;.  int errcnt
83e0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
83f0: 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70  apx->sp==apy->sp
8400: 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73   );  /* Otherwis
8410: 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65  e there would be
8420: 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a   no conflict */.
8430: 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d    if( apx->type=
8440: 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74  =SHIFT && apy->t
8450: 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20  ype==REDUCE ){. 
8460: 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70     spx = apx->sp
8470: 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d  ;.    spy = apy-
8480: 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a  >x.rp->precsym;.
8490: 20 20 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c      if( spy==0 |
84a0: 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c  | spx->prec<0 ||
84b0: 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a   spy->prec<0 ){.
84c0: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f        /* Not eno
84d0: 75 67 68 20 70 72 65 63 65 64 65 6e 63 65 20 69  ugh precedence i
84e0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20  nformation. */. 
84f0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
8500: 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20   CONFLICT;.     
8510: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
8520: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
8530: 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20  ec>spy->prec ){ 
8540: 20 20 20 2f 2a 20 4c 6f 77 65 72 20 70 72 65 63     /* Lower prec
8550: 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20  edence wins */. 
8560: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
8570: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
8580: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
8590: 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20  >prec<spy->prec 
85a0: 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ){.      apx->ty
85b0: 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44  pe = SH_RESOLVED
85c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
85d0: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
85e0: 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73  prec && spx->ass
85f0: 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20  oc==RIGHT ){ /* 
8600: 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  Use operator */.
8610: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
8620: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20  = RD_RESOLVED;  
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 73             /* as
8650: 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f 0a 20  sociativity */. 
8660: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
8670: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
8680: 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d  c && spx->assoc=
8690: 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20  =LEFT ){  /* to 
86a0: 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20  break tie */.   
86b0: 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53     apx->type = S
86c0: 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  H_RESOLVED;.    
86d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
86e0: 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d  ert( spx->prec==
86f0: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
8700: 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b  ->assoc==NONE );
8710: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8720: 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   = CONFLICT;.   
8730: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
8740: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61   }.  }else if( a
8750: 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  px->type==REDUCE
8760: 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52   && apy->type==R
8770: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78  EDUCE ){.    spx
8780: 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72   = apx->x.rp->pr
8790: 65 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d  ecsym;.    spy =
87a0: 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apy->x.rp->prec
87b0: 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78  sym;.    if( spx
87c0: 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c  ==0 || spy==0 ||
87d0: 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a   spx->prec<0 ||.
87e0: 20 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20      spy->prec<0 
87f0: 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70  || spx->prec==sp
8800: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
8810: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e   apy->type = CON
8820: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
8830: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
8840: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
8850: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
8860: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
8870: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
8880: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
8890: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
88a0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
88b0: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
88c0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
88d0: 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
88e0: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52   apx->type==SH_R
88f0: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
8900: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52   apx->type==RD_R
8910: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
8920: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46   apx->type==CONF
8930: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
8940: 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f  y->type==SH_RESO
8950: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
8960: 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f  y->type==RD_RESO
8970: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
8980: 79 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43  y->type==CONFLIC
8990: 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20  T.    );.    /* 
89a0: 54 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54  The REDUCE/SHIFT
89b0: 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70   case cannot hap
89c0: 70 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46  pen because SHIF
89d0: 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20  Ts come before. 
89e0: 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e     ** REDUCEs on
89f0: 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77   the list.  If w
8a00: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
8a10: 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65  nt it must be be
8a20: 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
8a30: 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74   parser conflict
8a40: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
8a50: 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20  n resolved. */. 
8a60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
8a70: 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  nt;.}./*********
8a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
8a90: 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66  m the file "conf
8aa0: 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  iglist.c" ******
8ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ac0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
8ad0: 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e  nes to processin
8ae0: 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  g a configuratio
8af0: 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64  n list and build
8b00: 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69  ing a state.** i
8b10: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
8b20: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
8b30: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
8b40: 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74  config *freelist
8b50: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69   = 0;      /* Li
8b60: 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69  st of free confi
8b70: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  gurations */.sta
8b80: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
8b90: 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20  g *current = 0; 
8ba0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
8bb0: 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72  list of configur
8bc0: 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
8bd0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
8be0: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b  *currentend = 0;
8bf0: 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69     /* Last on li
8c00: 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f  st of configs */
8c10: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
8c20: 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30  onfig *basis = 0
8c30: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  ;         /* Top
8c40: 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69   of list of basi
8c50: 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61  s configs */.sta
8c60: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
8c70: 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30  g **basisend = 0
8c80: 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20  ;     /* End of 
8c90: 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f  list of basis co
8ca0: 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74  nfigs */../* Ret
8cb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
8cc0: 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61   a new configura
8cd0: 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
8ce0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
8cf0: 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74  ewconfig(){.  st
8d00: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
8d10: 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74  ;.  if( freelist
8d20: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
8d30: 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
8d40: 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20  3;.    freelist 
8d50: 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
8d60: 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   *)malloc( sizeo
8d70: 66 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29  f(struct config)
8d80: 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69 66 28 20  *amt );.    if( 
8d90: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
8da0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
8db0: 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61  err,"Unable to a
8dc0: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
8dd0: 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75  or a new configu
8de0: 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20  ration.");.     
8df0: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
8e00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
8e10: 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c  mt-1; i++) freel
8e20: 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66  ist[i].next = &f
8e30: 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
8e40: 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31    freelist[amt-1
8e50: 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a  ].next = 0;.  }.
8e60: 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73 74    new = freelist
8e70: 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66  ;.  freelist = f
8e80: 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20  reelist->next;. 
8e90: 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a   return new;.}..
8ea0: 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61  /* The configura
8eb0: 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f  tion "old" is no
8ec0: 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a   longer used */.
8ed0: 50 52 49 56 41 54 45 20 76 6f 69 64 20 64 65 6c  PRIVATE void del
8ee0: 65 74 65 63 6f 6e 66 69 67 28 6f 6c 64 29 0a 73  eteconfig(old).s
8ef0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
8f00: 64 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74  d;.{.  old->next
8f10: 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66   = freelist;.  f
8f20: 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d  reelist = old;.}
8f30: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64  ../* Initialized
8f40: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
8f50: 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20  on list builder 
8f60: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
8f70: 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75 72  st_init(){.  cur
8f80: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72  rent = 0;.  curr
8f90: 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e  entend = &curren
8fa0: 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a  t;.  basis = 0;.
8fb0: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61    basisend = &ba
8fc0: 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62  sis;.  Configtab
8fd0: 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74  le_init();.  ret
8fe0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69  urn;.}../* Initi
8ff0: 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69  alized the confi
9000: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75  guration list bu
9010: 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f  ilder */.void Co
9020: 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29  nfiglist_reset()
9030: 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  {.  current = 0;
9040: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
9050: 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69  &current;.  basi
9060: 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e  s = 0;.  basisen
9070: 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f  d = &basis;.  Co
9080: 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28  nfigtable_clear(
9090: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
90a0: 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20  ./* Add another 
90b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
90c0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
90d0: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  on list */.struc
90e0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
90f0: 6c 69 73 74 5f 61 64 64 28 72 70 2c 64 6f 74 29  list_add(rp,dot)
9100: 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  .struct rule *rp
9110: 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65  ;    /* The rule
9120: 20 2a 2f 0a 69 6e 74 20 64 6f 74 3b 20 20 20 20   */.int dot;    
9130: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9140: 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f 66   into the RHS of
9150: 20 74 68 65 20 72 75 6c 65 20 77 68 65 72 65 20   the rule where 
9160: 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a  the dot goes */.
9170: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
9180: 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a  g *cfp, model;..
9190: 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e    assert( curren
91a0: 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64  tend!=0 );.  mod
91b0: 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f  el.rp = rp;.  mo
91c0: 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  del.dot = dot;. 
91d0: 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62   cfp = Configtab
91e0: 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b  le_find(&model);
91f0: 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b  .  if( cfp==0 ){
9200: 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f  .    cfp = newco
9210: 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d  nfig();.    cfp-
9220: 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66  >rp = rp;.    cf
9230: 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  p->dot = dot;.  
9240: 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74    cfp->fws = Set
9250: 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  New();.    cfp->
9260: 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  stp = 0;.    cfp
9270: 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70  ->fplp = cfp->bp
9280: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  lp = 0;.    cfp-
9290: 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63  >next = 0;.    c
92a0: 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20  fp->bp = 0;.    
92b0: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66  *currentend = cf
92c0: 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e  p;.    currenten
92d0: 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a  d = &cfp->next;.
92e0: 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f      Configtable_
92f0: 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d  insert(cfp);.  }
9300: 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d  .  return cfp;.}
9310: 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73  ../* Add a basis
9320: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
9330: 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  o the configurat
9340: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75  ion list */.stru
9350: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
9360: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72  glist_addbasis(r
9370: 70 2c 64 6f 74 29 0a 73 74 72 75 63 74 20 72 75  p,dot).struct ru
9380: 6c 65 20 2a 72 70 3b 0a 69 6e 74 20 64 6f 74 3b  le *rp;.int dot;
9390: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
93a0: 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a  ig *cfp, model;.
93b0: 0a 20 20 61 73 73 65 72 74 28 20 62 61 73 69 73  .  assert( basis
93c0: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  end!=0 );.  asse
93d0: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
93e0: 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20  0 );.  model.rp 
93f0: 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f  = rp;.  model.do
9400: 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d  t = dot;.  cfp =
9410: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e   Configtable_fin
9420: 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28  d(&model);.  if(
9430: 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63   cfp==0 ){.    c
9440: 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29  fp = newconfig()
9450: 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20  ;.    cfp->rp = 
9460: 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74  rp;.    cfp->dot
9470: 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d   = dot;.    cfp-
9480: 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b  >fws = SetNew();
9490: 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20  .    cfp->stp = 
94a0: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70  0;.    cfp->fplp
94b0: 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30   = cfp->bplp = 0
94c0: 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20  ;.    cfp->next 
94d0: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70  = 0;.    cfp->bp
94e0: 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65   = 0;.    *curre
94f0: 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  ntend = cfp;.   
9500: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
9510: 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a 62  fp->next;.    *b
9520: 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a 20  asisend = cfp;. 
9530: 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 63     basisend = &c
9540: 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e 66  fp->bp;.    Conf
9550: 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63  igtable_insert(c
9560: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
9570: 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  n cfp;.}../* Com
9580: 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75 72 65  pute the closure
9590: 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   of the configur
95a0: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f  ation list */.vo
95b0: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c  id Configlist_cl
95c0: 6f 73 75 72 65 28 6c 65 6d 70 29 0a 73 74 72 75  osure(lemp).stru
95d0: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
95e0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
95f0: 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b  g *cfp, *newcfp;
9600: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
9610: 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74  rp, *newrp;.  st
9620: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
9630: 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20   *xsp;.  int i, 
9640: 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  dot;..  assert( 
9650: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
9660: 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65  .  for(cfp=curre
9670: 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  nt; cfp; cfp=cfp
9680: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20  ->next){.    rp 
9690: 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64  = cfp->rp;.    d
96a0: 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20  ot = cfp->dot;. 
96b0: 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e     if( dot>=rp->
96c0: 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b  nrhs ) continue;
96d0: 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68  .    sp = rp->rh
96e0: 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20  s[dot];.    if( 
96f0: 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52  sp->type==NONTER
9700: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  MINAL ){.      i
9710: 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26  f( sp->rule==0 &
9720: 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73  & sp!=lemp->errs
9730: 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ym ){.        Er
9740: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
9750: 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22  ename,rp->line,"
9760: 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73  Nonterminal \"%s
9770: 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e  \" has no rules.
9780: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  ",.          sp-
9790: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
97a0: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
97b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
97c0: 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75  for(newrp=sp->ru
97d0: 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70  le; newrp; newrp
97e0: 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29  =newrp->nextlhs)
97f0: 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66 70  {.        newcfp
9800: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64   = Configlist_ad
9810: 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20  d(newrp,0);.    
9820: 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b      for(i=dot+1;
9830: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
9840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73 70  ){.          xsp
9850: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
9860: 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70           if( xsp
9870: 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
9880: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9890: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
98a0: 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a  ws,xsp->index);.
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
98c0: 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20  k;..  }else{.   
98d0: 20 20 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f           SetUnio
98e0: 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73  n(newcfp->fws,xs
98f0: 70 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20  p->firstset);.  
9900: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73            if( xs
9910: 70 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c  p->lambda==B_FAL
9920: 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 20 20 7d  SE ) break;..  }
9930: 0a 09 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ..}.        if( 
9940: 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c  i==rp->nrhs ) Pl
9950: 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66 70  ink_add(&cfp->fp
9960: 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20 20  lp,newcfp);.    
9970: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9980: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f  return;.}../* So
9990: 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  rt the configura
99a0: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
99b0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
99c0: 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  t(){.  current =
99d0: 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20   (struct config 
99e0: 2a 29 6d 73 6f 72 74 28 63 75 72 72 65 6e 74 2c  *)msort(current,
99f0: 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29  &(current->next)
9a00: 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63  ,Configcmp);.  c
9a10: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20  urrentend = 0;. 
9a20: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53   return;.}../* S
9a30: 6f 72 74 20 74 68 65 20 62 61 73 69 73 20 63 6f  ort the basis co
9a40: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
9a50: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
9a60: 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 7b  ist_sortbasis(){
9a70: 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74 72 75  .  basis = (stru
9a80: 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72  ct config *)msor
9a90: 74 28 63 75 72 72 65 6e 74 2c 26 28 63 75 72 72  t(current,&(curr
9aa0: 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66 69 67 63  ent->bp),Configc
9ab0: 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  mp);.  basisend 
9ac0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
9ad0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
9ae0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
9af0: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
9b00: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
9b10: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
9b20: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
9b30: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72  ig *Configlist_r
9b40: 65 74 75 72 6e 28 29 7b 0a 20 20 73 74 72 75 63  eturn(){.  struc
9b50: 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20  t config *old;. 
9b60: 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a   old = current;.
9b70: 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20    current = 0;. 
9b80: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b   currentend = 0;
9b90: 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d  .  return old;.}
9ba0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
9bb0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
9bc0: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
9bd0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
9be0: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
9bf0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
9c00: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62  ig *Configlist_b
9c10: 61 73 69 73 28 29 7b 0a 20 20 73 74 72 75 63 74  asis(){.  struct
9c20: 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20   config *old;.  
9c30: 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20 20 62  old = basis;.  b
9c40: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
9c50: 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  send = 0;.  retu
9c60: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72  rn old;.}../* Fr
9c70: 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20  ee all elements 
9c80: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6e  of the given con
9c90: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
9ca0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
9cb0: 73 74 5f 65 61 74 28 63 66 70 29 0a 73 74 72 75  st_eat(cfp).stru
9cc0: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
9cd0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
9ce0: 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f  g *nextcfp;.  fo
9cf0: 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78  r(; cfp; cfp=nex
9d00: 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63  tcfp){.    nextc
9d10: 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a  fp = cfp->next;.
9d20: 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d      assert( cfp-
9d30: 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20  >fplp==0 );.    
9d40: 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c  assert( cfp->bpl
9d50: 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  p==0 );.    if( 
9d60: 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72  cfp->fws ) SetFr
9d70: 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ee(cfp->fws);.  
9d80: 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63    deleteconfig(c
9d90: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
9da0: 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n;.}./**********
9db0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
9dc0: 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20   file "error.c" 
9dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9df0: 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
9e00: 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72  r printing error
9e10: 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 2f 2a   message..*/../*
9e20: 20 46 69 6e 64 20 61 20 67 6f 6f 64 20 70 6c 61   Find a good pla
9e30: 63 65 20 74 6f 20 62 72 65 61 6b 20 22 6d 73 67  ce to break "msg
9e40: 22 20 73 6f 20 74 68 61 74 20 69 74 73 20 6c 65  " so that its le
9e50: 6e 67 74 68 20 69 73 20 61 74 20 6c 65 61 73 74  ngth is at least
9e60: 20 22 6d 69 6e 22 0a 2a 2a 20 62 75 74 20 6e 6f   "min".** but no
9e70: 20 6d 6f 72 65 20 74 68 61 6e 20 22 6d 61 78 22   more than "max"
9e80: 2e 20 20 4d 61 6b 65 20 74 68 65 20 70 6f 69 6e  .  Make the poin
9e90: 74 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 6d 61  t as close to ma
9ea0: 78 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  x as possible..*
9eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
9ec0: 64 62 72 65 61 6b 28 6d 73 67 2c 6d 69 6e 2c 6d  dbreak(msg,min,m
9ed0: 61 78 29 0a 63 68 61 72 20 2a 6d 73 67 3b 0a 69  ax).char *msg;.i
9ee0: 6e 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d 61 78 3b  nt min;.int max;
9ef0: 0a 7b 0a 20 20 69 6e 74 20 69 2c 73 70 6f 74 3b  .{.  int i,spot;
9f00: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66 6f 72  .  char c;.  for
9f10: 28 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20 69 3c 3d  (i=spot=min; i<=
9f20: 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  max; i++){.    c
9f30: 20 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20 20 20 69   = msg[i];.    i
9f40: 66 28 20 63 3d 3d 27 5c 74 27 20 29 20 6d 73 67  f( c=='\t' ) msg
9f50: 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69  [i] = ' ';.    i
9f60: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 6d 73  f( c=='\n' ){ ms
9f70: 67 5b 69 5d 20 3d 20 27 20 27 3b 20 73 70 6f 74  g[i] = ' '; spot
9f80: 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20   = i; break; }. 
9f90: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 20 73     if( c==0 ){ s
9fa0: 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20  pot = i; break; 
9fb0: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2d 27  }.    if( c=='-'
9fc0: 20 26 26 20 69 3c 6d 61 78 2d 31 20 29 20 73 70   && i<max-1 ) sp
9fd0: 6f 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 69 66  ot = i+1;.    if
9fe0: 28 20 63 3d 3d 27 20 27 20 29 20 73 70 6f 74 20  ( c==' ' ) spot 
9ff0: 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
a000: 6e 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n spot;.}../*.**
a010: 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   The error messa
a020: 67 65 20 69 73 20 73 70 6c 69 74 20 61 63 72 6f  ge is split acro
a030: 73 73 20 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 65  ss multiple line
a040: 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  s if necessary. 
a050: 20 54 68 65 0a 2a 2a 20 73 70 6c 69 74 73 20 6f   The.** splits o
a060: 63 63 75 72 20 61 74 20 61 20 73 70 61 63 65 2c  ccur at a space,
a070: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 73   if there is a s
a080: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6e  pace available n
a090: 65 61 72 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f  ear the end.** o
a0a0: 66 20 74 68 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 23  f the line..*/.#
a0b0: 64 65 66 69 6e 65 20 45 52 52 4d 53 47 53 49 5a  define ERRMSGSIZ
a0c0: 45 20 20 31 30 30 30 30 20 2f 2a 20 48 6f 70 65  E  10000 /* Hope
a0d0: 20 74 68 69 73 20 69 73 20 62 69 67 20 65 6e 6f   this is big eno
a0e0: 75 67 68 2e 20 20 4e 6f 20 77 61 79 20 74 6f 20  ugh.  No way to 
a0f0: 65 72 72 6f 72 20 63 68 65 63 6b 20 2a 2f 0a 23  error check */.#
a100: 64 65 66 69 6e 65 20 4c 49 4e 45 57 49 44 54 48  define LINEWIDTH
a110: 20 20 20 20 20 20 37 39 20 2f 2a 20 4d 61 78 20        79 /* Max 
a120: 77 69 64 74 68 20 6f 66 20 61 6e 79 20 6f 75 74  width of any out
a130: 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66  put line */.#def
a140: 69 6e 65 20 50 52 45 46 49 58 4c 49 4d 49 54 20  ine PREFIXLIMIT 
a150: 20 20 20 33 30 20 2f 2a 20 4d 61 78 20 77 69 64     30 /* Max wid
a160: 74 68 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  th of the prefix
a170: 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f   on each line */
a180: 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63  .void ErrorMsg(c
a190: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
a1a0: 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  ame, int lineno,
a1b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72   const char *for
a1c0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61  mat, ...){.  cha
a1d0: 72 20 65 72 72 6d 73 67 5b 45 52 52 4d 53 47 53  r errmsg[ERRMSGS
a1e0: 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 72 65  IZE];.  char pre
a1f0: 66 69 78 5b 50 52 45 46 49 58 4c 49 4d 49 54 2b  fix[PREFIXLIMIT+
a200: 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72 72 6d 73  10];.  int errms
a210: 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20 70 72 65  gsize;.  int pre
a220: 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e 74 20 61  fixsize;.  int a
a230: 76 61 69 6c 61 62 6c 65 77 69 64 74 68 3b 0a 20  vailablewidth;. 
a240: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
a250: 6e 74 20 65 6e 64 2c 20 72 65 73 74 61 72 74 2c  nt end, restart,
a260: 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f 73 74 61   base;..  va_sta
a270: 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a  rt(ap, format);.
a280: 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61 20 70    /* Prepare a p
a290: 72 65 66 69 78 20 74 6f 20 62 65 20 70 72 65 70  refix to be prep
a2a0: 65 6e 64 65 64 20 74 6f 20 65 76 65 72 79 20 6f  ended to every o
a2b0: 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 20 20  utput line */.  
a2c0: 69 66 28 20 6c 69 6e 65 6e 6f 3e 30 20 29 7b 0a  if( lineno>0 ){.
a2d0: 20 20 20 20 73 70 72 69 6e 74 66 28 70 72 65 66      sprintf(pref
a2e0: 69 78 2c 22 25 2e 2a 73 3a 25 64 3a 20 22 2c 50  ix,"%.*s:%d: ",P
a2f0: 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69  REFIXLIMIT-10,fi
a300: 6c 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29 3b 0a  lename,lineno);.
a310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72    }else{.    spr
a320: 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a  intf(prefix,"%.*
a330: 73 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d 49 54  s: ",PREFIXLIMIT
a340: 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  -10,filename);. 
a350: 20 7d 0a 20 20 70 72 65 66 69 78 73 69 7a 65 20   }.  prefixsize 
a360: 3d 20 73 74 72 6c 65 6e 28 70 72 65 66 69 78 29  = strlen(prefix)
a370: 3b 0a 20 20 61 76 61 69 6c 61 62 6c 65 77 69 64  ;.  availablewid
a380: 74 68 20 3d 20 4c 49 4e 45 57 49 44 54 48 20 2d  th = LINEWIDTH -
a390: 20 70 72 65 66 69 78 73 69 7a 65 3b 0a 0a 20 20   prefixsize;..  
a3a0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
a3b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  error message */
a3c0: 0a 20 20 76 73 70 72 69 6e 74 66 28 65 72 72 6d  .  vsprintf(errm
a3d0: 73 67 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20  sg,format,ap);. 
a3e0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65   va_end(ap);.  e
a3f0: 72 72 6d 73 67 73 69 7a 65 20 3d 20 73 74 72 6c  rrmsgsize = strl
a400: 65 6e 28 65 72 72 6d 73 67 29 3b 0a 20 20 2f 2a  en(errmsg);.  /*
a410: 20 52 65 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67   Remove trailing
a420: 20 27 5c 6e 27 73 20 66 72 6f 6d 20 74 68 65 20   '\n's from the 
a430: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 2a  error message. *
a440: 2f 0a 20 20 77 68 69 6c 65 28 20 65 72 72 6d 73  /.  while( errms
a450: 67 73 69 7a 65 3e 30 20 26 26 20 65 72 72 6d 73  gsize>0 && errms
a460: 67 5b 65 72 72 6d 73 67 73 69 7a 65 2d 31 5d 3d  g[errmsgsize-1]=
a470: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 65 72  ='\n' ){.     er
a480: 72 6d 73 67 5b 2d 2d 65 72 72 6d 73 67 73 69 7a  rmsg[--errmsgsiz
a490: 65 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  e] = 0;.  }..  /
a4a0: 2a 20 50 72 69 6e 74 20 74 68 65 20 65 72 72 6f  * Print the erro
a4b0: 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 62  r message */.  b
a4c0: 61 73 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ase = 0;.  while
a4d0: 28 20 65 72 72 6d 73 67 5b 62 61 73 65 5d 21 3d  ( errmsg[base]!=
a4e0: 30 20 29 7b 0a 20 20 20 20 65 6e 64 20 3d 20 72  0 ){.    end = r
a4f0: 65 73 74 61 72 74 20 3d 20 66 69 6e 64 62 72 65  estart = findbre
a500: 61 6b 28 26 65 72 72 6d 73 67 5b 62 61 73 65 5d  ak(&errmsg[base]
a510: 2c 30 2c 61 76 61 69 6c 61 62 6c 65 77 69 64 74  ,0,availablewidt
a520: 68 29 3b 0a 20 20 20 20 72 65 73 74 61 72 74 20  h);.    restart 
a530: 2b 3d 20 62 61 73 65 3b 0a 20 20 20 20 77 68 69  += base;.    whi
a540: 6c 65 28 20 65 72 72 6d 73 67 5b 72 65 73 74 61  le( errmsg[resta
a550: 72 74 5d 3d 3d 27 20 27 20 29 20 72 65 73 74 61  rt]==' ' ) resta
a560: 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  rt++;.    fprint
a570: 66 28 73 74 64 6f 75 74 2c 22 25 73 25 2e 2a 73  f(stdout,"%s%.*s
a580: 5c 6e 22 2c 70 72 65 66 69 78 2c 65 6e 64 2c 26  \n",prefix,end,&
a590: 65 72 72 6d 73 67 5b 62 61 73 65 5d 29 3b 0a 20  errmsg[base]);. 
a5a0: 20 20 20 62 61 73 65 20 3d 20 72 65 73 74 61 72     base = restar
a5b0: 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  t;.  }.}./******
a5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
a5d0: 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63  the file "main.c
a5e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
a5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a600: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61  ******/./*.** Ma
a610: 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20  in program file 
a620: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
a630: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
a640: 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e  */../* Report an
a650: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63   out-of-memory c
a660: 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f  ondition and abo
a670: 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  rt.  This functi
a680: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f  on.** is used mo
a690: 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d  stly by the "Mem
a6a0: 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20  oryCheck" macro 
a6b0: 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76  in struct.h.*/.v
a6c0: 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72  oid memory_error
a6d0: 28 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  (){.  fprintf(st
a6e0: 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
a6f0: 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e  ory.  Aborting..
a700: 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29  .\n");.  exit(1)
a710: 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 65 20 6d 61 69  ;.}.../* The mai
a720: 6e 20 70 72 6f 67 72 61 6d 2e 20 20 50 61 72 73  n program.  Pars
a730: 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  e the command li
a740: 6e 65 20 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20  ne and do it... 
a750: 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 61 72 67 63  */.int main(argc
a760: 2c 61 72 67 76 29 0a 69 6e 74 20 61 72 67 63 3b  ,argv).int argc;
a770: 0a 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 7b 0a  .char **argv;.{.
a780: 20 20 73 74 61 74 69 63 20 69 6e 74 20 76 65 72    static int ver
a790: 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74  sion = 0;.  stat
a7a0: 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20  ic int rpflag = 
a7b0: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
a7c0: 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20  basisflag = 0;. 
a7d0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70   static int comp
a7e0: 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74  ress = 0;.  stat
a7f0: 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30  ic int quiet = 0
a800: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 73  ;.  static int s
a810: 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  tatistics = 0;. 
a820: 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c   static int mhfl
a830: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
a840: 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e   struct s_option
a850: 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a  s options[] = {.
a860: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
a870: 62 22 2c 20 28 63 68 61 72 2a 29 26 62 61 73 69  b", (char*)&basi
a880: 73 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e  sflag, "Print on
a890: 6c 79 20 74 68 65 20 62 61 73 69 73 20 69 6e 20  ly the basis in 
a8a0: 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b  report."},.    {
a8b0: 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28  OPT_FLAG, "c", (
a8c0: 63 68 61 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c  char*)&compress,
a8d0: 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73   "Don't compress
a8e0: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
a8f0: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
a900: 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a  LAG, "g", (char*
a910: 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74  )&rpflag, "Print
a920: 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74   grammar without
a930: 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20   actions."},.   
a940: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c   {OPT_FLAG, "m",
a950: 20 28 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c   (char*)&mhflag,
a960: 20 22 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68   "Output a makeh
a970: 65 61 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c  eaders compatibl
a980: 65 20 66 69 6c 65 22 7d 2c 0a 20 20 20 20 7b 4f  e file"},.    {O
a990: 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28 63  PT_FLAG, "q", (c
a9a0: 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28 51  har*)&quiet, "(Q
a9b0: 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69 6e  uiet) Don't prin
a9c0: 74 20 74 68 65 20 72 65 70 6f 72 74 20 66 69 6c  t the report fil
a9d0: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
a9e0: 4c 41 47 2c 20 22 73 22 2c 20 28 63 68 61 72 2a  LAG, "s", (char*
a9f0: 29 26 73 74 61 74 69 73 74 69 63 73 2c 20 22 50  )&statistics, "P
aa00: 72 69 6e 74 20 70 61 72 73 65 72 20 73 74 61 74  rint parser stat
aa10: 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75  s to standard ou
aa20: 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  tput."},.    {OP
aa30: 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68  T_FLAG, "x", (ch
aa40: 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50  ar*)&version, "P
aa50: 72 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e  rint the version
aa60: 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20   number."},.    
aa70: 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d  {OPT_FLAG,0,0,0}
aa80: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
aa90: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65   struct lemon le
aaa0: 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61 72  m;..  OptInit(ar
aab0: 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72  gv,options,stder
aac0: 72 29 3b 0a 20 20 69 66 28 20 76 65 72 73 69 6f  r);.  if( versio
aad0: 6e 20 29 7b 0a 20 20 20 20 20 70 72 69 6e 74 66  n ){.     printf
aae0: 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20  ("Lemon version 
aaf0: 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78  1.0\n");.     ex
ab00: 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66  it(0); .  }.  if
ab10: 28 20 4f 70 74 4e 41 72 67 73 28 29 21 3d 31 20  ( OptNArgs()!=1 
ab20: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
ab30: 74 64 65 72 72 2c 22 45 78 61 63 74 6c 79 20 6f  tderr,"Exactly o
ab40: 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75  ne filename argu
ab50: 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72 65 64  ment is required
ab60: 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
ab70: 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 2e 65 72  1);.  }.  lem.er
ab80: 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  rorcnt = 0;..  /
ab90: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
aba0: 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74   machine */.  St
abb0: 72 73 61 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20  rsafe_init();.  
abc0: 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20  Symbol_init();. 
abd0: 20 53 74 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20   State_init();. 
abe0: 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20 61 72 67   lem.argv0 = arg
abf0: 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65  v[0];.  lem.file
ac00: 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67 28 30 29  name = OptArg(0)
ac10: 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61  ;.  lem.basisfla
ac20: 67 20 3d 20 62 61 73 69 73 66 6c 61 67 3b 0a 20  g = basisflag;. 
ac30: 20 6c 65 6d 2e 68 61 73 5f 66 61 6c 6c 62 61 63   lem.has_fallbac
ac40: 6b 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 6e 63 6f  k = 0;.  lem.nco
ac50: 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 20 20 6c 65  nflict = 0;.  le
ac60: 6d 2e 6e 61 6d 65 20 3d 20 6c 65 6d 2e 69 6e 63  m.name = lem.inc
ac70: 6c 75 64 65 20 3d 20 6c 65 6d 2e 61 72 67 20 3d  lude = lem.arg =
ac80: 20 6c 65 6d 2e 74 6f 6b 65 6e 74 79 70 65 20 3d   lem.tokentype =
ac90: 20 6c 65 6d 2e 73 74 61 72 74 20 3d 20 30 3b 0a   lem.start = 0;.
aca0: 20 20 6c 65 6d 2e 76 61 72 74 79 70 65 20 3d 20    lem.vartype = 
acb0: 30 3b 0a 20 20 6c 65 6d 2e 73 74 61 63 6b 73 69  0;.  lem.stacksi
acc0: 7a 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 65 72  ze = 0;.  lem.er
acd0: 72 6f 72 20 3d 20 6c 65 6d 2e 6f 76 65 72 66 6c  ror = lem.overfl
ace0: 6f 77 20 3d 20 6c 65 6d 2e 66 61 69 6c 75 72 65  ow = lem.failure
acf0: 20 3d 20 6c 65 6d 2e 61 63 63 65 70 74 20 3d 20   = lem.accept = 
ad00: 6c 65 6d 2e 74 6f 6b 65 6e 64 65 73 74 20 3d 0a  lem.tokendest =.
ad10: 20 20 20 20 20 6c 65 6d 2e 74 6f 6b 65 6e 70 72       lem.tokenpr
ad20: 65 66 69 78 20 3d 20 6c 65 6d 2e 6f 75 74 6e 61  efix = lem.outna
ad30: 6d 65 20 3d 20 6c 65 6d 2e 65 78 74 72 61 63 6f  me = lem.extraco
ad40: 64 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 76 61  de = 0;.  lem.va
ad50: 72 64 65 73 74 20 3d 20 30 3b 0a 20 20 6c 65 6d  rdest = 0;.  lem
ad60: 2e 74 61 62 6c 65 73 69 7a 65 20 3d 20 30 3b 0a  .tablesize = 0;.
ad70: 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22    Symbol_new("$"
ad80: 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20  );.  lem.errsym 
ad90: 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65 72  = Symbol_new("er
ada0: 72 6f 72 22 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  ror");..  /* Par
adb0: 73 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  se the input fil
adc0: 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c 65  e */.  Parse(&le
add0: 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72  m);.  if( lem.er
ade0: 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c 65  rorcnt ) exit(le
adf0: 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69  m.errorcnt);.  i
ae00: 66 28 20 6c 65 6d 2e 72 75 6c 65 3d 3d 30 20 29  f( lem.rule==0 )
ae10: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
ae20: 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d  derr,"Empty gram
ae30: 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mar.\n");.    ex
ae40: 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  it(1);.  }..  /*
ae50: 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65 78   Count and index
ae60: 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20   the symbols of 
ae70: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
ae80: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53   lem.nsymbol = S
ae90: 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20  ymbol_count();. 
aea0: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65   Symbol_new("{de
aeb0: 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e  fault}");.  lem.
aec0: 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c  symbols = Symbol
aed0: 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20 71 73  _arrayof();.  qs
aee0: 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c  ort(lem.symbols,
aef0: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73 69  lem.nsymbol+1,si
af00: 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
af10: 6f 6c 2a 29 2c 0a 20 20 20 20 20 20 20 20 28 69  ol*),.        (i
af20: 6e 74 28 2a 29 28 29 29 53 79 6d 62 6f 6c 63 6d  nt(*)())Symbolcm
af30: 70 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  pp);.  for(i=0; 
af40: 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20  i<=lem.nsymbol; 
af50: 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73  i++) lem.symbols
af60: 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a  [i]->index = i;.
af70: 20 20 66 6f 72 28 69 3d 31 3b 20 69 73 75 70 70    for(i=1; isupp
af80: 65 72 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69  er(lem.symbols[i
af90: 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b  ]->name[0]); i++
afa0: 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e  );.  lem.ntermin
afb0: 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65  al = i;..  /* Ge
afc0: 6e 65 72 61 74 65 20 61 20 72 65 70 72 69 6e 74  nerate a reprint
afd0: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2c   of the grammar,
afe0: 20 69 66 20 72 65 71 75 65 73 74 65 64 20 6f 6e   if requested on
aff0: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
b000: 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c 61  e */.  if( rpfla
b010: 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e 74  g ){.    Reprint
b020: 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b  (&lem);.  }else{
b030: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
b040: 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72 20  ze the size for 
b050: 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66  all follow and f
b060: 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 20  irst sets */.   
b070: 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65   SetSize(lem.nte
b080: 72 6d 69 6e 61 6c 29 3b 0a 0a 20 20 20 20 2f 2a  rminal);..    /*
b090: 20 46 69 6e 64 20 74 68 65 20 70 72 65 63 65 64   Find the preced
b0a0: 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79 20 70  ence for every p
b0b0: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 28  roduction rule (
b0c0: 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f  that has one) */
b0d0: 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50 72 65  .    FindRulePre
b0e0: 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a  cedences(&lem);.
b0f0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
b100: 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65  the lambda-nonte
b110: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68 65 20  rminals and the 
b120: 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72 20 65  first-sets for e
b130: 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74  very.    ** nont
b140: 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46  erminal */.    F
b150: 69 6e 64 46 69 72 73 74 53 65 74 73 28 26 6c 65  indFirstSets(&le
b160: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
b170: 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20 73 74  ute all LR(0) st
b180: 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f  ates.  Also reco
b190: 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  rd follow-set pr
b1a0: 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  opagation.    **
b1b0: 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74 20 74   links so that t
b1c0: 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61  he follow-set ca
b1d0: 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61  n be computed la
b1e0: 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e  ter */.    lem.n
b1f0: 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 46  state = 0;.    F
b200: 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d 29 3b  indStates(&lem);
b210: 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20  .    lem.sorted 
b220: 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28  = State_arrayof(
b230: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65 20 75  );..    /* Tie u
b240: 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20  p loose ends on 
b250: 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  the propagation 
b260: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e  links */.    Fin
b270: 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20  dLinks(&lem);.. 
b280: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
b290: 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20  e follow set of 
b2a0: 65 76 65 72 79 20 72 65 64 75 63 69 62 6c 65 20  every reducible 
b2b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
b2c0: 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  .    FindFollowS
b2d0: 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ets(&lem);..    
b2e0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  /* Compute the a
b2f0: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
b300: 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e 73 28      FindActions(
b310: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
b320: 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63 74 69  ompress the acti
b330: 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  on tables */.   
b340: 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30   if( compress==0
b350: 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65   ) CompressTable
b360: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
b370: 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 6f   Generate a repo
b380: 72 74 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  rt of the parser
b390: 20 67 65 6e 65 72 61 74 65 64 2e 20 20 28 74 68   generated.  (th
b3a0: 65 20 22 79 2e 6f 75 74 70 75 74 22 20 66 69 6c  e "y.output" fil
b3b0: 65 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 71  e) */.    if( !q
b3c0: 75 69 65 74 20 29 20 52 65 70 6f 72 74 4f 75 74  uiet ) ReportOut
b3d0: 70 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  put(&lem);..    
b3e0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
b3f0: 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20  source code for 
b400: 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20 20  the parser */.  
b410: 20 20 52 65 70 6f 72 74 54 61 62 6c 65 28 26 6c    ReportTable(&l
b420: 65 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20  em, mhflag);..  
b430: 20 20 2f 2a 20 50 72 6f 64 75 63 65 20 61 20 68    /* Produce a h
b440: 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 75  eader file for u
b450: 73 65 20 62 79 20 74 68 65 20 73 63 61 6e 6e 65  se by the scanne
b460: 72 2e 20 20 28 54 68 69 73 20 73 74 65 70 20 69  r.  (This step i
b470: 73 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64  s.    ** omitted
b480: 20 69 66 20 74 68 65 20 22 2d 6d 22 20 6f 70 74   if the "-m" opt
b490: 69 6f 6e 20 69 73 20 75 73 65 64 20 62 65 63 61  ion is used beca
b4a0: 75 73 65 20 6d 61 6b 65 68 65 61 64 65 72 73 20  use makeheaders 
b4b0: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65  will.    ** gene
b4c0: 72 61 74 65 20 74 68 65 20 66 69 6c 65 20 66 6f  rate the file fo
b4d0: 72 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66  r us.) */.    if
b4e0: 28 20 21 6d 68 66 6c 61 67 20 29 20 52 65 70 6f  ( !mhflag ) Repo
b4f0: 72 74 48 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a  rtHeader(&lem);.
b500: 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 69 73    }.  if( statis
b510: 74 69 63 73 20 29 7b 0a 20 20 20 20 70 72 69 6e  tics ){.    prin
b520: 74 66 28 22 50 61 72 73 65 72 20 73 74 61 74 69  tf("Parser stati
b530: 73 74 69 63 73 3a 20 25 64 20 74 65 72 6d 69 6e  stics: %d termin
b540: 61 6c 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d 69  als, %d nontermi
b550: 6e 61 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c 6e  nals, %d rules\n
b560: 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74 65  ",.      lem.nte
b570: 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d  rminal, lem.nsym
b580: 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69  bol - lem.ntermi
b590: 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b  nal, lem.nrule);
b5a0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 20  .    printf("   
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 25 64 20 73 74 61 74 65 73 2c 20 25 64 20 70 61  %d states, %d pa
b5d0: 72 73 65 72 20 74 61 62 6c 65 20 65 6e 74 72 69  rser table entri
b5e0: 65 73 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74 73  es, %d conflicts
b5f0: 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e  \n",.      lem.n
b600: 73 74 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c 65  state, lem.table
b610: 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c  size, lem.nconfl
b620: 69 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ict);.  }.  if( 
b630: 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 29 7b  lem.nconflict ){
b640: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
b650: 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20  err,"%d parsing 
b660: 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65  conflicts.\n",le
b670: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20  m.nconflict);.  
b680: 7d 0a 20 20 65 78 69 74 28 6c 65 6d 2e 65 72 72  }.  exit(lem.err
b690: 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e  orcnt + lem.ncon
b6a0: 66 6c 69 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  flict);.}./*****
b6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
b6c0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d  From the file "m
b6d0: 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  sort.c" ********
b6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6f0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
b700: 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d 73   generic merge-s
b710: 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  ort program..**.
b720: 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74  ** USAGE:.** Let
b730: 20 22 70 74 72 22 20 62 65 20 61 20 70 6f 69 6e   "ptr" be a poin
b740: 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72 75  ter to some stru
b750: 63 74 75 72 65 20 77 68 69 63 68 20 69 73 20 61  cture which is a
b760: 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a  t the head of.**
b770: 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74   a null-terminat
b780: 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74  ed list.  Then t
b790: 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20  o sort the list 
b7a0: 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  call:.**.**     
b7b0: 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c  ptr = msort(ptr,
b7c0: 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70  &(ptr->next),cmp
b7d0: 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  fnc);.**.** In t
b7e0: 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e  he above, "cmpfn
b7f0: 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  c" is a pointer 
b800: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 68  to a function wh
b810: 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20  ich compares.** 
b820: 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  two instances of
b830: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 61   the structure a
b840: 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e  nd returns an in
b850: 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20  teger, as in.** 
b860: 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65 63  strcmp.  The sec
b870: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
b880: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b890: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
b8a0: 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  ** second elemen
b8b0: 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20  t of the linked 
b8c0: 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64 64 72  list.  This addr
b8d0: 65 73 73 20 69 73 20 75 73 65 64 20 74 6f 20 63  ess is used to c
b8e0: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66  ompute.** the of
b8f0: 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65 78  fset to the "nex
b900: 74 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20  t" field within 
b910: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
b920: 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a  The offset to.**
b930: 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c   the "next" fiel
b940: 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  d must be consta
b950: 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75 63  nt for all struc
b960: 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69 73  tures in the lis
b970: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e  t..**.** The fun
b980: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
b990: 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69 63  new pointer whic
b9a0: 68 20 69 73 20 74 68 65 20 68 65 61 64 20 6f 66  h is the head of
b9b0: 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74   the list.** aft
b9c0: 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a  er sorting..**.*
b9d0: 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20  * ALGORITHM:.** 
b9e0: 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a  Merge-sort..*/..
b9f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
ba00: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
ba10: 78 74 20 73 74 72 75 63 74 75 72 65 20 69 6e 20  xt structure in 
ba20: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  the linked list.
ba30: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58 54  .*/.#define NEXT
ba40: 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28 28  (A) (*(char**)((
ba50: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 41  (unsigned long)A
ba60: 29 2b 6f 66 66 73 65 74 29 29 0a 0a 2f 2a 0a 2a  )+offset))../*.*
ba70: 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 61  * Inputs:.**   a
ba80: 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64  :       A sorted
ba90: 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  , null-terminate
baa0: 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20  d linked list.  
bab0: 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a  (May be null)..*
bac0: 2a 20 20 20 62 3a 20 20 20 20 20 20 20 41 20 73  *   b:       A s
bad0: 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d  orted, null-term
bae0: 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69  inated linked li
baf0: 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c  st.  (May be nul
bb00: 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20  l)..**   cmp:   
bb10: 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74    A pointer to t
bb20: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
bb30: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 6f 66 66  nction..**   off
bb40: 73 65 74 3a 20 20 4f 66 66 73 65 74 20 69 6e 20  set:  Offset in 
bb50: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  the structure to
bb60: 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c   the "next" fiel
bb70: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
bb80: 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f  Value:.**   A po
bb90: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
bba0: 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69  d of a sorted li
bbb0: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
bbc0: 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  e elements.**   
bbd0: 6f 66 20 62 6f 74 68 20 61 20 61 6e 64 20 62 2e  of both a and b.
bbe0: 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65  .**.** Side effe
bbf0: 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e  cts:.**   The "n
bc00: 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f  ext" pointers fo
bc10: 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  r elements in th
bc20: 65 20 6c 69 73 74 73 20 61 20 61 6e 64 20 62 20  e lists a and b 
bc30: 61 72 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65 64  are.**   changed
bc40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
bc50: 20 2a 6d 65 72 67 65 28 61 2c 62 2c 63 6d 70 2c   *merge(a,b,cmp,
bc60: 6f 66 66 73 65 74 29 0a 63 68 61 72 20 2a 61 3b  offset).char *a;
bc70: 0a 63 68 61 72 20 2a 62 3b 0a 69 6e 74 20 28 2a  .char *b;.int (*
bc80: 63 6d 70 29 28 29 3b 0a 69 6e 74 20 6f 66 66 73  cmp)();.int offs
bc90: 65 74 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 70 74  et;.{.  char *pt
bca0: 72 2c 20 2a 68 65 61 64 3b 0a 0a 20 20 69 66 28  r, *head;..  if(
bcb0: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65 61   a==0 ){.    hea
bcc0: 64 20 3d 20 62 3b 0a 20 20 7d 65 6c 73 65 20 69  d = b;.  }else i
bcd0: 66 28 20 62 3d 3d 30 20 29 7b 0a 20 20 20 20 68  f( b==0 ){.    h
bce0: 65 61 64 20 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  ead = a;.  }else
bcf0: 7b 0a 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29  {.    if( (*cmp)
bd00: 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20 20 20  (a,b)<0 ){.     
bd10: 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20   ptr = a;.      
bd20: 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20  a = NEXT(a);.   
bd30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 74   }else{.      pt
bd40: 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  r = b;.      b =
bd50: 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 7d 0a   NEXT(b);.    }.
bd60: 20 20 20 20 68 65 61 64 20 3d 20 70 74 72 3b 0a      head = ptr;.
bd70: 20 20 20 20 77 68 69 6c 65 28 20 61 20 26 26 20      while( a && 
bd80: 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  b ){.      if( (
bd90: 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a  *cmp)(a,b)<0 ){.
bda0: 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72          NEXT(ptr
bdb0: 29 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70  ) = a;.        p
bdc0: 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  tr = a;.        
bdd0: 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20  a = NEXT(a);.   
bde0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bdf0: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b    NEXT(ptr) = b;
be00: 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 62  .        ptr = b
be10: 3b 0a 20 20 20 20 20 20 20 20 62 20 3d 20 4e 45  ;.        b = NE
be20: 58 54 28 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  XT(b);.      }. 
be30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 20 29     }.    if( a )
be40: 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a   NEXT(ptr) = a;.
be50: 20 20 20 20 65 6c 73 65 20 20 20 20 4e 45 58 54      else    NEXT
be60: 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 7d 0a 20  (ptr) = b;.  }. 
be70: 20 72 65 74 75 72 6e 20 68 65 61 64 3b 0a 7d 0a   return head;.}.
be80: 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a  ./*.** Inputs:.*
be90: 2a 20 20 20 6c 69 73 74 3a 20 20 20 20 20 20 50  *   list:      P
bea0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
beb0: 6c 79 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ly-linked list o
bec0: 66 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a  f structures..**
bed0: 20 20 20 6e 65 78 74 3a 20 20 20 20 20 20 50 6f     next:      Po
bee0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 65 72  inter to pointer
bef0: 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 65   to the second e
bf00: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
bf10: 73 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20  st..**   cmp:   
bf20: 20 20 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e      A comparison
bf30: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
bf40: 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a   Return Value:.*
bf50: 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  *   A pointer to
bf60: 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 73   the head of a s
bf70: 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61  orted list conta
bf80: 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e  ining the elemen
bf90: 74 73 0a 2a 2a 20 20 20 6f 72 67 69 6e 61 6c 6c  ts.**   orginall
bfa0: 79 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  y in list..**.**
bfb0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
bfc0: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
bfd0: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
bfe0: 65 6e 74 73 20 69 6e 20 6c 69 73 74 20 61 72 65  ents in list are
bff0: 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65   changed..*/.#de
c000: 66 69 6e 65 20 4c 49 53 54 53 49 5a 45 20 33 30  fine LISTSIZE 30
c010: 0a 63 68 61 72 20 2a 6d 73 6f 72 74 28 6c 69 73  .char *msort(lis
c020: 74 2c 6e 65 78 74 2c 63 6d 70 29 0a 63 68 61 72  t,next,cmp).char
c030: 20 2a 6c 69 73 74 3b 0a 63 68 61 72 20 2a 2a 6e   *list;.char **n
c040: 65 78 74 3b 0a 69 6e 74 20 28 2a 63 6d 70 29 28  ext;.int (*cmp)(
c050: 29 3b 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  );.{.  unsigned 
c060: 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20 63  long offset;.  c
c070: 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72 20  har *ep;.  char 
c080: 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a  *set[LISTSIZE];.
c090: 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65    int i;.  offse
c0a0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t = (unsigned lo
c0b0: 6e 67 29 6e 65 78 74 20 2d 20 28 75 6e 73 69 67  ng)next - (unsig
c0c0: 6e 65 64 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20  ned long)list;. 
c0d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
c0e0: 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69  SIZE; i++) set[i
c0f0: 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  ] = 0;.  while( 
c100: 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d  list ){.    ep =
c110: 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20   list;.    list 
c120: 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20  = NEXT(list);.  
c130: 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a    NEXT(ep) = 0;.
c140: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c      for(i=0; i<L
c150: 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74  ISTSIZE-1 && set
c160: 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  [i]!=0; i++){.  
c170: 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65      ep = merge(e
c180: 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66  p,set[i],cmp,off
c190: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b  set);.      set[
c1a0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
c1b0: 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20    set[i] = ep;. 
c1c0: 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66   }.  ep = 0;.  f
c1d0: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
c1e0: 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74  ZE; i++) if( set
c1f0: 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65  [i] ) ep = merge
c200: 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f  (ep,set[i],cmp,o
c210: 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e  ffset);.  return
c220: 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   ep;.}./********
c230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c240: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
c250: 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a  option.c" ******
c260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c270: 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ****/.static cha
c280: 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63  r **argv;.static
c290: 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e   struct s_option
c2a0: 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49  s *op;.static FI
c2b0: 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a  LE *errstream;..
c2c0: 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29  #define ISOPT(X)
c2d0: 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28   ((X)[0]=='-'||(
c2e0: 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63  X)[0]=='+'||strc
c2f0: 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a  hr((X),'=')!=0).
c300: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
c310: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69   command line wi
c320: 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e  th a carrot poin
c330: 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68  ting to the k-th
c340: 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66   character.** of
c350: 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e   the n-th field.
c360: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c370: 65 72 72 6c 69 6e 65 28 6e 2c 6b 2c 65 72 72 29  errline(n,k,err)
c380: 0a 69 6e 74 20 6e 3b 0a 69 6e 74 20 6b 3b 0a 46  .int n;.int k;.F
c390: 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e  ILE *err;.{.  in
c3a0: 74 20 73 70 63 6e 74 2c 20 69 3b 0a 20 20 73 70  t spcnt, i;.  sp
c3b0: 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 61  cnt = 0;.  if( a
c3c0: 72 67 76 5b 30 5d 20 29 20 66 70 72 69 6e 74 66  rgv[0] ) fprintf
c3d0: 28 65 72 72 2c 22 25 73 22 2c 61 72 67 76 5b 30  (err,"%s",argv[0
c3e0: 5d 29 3b 0a 20 20 73 70 63 6e 74 20 3d 20 73 74  ]);.  spcnt = st
c3f0: 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20  rlen(argv[0]) + 
c400: 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  1;.  for(i=1; i<
c410: 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b  n && argv[i]; i+
c420: 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  +){.    fprintf(
c430: 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69  err," %s",argv[i
c440: 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d  ]);.    spcnt +=
c450: 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d 2b   strlen(argv[i]+
c460: 31 29 3b 0a 20 20 7d 0a 20 20 73 70 63 6e 74 20  1);.  }.  spcnt 
c470: 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20 61 72  += k;.  for(; ar
c480: 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69  gv[i]; i++) fpri
c490: 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72  ntf(err," %s",ar
c4a0: 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20 73 70  gv[i]);.  if( sp
c4b0: 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20 66 70  cnt<20 ){.    fp
c4c0: 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73  rintf(err,"\n%*s
c4d0: 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70 63 6e  ^-- here\n",spcn
c4e0: 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t,"");.  }else{.
c4f0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
c500: 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e  "\n%*shere --^\n
c510: 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b 0a 20  ",spcnt-7,"");. 
c520: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
c530: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
c540: 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69  the N-th non-swi
c550: 74 63 68 20 61 72 67 75 6d 65 6e 74 2e 20 20 52  tch argument.  R
c560: 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e  eturn -1.** if N
c570: 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
c580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c590: 61 72 67 69 6e 64 65 78 28 6e 29 0a 69 6e 74 20  argindex(n).int 
c5a0: 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n;.{.  int i;.  
c5b0: 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30  int dashdash = 0
c5c0: 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20  ;.  if( argv!=0 
c5d0: 26 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20  && *argv!=0 ){. 
c5e0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76     for(i=1; argv
c5f0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
c600: 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c   if( dashdash ||
c610: 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29   !ISOPT(argv[i])
c620: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
c630: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  n==0 ) return i;
c640: 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  .        n--;.  
c650: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
c660: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
c670: 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61  --")==0 ) dashda
c680: 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  sh = 1;.    }.  
c690: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
c6a0: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 6d  ..static char em
c6b0: 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20  sg[] = "Command 
c6c0: 6c 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f  line syntax erro
c6d0: 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  r: ";../*.** Pro
c6e0: 63 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d  cess a flag comm
c6f0: 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and line argumen
c700: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c710: 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65   handleflags(i,e
c720: 72 72 29 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20  rr).int i;.FILE 
c730: 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 76 3b  *err;.{.  int v;
c740: 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20  .  int errcnt = 
c750: 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f  0;.  int j;.  fo
c760: 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62  r(j=0; op[j].lab
c770: 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  el; j++){.    if
c780: 28 20 73 74 72 63 6d 70 28 26 61 72 67 76 5b 69  ( strcmp(&argv[i
c790: 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c  ][1],op[j].label
c7a0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
c7b0: 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b  }.  v = argv[i][
c7c0: 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b  0]=='-' ? 1 : 0;
c7d0: 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62  .  if( op[j].lab
c7e0: 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  el==0 ){.    if(
c7f0: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70   err ){.      fp
c800: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64  rintf(err,"%sund
c810: 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e  efined option.\n
c820: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65  ",emsg);.      e
c830: 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b  rrline(i,1,err);
c840: 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e  .    }.    errcn
c850: 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  t++;.  }else if(
c860: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
c870: 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28  _FLAG ){.    *((
c880: 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20  int*)op[j].arg) 
c890: 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = v;.  }else if(
c8a0: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
c8b0: 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a  _FFLAG ){.    (*
c8c0: 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a  (void(*)())(op[j
c8d0: 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20 20 7d 65  ].arg))(v);.  }e
c8e0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 65 72 72  lse{.    if( err
c8f0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
c900: 66 28 65 72 72 2c 22 25 73 6d 69 73 73 69 6e 67  f(err,"%smissing
c910: 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69   argument on swi
c920: 74 63 68 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  tch.\n",emsg);. 
c930: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31       errline(i,1
c940: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
c950: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20   errcnt++;.  }. 
c960: 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a   return errcnt;.
c970: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
c980: 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20   a command line 
c990: 73 77 69 74 63 68 20 77 68 69 63 68 20 68 61 73  switch which has
c9a0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
c9b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64  .static int hand
c9c0: 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29 0a  leswitch(i,err).
c9d0: 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72  int i;.FILE *err
c9e0: 3b 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30  ;.{.  int lv = 0
c9f0: 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20 3d 20  ;.  double dv = 
ca00: 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73 76 20  0.0;.  char *sv 
ca10: 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61  = 0, *end;.  cha
ca20: 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a  r *cp;.  int j;.
ca30: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
ca40: 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68 72 28  ;.  cp = strchr(
ca50: 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20  argv[i],'=');.  
ca60: 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a  *cp = 0;.  for(j
ca70: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
ca80: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
ca90: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70  trcmp(argv[i],op
caa0: 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20  [j].label)==0 ) 
cab0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70  break;.  }.  *cp
cac0: 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70   = '=';.  if( op
cad0: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
cae0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
caf0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
cb00: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
cb10: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
cb20: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
cb30: 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  0,err);.    }.  
cb40: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
cb50: 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20  lse{.    cp++;. 
cb60: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
cb70: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
cb80: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
cb90: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
cba0: 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20  AG:.        if( 
cbb0: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  err ){.         
cbc0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
cbd0: 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
cbe0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c  an argument.\n",
cbf0: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  emsg);.         
cc00: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
cc10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
cc20: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
cc30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
cc40: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
cc50: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
cc60: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64  _FDBL:.        d
cc70: 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65  v = strtod(cp,&e
cc80: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nd);.        if(
cc90: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
cca0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
ccb0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
ccc0: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
ccd0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c   character in fl
cce0: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67  oating-point arg
ccf0: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
cd00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
cd10: 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65  line(i,((unsigne
cd20: 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73  d long)end)-(uns
cd30: 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b  igned long)argv[
cd40: 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20  i],err);.       
cd50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
cd60: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  rrcnt++;.       
cd70: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
cd80: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
cd90: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
cda0: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
cdb0: 20 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63     lv = strtol(c
cdc0: 70 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20  p,&end,0);.     
cdd0: 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20     if( *end ){. 
cde0: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
cdf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ce00: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69  fprintf(err,"%si
ce10: 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72  llegal character
ce20: 20 69 6e 20 69 6e 74 65 67 65 72 20 61 72 67 75   in integer argu
ce30: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c              errl
ce50: 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64  ine(i,((unsigned
ce60: 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69   long)end)-(unsi
ce70: 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69  gned long)argv[i
ce80: 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  ],err);.        
ce90: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72    }.          er
cea0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
ceb0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
cec0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
ced0: 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
cee0: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
cef0: 20 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20    sv = cp;.     
cf00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
cf10: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a      switch( op[j
cf20: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
cf30: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
cf40: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
cf50: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65  LAG:.        bre
cf60: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
cf70: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  PT_DBL:.        
cf80: 2a 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d  *(double*)(op[j]
cf90: 2e 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20  .arg) = dv;.    
cfa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
cfb0: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
cfc0: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
cfd0: 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  *)())(op[j].arg)
cfe0: 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(dv);.        b
cff0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
d000: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
d010: 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e    *(int*)(op[j].
d020: 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20  arg) = lv;.     
d030: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d040: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
d050: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
d060: 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  )())(op[j].arg))
d070: 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20  ((int)lv);.     
d080: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d090: 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
d0a0: 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28        *(char**)(
d0b0: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b  op[j].arg) = sv;
d0c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d0d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
d0e0: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28  STR:.        (*(
d0f0: 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d  void(*)())(op[j]
d100: 2e 61 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20  .arg))(sv);.    
d110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d120: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
d130: 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74  rcnt;.}..int Opt
d140: 49 6e 69 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68  Init(a,o,err).ch
d150: 61 72 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73  ar **a;.struct s
d160: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c  _options *o;.FIL
d170: 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20  E *err;.{.  int 
d180: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72  errcnt = 0;.  ar
d190: 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f  gv = a;.  op = o
d1a0: 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20  ;.  errstream = 
d1b0: 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20  err;.  if( argv 
d1c0: 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29  && *argv && op )
d1d0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
d1e0: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
d1f0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
d200: 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  f( argv[i][0]=='
d210: 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d  +' || argv[i][0]
d220: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
d230: 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c   errcnt += handl
d240: 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20  eflags(i,err);. 
d250: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
d260: 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d  trchr(argv[i],'=
d270: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  ') ){.        er
d280: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77  rcnt += handlesw
d290: 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20  itch(i,err);.   
d2a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
d2b0: 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b   if( errcnt>0 ){
d2c0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
d2d0: 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20  ,"Valid command 
d2e0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  line options for
d2f0: 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c   \"%s\" are:\n",
d300: 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e  *a);.    OptPrin
d310: 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  t();.    exit(1)
d320: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
d330: 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67  ;.}..int OptNArg
d340: 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  s(){.  int cnt =
d350: 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61   0;.  int dashda
d360: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
d370: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
d380: 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a  & argv[0]!=0 ){.
d390: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67      for(i=1; arg
d3a0: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
d3b0: 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c    if( dashdash |
d3c0: 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d  | !ISOPT(argv[i]
d3d0: 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
d3e0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
d3f0: 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64  [i],"--")==0 ) d
d400: 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20  ashdash = 1;.   
d410: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d420: 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70  cnt;.}..char *Op
d430: 74 41 72 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  tArg(n).int n;.{
d440: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
d450: 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72  argindex(n);.  r
d460: 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67  eturn i>=0 ? arg
d470: 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69  v[i] : 0;.}..voi
d480: 64 20 4f 70 74 45 72 72 28 6e 29 0a 69 6e 74 20  d OptErr(n).int 
d490: 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n;.{.  int i;.  
d4a0: 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b  i = argindex(n);
d4b0: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72  .  if( i>=0 ) er
d4c0: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72  rline(i,0,errstr
d4d0: 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70  eam);.}..void Op
d4e0: 74 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20  tPrint(){.  int 
d4f0: 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65  i;.  int max, le
d500: 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20  n;.  max = 0;.  
d510: 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c  for(i=0; op[i].l
d520: 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  abel; i++){.    
d530: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f 70 5b  len = strlen(op[
d540: 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20  i].label) + 1;. 
d550: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d     switch( op[i]
d560: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
d570: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
d580: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
d590: 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61  AG:.        brea
d5a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d5b0: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
d5c0: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
d5d0: 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20      len += 9;   
d5e0: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
d5f0: 20 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a   "<integer>" */.
d600: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d610: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
d620: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  L:.      case OP
d630: 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  T_FDBL:.        
d640: 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20 20  len += 6;       
d650: 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72  /* length of "<r
d660: 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  eal>" */.       
d670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
d680: 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20  se OPT_STR:.    
d690: 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a    case OPT_FSTR:
d6a0: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
d6b0: 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  8;       /* leng
d6c0: 74 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22  th of "<string>"
d6d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
d6e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
d6f0: 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d   len>max ) max =
d700: 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   len;.  }.  for(
d710: 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c  i=0; op[i].label
d720: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74  ; i++){.    swit
d730: 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29  ch( op[i].type )
d740: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  {.      case OPT
d750: 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73  _FLAG:.      cas
d760: 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20  e OPT_FFLAG:.   
d770: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
d780: 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20  stream,"  -%-*s 
d790: 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d   %s\n",max,op[i]
d7a0: 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73  .label,op[i].mes
d7b0: 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  sage);.        b
d7c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
d7d0: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
d7e0: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
d7f0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
d800: 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c  rrstream,"  %s=<
d810: 69 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73 5c  integer>%*s  %s\
d820: 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a  n",op[i].label,.
d830: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
d840: 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69 5d  max-strlen(op[i]
d850: 2e 6c 61 62 65 6c 29 2d 39 29 2c 22 22 2c 6f 70  .label)-9),"",op
d860: 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20  [i].message);.  
d870: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d880: 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a     case OPT_DBL:
d890: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d8a0: 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 66 70  FDBL:.        fp
d8b0: 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c  rintf(errstream,
d8c0: 22 20 20 25 73 3d 3c 72 65 61 6c 3e 25 2a 73 20  "  %s=<real>%*s 
d8d0: 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62   %s\n",op[i].lab
d8e0: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69  el,.          (i
d8f0: 6e 74 29 28 6d 61 78 2d 73 74 72 6c 65 6e 28 6f  nt)(max-strlen(o
d900: 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22  p[i].label)-6),"
d910: 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29  ",op[i].message)
d920: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d930: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d940: 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
d950: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
d960: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
d970: 65 61 6d 2c 22 20 20 25 73 3d 3c 73 74 72 69 6e  eam,"  %s=<strin
d980: 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b  g>%*s  %s\n",op[
d990: 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20  i].label,.      
d9a0: 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 73 74      (int)(max-st
d9b0: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
d9c0: 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-8),"",op[i].me
d9d0: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
d9e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
d9f0: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
da00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
da10: 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65   the file "parse
da20: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
da30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da40: 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69  /./*.** Input fi
da50: 6c 65 20 70 61 72 73 65 72 20 66 6f 72 20 74 68  le parser for th
da60: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
da70: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
da80: 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   The state of th
da90: 65 20 70 61 72 73 65 72 20 2a 2f 0a 73 74 72 75  e parser */.stru
daa0: 63 74 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68  ct pstate {.  ch
dab0: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
dac0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
dad0: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
dae0: 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65  .  int tokenline
daf0: 6e 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65  no;      /* Line
db00: 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20  number at which 
db10: 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74  current token st
db20: 61 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72  arts */.  int er
db30: 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20  rorcnt;         
db40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
db50: 6f 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ors so far */.  
db60: 63 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74  char *tokenstart
db70: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  ;     /* Text of
db80: 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a   current token *
db90: 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  /.  struct lemon
dba0: 20 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f   *gp;     /* Glo
dbb0: 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72  bal state vector
dbc0: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61   */.  enum e_sta
dbd0: 74 65 20 7b 0a 20 20 20 20 49 4e 49 54 49 41 4c  te {.    INITIAL
dbe0: 49 5a 45 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  IZE,.    WAITING
dbf0: 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
dc00: 45 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  E,.    WAITING_F
dc10: 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c  OR_DECL_KEYWORD,
dc20: 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  .    WAITING_FOR
dc30: 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20 20 20 57  _DECL_ARG,.    W
dc40: 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45  AITING_FOR_PRECE
dc50: 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20  DENCE_SYMBOL,.  
dc60: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52    WAITING_FOR_AR
dc70: 52 4f 57 2c 0a 20 20 20 20 49 4e 5f 52 48 53 2c  ROW,.    IN_RHS,
dc80: 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31  .    LHS_ALIAS_1
dc90: 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f  ,.    LHS_ALIAS_
dca0: 32 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53  2,.    LHS_ALIAS
dcb0: 5f 33 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41  _3,.    RHS_ALIA
dcc0: 53 5f 31 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49  S_1,.    RHS_ALI
dcd0: 41 53 5f 32 2c 0a 20 20 20 20 50 52 45 43 45 44  AS_2,.    PRECED
dce0: 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 20  ENCE_MARK_1,.   
dcf0: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
dd00: 5f 32 2c 0a 20 20 20 20 52 45 53 59 4e 43 5f 41  _2,.    RESYNC_A
dd10: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c  FTER_RULE_ERROR,
dd20: 0a 20 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45  .    RESYNC_AFTE
dd30: 52 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20  R_DECL_ERROR,.  
dd40: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
dd50: 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c  STRUCTOR_SYMBOL,
dd60: 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  .    WAITING_FOR
dd70: 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c  _DATATYPE_SYMBOL
dd80: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
dd90: 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 0a 20 20  R_FALLBACK_ID.  
dda0: 7d 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  } state;        
ddb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ddc0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
ddd0: 61 72 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63  arser */.  struc
dde0: 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61  t symbol *fallba
ddf0: 63 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66 61 6c  ck;   /* The fal
de00: 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20  lback token */. 
de10: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
de20: 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  lhs;        /* L
de30: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  eft-hand side of
de40: 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f   current rule */
de50: 0a 20 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61  .  char *lhsalia
de60: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
de70: 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c   Alias for the L
de80: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73  HS */.  int nrhs
de90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dea0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
deb0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
dec0: 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a  symbols seen */.
ded0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
dee0: 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f  *rhs[MAXRHS];  /
def0: 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f  * RHS symbols */
df00: 0a 20 20 63 68 61 72 20 2a 61 6c 69 61 73 5b 4d  .  char *alias[M
df10: 41 58 52 48 53 5d 3b 20 20 20 20 20 20 20 2f 2a  AXRHS];       /*
df20: 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65 61 63   Aliases for eac
df30: 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72  h RHS symbol (or
df40: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75   NULL) */.  stru
df50: 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72 75 6c  ct rule *prevrul
df60: 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f  e;     /* Previo
df70: 75 73 20 72 75 6c 65 20 70 61 72 73 65 64 20 2a  us rule parsed *
df80: 2f 0a 20 20 63 68 61 72 20 2a 64 65 63 6c 6b 65  /.  char *declke
df90: 79 77 6f 72 64 3b 20 20 20 20 20 20 20 20 20 2f  yword;         /
dfa0: 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61 20 64  * Keyword of a d
dfb0: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  eclaration */.  
dfc0: 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c  char **declargsl
dfd0: 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ot;        /* Wh
dfe0: 65 72 65 20 74 68 65 20 64 65 63 6c 61 72 61 74  ere the declarat
dff0: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  ion argument sho
e000: 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a 20 20  uld be put */.  
e010: 69 6e 74 20 2a 64 65 63 6c 6c 6e 73 6c 6f 74 3b  int *decllnslot;
e020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
e030: 65 72 65 20 74 68 65 20 64 65 63 6c 61 72 61 74  ere the declarat
e040: 69 6f 6e 20 6c 69 6e 65 6e 75 6d 62 65 72 20 69  ion linenumber i
e050: 73 20 70 75 74 20 2a 2f 0a 20 20 65 6e 75 6d 20  s put */.  enum 
e060: 65 5f 61 73 73 6f 63 20 64 65 63 6c 61 73 73 6f  e_assoc declasso
e070: 63 3b 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20  c;    /* Assign 
e080: 74 68 69 73 20 61 73 73 6f 63 69 61 74 69 6f 6e  this association
e090: 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e   to decl argumen
e0a0: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63  ts */.  int prec
e0b0: 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20  counter;        
e0c0: 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69     /* Assign thi
e0d0: 73 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20  s precedence to 
e0e0: 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a  decl arguments *
e0f0: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
e100: 2a 66 69 72 73 74 72 75 6c 65 3b 20 20 20 20 2f  *firstrule;    /
e110: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72  * Pointer to fir
e120: 73 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  st rule in the g
e130: 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 73 74 72 75  rammar */.  stru
e140: 63 74 20 72 75 6c 65 20 2a 6c 61 73 74 72 75 6c  ct rule *lastrul
e150: 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  e;     /* Pointe
e160: 72 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  r to the most re
e170: 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 72 75  cently parsed ru
e180: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72  le */.};../* Par
e190: 73 65 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65  se a single toke
e1a0: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n */.static void
e1b0: 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 70   parseonetoken(p
e1c0: 73 70 29 0a 73 74 72 75 63 74 20 70 73 74 61 74  sp).struct pstat
e1d0: 65 20 2a 70 73 70 3b 0a 7b 0a 20 20 63 68 61 72  e *psp;.{.  char
e1e0: 20 2a 78 3b 0a 20 20 78 20 3d 20 53 74 72 73 61   *x;.  x = Strsa
e1f0: 66 65 28 70 73 70 2d 3e 74 6f 6b 65 6e 73 74 61  fe(psp->tokensta
e200: 72 74 29 3b 20 20 20 20 20 2f 2a 20 53 61 76 65  rt);     /* Save
e210: 20 74 68 65 20 74 6f 6b 65 6e 20 70 65 72 6d 61   the token perma
e220: 6e 65 6e 74 6c 79 20 2a 2f 0a 23 69 66 20 30 0a  nently */.#if 0.
e230: 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25 64 3a    printf("%s:%d:
e240: 20 54 6f 6b 65 6e 3d 5b 25 73 5d 20 73 74 61 74   Token=[%s] stat
e250: 65 3d 25 64 5c 6e 22 2c 70 73 70 2d 3e 66 69 6c  e=%d\n",psp->fil
e260: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
e270: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 78 2c 70 73  lineno,.    x,ps
e280: 70 2d 3e 73 74 61 74 65 29 3b 0a 23 65 6e 64 69  p->state);.#endi
e290: 66 0a 20 20 73 77 69 74 63 68 28 20 70 73 70 2d  f.  switch( psp-
e2a0: 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  >state ){.    ca
e2b0: 73 65 20 49 4e 49 54 49 41 4c 49 5a 45 3a 0a 20  se INITIALIZE:. 
e2c0: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
e2d0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73  le = 0;.      ps
e2e0: 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 20 3d  p->preccounter =
e2f0: 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 66   0;.      psp->f
e300: 69 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e  irstrule = psp->
e310: 6c 61 73 74 72 75 6c 65 20 3d 20 30 3b 0a 20 20  lastrule = 0;.  
e320: 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75      psp->gp->nru
e330: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a  le = 0;.      /*
e340: 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20 6e 65   Fall thru to ne
e350: 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 63  xt case */.    c
e360: 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
e370: 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3a 0a 20 20  DECL_OR_RULE:.  
e380: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25      if( x[0]=='%
e390: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
e3a0: 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
e3b0: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f  G_FOR_DECL_KEYWO
e3c0: 52 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  RD;.      }else 
e3d0: 69 66 28 20 69 73 6c 6f 77 65 72 28 78 5b 30 5d  if( islower(x[0]
e3e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ) ){.        psp
e3f0: 2d 3e 6c 68 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e  ->lhs = Symbol_n
e400: 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
e410: 73 70 2d 3e 6e 72 68 73 20 3d 20 30 3b 0a 20 20  sp->nrhs = 0;.  
e420: 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c        psp->lhsal
e430: 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ias = 0;.       
e440: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
e450: 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3b  ITING_FOR_ARROW;
e460: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e470: 20 78 5b 30 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20   x[0]=='{' ){.  
e480: 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 70        if( psp->p
e490: 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20  revrule==0 ){.  
e4a0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
e4b0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
e4c0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
e4d0: 0a 22 54 68 65 72 65 20 69 73 20 6e 6f 74 20 70  ."There is not p
e4e0: 72 69 6f 72 20 72 75 6c 65 20 6f 70 6f 6e 20 77  rior rule opon w
e4f0: 68 69 63 68 20 74 6f 20 61 74 74 61 63 68 20 74  hich to attach t
e500: 68 65 20 63 6f 64 65 20 5c 0a 66 72 61 67 6d 65  he code \.fragme
e510: 6e 74 20 77 68 69 63 68 20 62 65 67 69 6e 73 20  nt which begins 
e520: 6f 6e 20 74 68 69 73 20 6c 69 6e 65 2e 22 29 3b  on this line.");
e530: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
e540: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c  errorcnt++;..}el
e550: 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76  se if( psp->prev
e560: 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b  rule->code!=0 ){
e570: 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
e580: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
e590: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
e5a0: 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65  no,."Code fragme
e5b0: 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20  nt beginning on 
e5c0: 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
e5d0: 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20   the first \.to 
e5e0: 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69  follow the previ
e5f0: 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20  ous rule.");.   
e600: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
e610: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
e620: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e630: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
e640: 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65  line = psp->toke
e650: 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20  nlineno;.       
e660: 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
e670: 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a  ->code = &x[1];.
e680: 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .}.      }else i
e690: 66 28 20 78 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a  f( x[0]=='[' ){.
e6a0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
e6b0: 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f  te = PRECEDENCE_
e6c0: 4d 41 52 4b 5f 31 3b 0a 20 20 20 20 20 20 7d 65  MARK_1;.      }e
e6d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
e6e0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
e6f0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
e700: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
e710: 22 54 6f 6b 65 6e 20 5c 22 25 73 5c 22 20 73 68  "Token \"%s\" sh
e720: 6f 75 6c 64 20 62 65 20 65 69 74 68 65 72 20 5c  ould be either \
e730: 22 25 25 5c 22 20 6f 72 20 61 20 6e 6f 6e 74 65  "%%\" or a nonte
e740: 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20  rminal name.",. 
e750: 20 20 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20           x);.   
e760: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
e770: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
e780: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
e790: 61 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  ase PRECEDENCE_M
e7a0: 41 52 4b 5f 31 3a 0a 20 20 20 20 20 20 69 66 28  ARK_1:.      if(
e7b0: 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20   !isupper(x[0]) 
e7c0: 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
e7d0: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
e7e0: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
e7f0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54  no,.          "T
e800: 68 65 20 70 72 65 63 65 64 65 6e 63 65 20 73 79  he precedence sy
e810: 6d 62 6f 6c 20 6d 75 73 74 20 62 65 20 61 20 74  mbol must be a t
e820: 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20 20 20 20  erminal.");.    
e830: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
e840: 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t++;.      }else
e850: 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
e860: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
e870: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
e880: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
e890: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
e8a0: 20 20 20 20 22 54 68 65 72 65 20 69 73 20 6e 6f      "There is no
e8b0: 20 70 72 69 6f 72 20 72 75 6c 65 20 74 6f 20 61   prior rule to a
e8c0: 73 73 69 67 6e 20 70 72 65 63 65 64 65 6e 63 65  ssign precedence
e8d0: 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a   \"[%s]\".",x);.
e8e0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
e8f0: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
e900: 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72  else if( psp->pr
e910: 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 21  evrule->precsym!
e920: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
e930: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
e940: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
e950: 69 6e 65 6e 6f 2c 0a 22 50 72 65 63 65 64 65 6e  ineno,."Preceden
e960: 63 65 20 6d 61 72 6b 20 6f 6e 20 74 68 69 73 20  ce mark on this 
e970: 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20  line is not the 
e980: 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f  first \.to follo
e990: 77 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  w the previous r
e9a0: 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ule.");.        
e9b0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
e9c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e9d0: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
e9e0: 75 6c 65 2d 3e 70 72 65 63 73 79 6d 20 3d 20 53  ule->precsym = S
e9f0: 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
ea00: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d      }.      psp-
ea10: 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45 44 45  >state = PRECEDE
ea20: 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20 20 20 20  NCE_MARK_2;.    
ea30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
ea40: 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52  e PRECEDENCE_MAR
ea50: 4b 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78  K_2:.      if( x
ea60: 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20  [0]!=']' ){.    
ea70: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
ea80: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
ea90: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
eaa0: 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20         "Missing 
eab0: 5c 22 5d 5c 22 20 6f 6e 20 70 72 65 63 65 64 65  \"]\" on precede
eac0: 6e 63 65 20 6d 61 72 6b 2e 22 29 3b 0a 20 20 20  nce mark.");.   
ead0: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
eae0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
eaf0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
eb00: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
eb10: 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
eb20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
eb30: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52   WAITING_FOR_ARR
eb40: 4f 57 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  OW:.      if( x[
eb50: 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d  0]==':' && x[1]=
eb60: 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d  =':' && x[2]=='=
eb70: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
eb80: 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53  ->state = IN_RHS
eb90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
eba0: 28 20 78 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a 20  ( x[0]=='(' ){. 
ebb0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
ebc0: 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3b  e = LHS_ALIAS_1;
ebd0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ebe0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
ebf0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
ec00: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
ec10: 20 20 20 20 20 20 20 20 20 22 45 78 70 65 63 74           "Expect
ec20: 65 64 20 74 6f 20 73 65 65 20 61 20 5c 22 3a 5c  ed to see a \":\
ec30: 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  " following the 
ec40: 4c 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c  LHS symbol \"%s\
ec50: 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ".",.          p
ec60: 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  sp->lhs->name);.
ec70: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
ec80: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
ec90: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
eca0: 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
ecb0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
ecc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ecd0: 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 31  case LHS_ALIAS_1
ece0: 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c  :.      if( isal
ecf0: 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
ed00: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69       psp->lhsali
ed10: 61 73 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  as = x;.        
ed20: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53  psp->state = LHS
ed30: 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20  _ALIAS_2;.      
ed40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
ed50: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
ed60: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
ed70: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
ed80: 20 20 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74    "\"%s\" is not
ed90: 20 61 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66   a valid alias f
eda0: 6f 72 20 74 68 65 20 4c 48 53 20 5c 22 25 73 5c  or the LHS \"%s\
edb0: 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "\n",.          
edc0: 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  x,psp->lhs->name
edd0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
ede0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
edf0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
ee00: 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55   RESYNC_AFTER_RU
ee10: 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  LE_ERROR;.      
ee20: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ee30: 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41     case LHS_ALIA
ee40: 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78  S_2:.      if( x
ee50: 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20  [0]==')' ){.    
ee60: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
ee70: 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3b 0a 20 20   LHS_ALIAS_3;.  
ee80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee90: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
eea0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
eeb0: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
eec0: 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c        "Missing \
eed0: 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c  ")\" following L
eee0: 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22  HS alias name \"
eef0: 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61  %s\".",psp->lhsa
ef00: 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70  lias);.        p
ef10: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
ef20: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
ef30: 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
ef40: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20  R_RULE_ERROR;.  
ef50: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ef60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f  k;.    case LHS_
ef70: 41 4c 49 41 53 5f 33 3a 0a 20 20 20 20 20 20 69  ALIAS_3:.      i
ef80: 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20  f( x[0]==':' && 
ef90: 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32  x[1]==':' && x[2
efa0: 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='=' ){.      
efb0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49    psp->state = I
efc0: 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c  N_RHS;.      }el
efd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
efe0: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
eff0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f000: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
f010: 4d 69 73 73 69 6e 67 20 5c 22 2d 3e 5c 22 20 66  Missing \"->\" f
f020: 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25 73 28 25  ollowing: \"%s(%
f030: 73 29 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20  s)\".",.        
f040: 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d     psp->lhs->nam
f050: 65 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29  e,psp->lhsalias)
f060: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f070: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f080: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f090: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
f0a0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
f0b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f0c0: 20 20 63 61 73 65 20 49 4e 5f 52 48 53 3a 0a 20    case IN_RHS:. 
f0d0: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
f0e0: 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  .' ){.        st
f0f0: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
f100: 20 20 20 20 20 20 20 72 70 20 3d 20 28 73 74 72         rp = (str
f110: 75 63 74 20 72 75 6c 65 20 2a 29 6d 61 6c 6c 6f  uct rule *)mallo
f120: 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
f130: 20 72 75 6c 65 29 20 2b 20 0a 20 20 20 20 20 20   rule) + .      
f140: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 73 74         sizeof(st
f150: 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 70 73  ruct symbol*)*ps
f160: 70 2d 3e 6e 72 68 73 20 2b 20 73 69 7a 65 6f 66  p->nrhs + sizeof
f170: 28 63 68 61 72 2a 29 2a 70 73 70 2d 3e 6e 72 68  (char*)*psp->nrh
f180: 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s );.        if(
f190: 20 72 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   rp==0 ){.      
f1a0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f1b0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f1c0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
f1d0: 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20           "Can't 
f1e0: 61 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20  allocate enough 
f1f0: 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 69 73 20  memory for this 
f200: 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  rule.");.       
f210: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f220: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
f230: 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b  p->prevrule = 0;
f240: 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20  ..}else{.       
f250: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
f260: 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65      rp->ruleline
f270: 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e   = psp->tokenlin
f280: 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  eno;.          r
f290: 70 2d 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74  p->rhs = (struct
f2a0: 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d   symbol**)&rp[1]
f2b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
f2c0: 72 68 73 61 6c 69 61 73 20 3d 20 28 63 68 61 72  rhsalias = (char
f2d0: 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70 73 70  **)&(rp->rhs[psp
f2e0: 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20 20 20  ->nrhs]);.      
f2f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
f300: 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  sp->nrhs; i++){.
f310: 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e              rp->
f320: 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 72 68  rhs[i] = psp->rh
f330: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
f340: 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69    rp->rhsalias[i
f350: 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73 5b 69  ] = psp->alias[i
f360: 5d 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20 20  ];..  }.        
f370: 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d    rp->lhs = psp-
f380: 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  >lhs;.          
f390: 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70  rp->lhsalias = p
f3a0: 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20  sp->lhsalias;.  
f3b0: 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72 68 73          rp->nrhs
f3c0: 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20   = psp->nrhs;.  
f3d0: 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65          rp->code
f3e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f3f0: 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 30 3b  rp->precsym = 0;
f400: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 69  .          rp->i
f410: 6e 64 65 78 20 3d 20 70 73 70 2d 3e 67 70 2d 3e  ndex = psp->gp->
f420: 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 20  nrule++;.       
f430: 20 20 20 72 70 2d 3e 6e 65 78 74 6c 68 73 20 3d     rp->nextlhs =
f440: 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a   rp->lhs->rule;.
f450: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
f460: 73 2d 3e 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20  s->rule = rp;.  
f470: 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74          rp->next
f480: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
f490: 69 66 28 20 70 73 70 2d 3e 66 69 72 73 74 72 75  if( psp->firstru
f4a0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
f4b0: 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72       psp->firstr
f4c0: 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72  ule = psp->lastr
f4d0: 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d 65 6c  ule = rp;..  }el
f4e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
f4f0: 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e  psp->lastrule->n
f500: 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ext = rp;.      
f510: 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72        psp->lastr
f520: 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d 0a 20  ule = rp;..  }. 
f530: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
f540: 65 76 72 75 6c 65 20 3d 20 72 70 3b 0a 09 7d 0a  evrule = rp;..}.
f550: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f560: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
f570: 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
f580: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f590: 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a  salpha(x[0]) ){.
f5a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
f5b0: 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b  >nrhs>=MAXRHS ){
f5c0: 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
f5d0: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f5e0: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f5f0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
f600: 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c  "Too many symbol
f610: 20 6f 6e 20 52 48 53 20 6f 72 20 72 75 6c 65 20   on RHS or rule 
f620: 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25  beginning at \"%
f630: 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  s\".",.         
f640: 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20     x);.         
f650: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f660: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
f670: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
f680: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
f690: 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20  ;..}else{.      
f6a0: 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70      psp->rhs[psp
f6b0: 2d 3e 6e 72 68 73 5d 20 3d 20 53 79 6d 62 6f 6c  ->nrhs] = Symbol
f6c0: 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
f6d0: 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73     psp->alias[ps
f6e0: 70 2d 3e 6e 72 68 73 5d 20 3d 20 30 3b 0a 20 20  p->nrhs] = 0;.  
f6f0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68          psp->nrh
f700: 73 2b 2b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65  s++;..}.      }e
f710: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28  lse if( x[0]=='(
f720: 27 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30  ' && psp->nrhs>0
f730: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
f740: 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49  >state = RHS_ALI
f750: 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  AS_1;.      }els
f760: 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
f770: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f780: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f790: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49  no,.          "I
f7a0: 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72  llegal character
f7b0: 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a   on RHS of rule:
f7c0: 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20   \"%s\".",x);.  
f7d0: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f7e0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
f7f0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
f800: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
f810: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
f820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
f830: 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a  se RHS_ALIAS_1:.
f840: 20 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68        if( isalph
f850: 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
f860: 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73     psp->alias[ps
f870: 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a  p->nrhs-1] = x;.
f880: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f890: 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32  te = RHS_ALIAS_2
f8a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f8b0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f8c0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f8d0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f8e0: 20 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c            "\"%s\
f8f0: 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  " is not a valid
f900: 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52   alias for the R
f910: 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22  HS symbol \"%s\"
f920: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  \n",.          x
f930: 2c 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e  ,psp->rhs[psp->n
f940: 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  rhs-1]->name);. 
f950: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f960: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
f970: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
f980: 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
f990: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
f9a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
f9b0: 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a  ase RHS_ALIAS_2:
f9c0: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
f9d0: 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =')' ){.        
f9e0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f  psp->state = IN_
f9f0: 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  RHS;.      }else
fa00: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
fa10: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
fa20: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
fa30: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
fa40: 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c  ssing \")\" foll
fa50: 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20  owing LHS alias 
fa60: 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73  name \"%s\".",ps
fa70: 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
fa80: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
fa90: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
faa0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
fab0: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
fac0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
fad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
fae0: 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  se WAITING_FOR_D
faf0: 45 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20  ECL_KEYWORD:.   
fb00: 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78     if( isalpha(x
fb10: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
fb20: 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64  psp->declkeyword
fb30: 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73   = x;.        ps
fb40: 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
fb50: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
fb60: 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 30 3b  >decllnslot = 0;
fb70: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
fb80: 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
fb90: 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20  R_DECL_ARG;.    
fba0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 78      if( strcmp(x
fbb0: 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"name")==0 ){. 
fbc0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
fbd0: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
fbe0: 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b 0a 09 7d  p->gp->name);..}
fbf0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
fc00: 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20  x,"include")==0 
fc10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
fc20: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
fc30: 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75  &(psp->gp->inclu
fc40: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  de);.          p
fc50: 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d  sp->decllnslot =
fc60: 20 26 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75   &psp->gp->inclu
fc70: 64 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28  deln;..}else if(
fc80: 20 73 74 72 63 6d 70 28 78 2c 22 63 6f 64 65 22   strcmp(x,"code"
fc90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fca0: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
fcb0: 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
fcc0: 65 78 74 72 61 63 6f 64 65 29 3b 0a 20 20 20 20  extracode);.    
fcd0: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
fce0: 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  nslot = &psp->gp
fcf0: 2d 3e 65 78 74 72 61 63 6f 64 65 6c 6e 3b 0a 09  ->extracodeln;..
fd00: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
fd10: 28 78 2c 22 74 6f 6b 65 6e 5f 64 65 73 74 72 75  (x,"token_destru
fd20: 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ctor")==0 ){.   
fd30: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
fd40: 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  argslot = &psp->
fd50: 67 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20  gp->tokendest;. 
fd60: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
fd70: 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d  cllnslot = &psp-
fd80: 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 6c 6e  >gp->tokendestln
fd90: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
fda0: 63 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64  cmp(x,"default_d
fdb0: 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29  estructor")==0 )
fdc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
fdd0: 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
fde0: 70 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74  psp->gp->vardest
fdf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
fe00: 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70  >decllnslot = &p
fe10: 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 6c  sp->gp->vardestl
fe20: 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  n;..}else if( st
fe30: 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 70 72  rcmp(x,"token_pr
fe40: 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  efix")==0 ){.   
fe50: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
fe60: 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  argslot = &psp->
fe70: 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  gp->tokenprefix;
fe80: 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
fe90: 6d 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72  mp(x,"syntax_err
fea0: 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
feb0: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
fec0: 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
fed0: 70 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20 20  p->error);.     
fee0: 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e       psp->declln
fef0: 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
ff00: 3e 65 72 72 6f 72 6c 6e 3b 0a 09 7d 65 6c 73 65  >errorln;..}else
ff10: 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70   if( strcmp(x,"p
ff20: 61 72 73 65 5f 61 63 63 65 70 74 22 29 3d 3d 30  arse_accept")==0
ff30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
ff40: 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
ff50: 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65   &(psp->gp->acce
ff60: 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pt);.          p
ff70: 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d  sp->decllnslot =
ff80: 20 26 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70   &psp->gp->accep
ff90: 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  tln;..}else if( 
ffa0: 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f  strcmp(x,"parse_
ffb0: 66 61 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a  failure")==0 ){.
ffc0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
ffd0: 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
ffe0: 73 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29  sp->gp->failure)
fff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10000 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70  >decllnslot = &p
10010 73 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 6c  sp->gp->failurel
10020 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  n;..}else if( st
10030 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 6f 76  rcmp(x,"stack_ov
10040 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b 0a 20  erflow")==0 ){. 
10050 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10060 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
10070 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 29  p->gp->overflow)
10080 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10090 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70  >decllnslot = &p
100a0 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77  sp->gp->overflow
100b0 6c 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ln;.        }els
100c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
100d0 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 22 29  extra_argument")
100e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
100f0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10100 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61  t = &(psp->gp->a
10110 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  rg);.        }el
10120 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
10130 22 74 6f 6b 65 6e 5f 74 79 70 65 22 29 3d 3d 30  "token_type")==0
10140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10150 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10160 20 26 28 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65   &(psp->gp->toke
10170 6e 74 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20  ntype);.        
10180 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10190 28 78 2c 22 64 65 66 61 75 6c 74 5f 74 79 70 65  (x,"default_type
101a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
101b0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
101c0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
101d0 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 20 20 20  >vartype);.     
101e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
101f0 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a  cmp(x,"stack_siz
10200 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
10210 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10220 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
10230 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20  ->stacksize);.  
10240 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10250 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72 74 5f  strcmp(x,"start_
10260 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20  symbol")==0 ){. 
10270 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10280 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
10290 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20  p->gp->start);. 
102a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
102b0 20 73 74 72 63 6d 70 28 78 2c 22 6c 65 66 74 22   strcmp(x,"left"
102c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
102d0 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74    psp->preccount
102e0 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  er++;.          
102f0 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d  psp->declassoc =
10300 20 4c 45 46 54 3b 0a 20 20 20 20 20 20 20 20 20   LEFT;.         
10310 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
10320 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
10330 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20  ENCE_SYMBOL;.   
10340 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
10350 74 72 63 6d 70 28 78 2c 22 72 69 67 68 74 22 29  trcmp(x,"right")
10360 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10370 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65   psp->preccounte
10380 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r++;.          p
10390 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20  sp->declassoc = 
103a0 52 49 47 48 54 3b 0a 20 20 20 20 20 20 20 20 20  RIGHT;.         
103b0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
103c0 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
103d0 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20  ENCE_SYMBOL;.   
103e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
103f0 74 72 63 6d 70 28 78 2c 22 6e 6f 6e 61 73 73 6f  trcmp(x,"nonasso
10400 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  c")==0 ){.      
10410 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75      psp->preccou
10420 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nter++;.        
10430 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63    psp->declassoc
10440 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20   = NONE;.       
10450 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10460 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
10470 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09  EDENCE_SYMBOL;..
10480 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10490 28 78 2c 22 64 65 73 74 72 75 63 74 6f 72 22 29  (x,"destructor")
104a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
104b0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
104c0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55  ITING_FOR_DESTRU
104d0 43 54 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65  CTOR_SYMBOL;..}e
104e0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
104f0 2c 22 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"type")==0 ){. 
10500 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
10510 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
10520 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
10530 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
10540 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 66   if( strcmp(x,"f
10550 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b 0a  allback")==0 ){.
10560 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66            psp->f
10570 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  allback = 0;.   
10580 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10590 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
105a0 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20 20  FALLBACK_ID;.   
105b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
105c0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
105d0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
105e0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
105f0 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e             "Unkn
10600 6f 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  own declaration 
10610 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c  keyword: \"%%%s\
10620 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ".",x);.        
10630 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10640 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
10650 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
10660 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
10670 52 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73  R;..}.      }els
10680 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
10690 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
106a0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
106b0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49  no,.          "I
106c0 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72 61 74 69  llegal declarati
106d0 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73  on keyword: \"%s
106e0 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
106f0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
10700 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10710 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
10720 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
10730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10740 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
10750 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55  ITING_FOR_DESTRU
10760 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20  CTOR_SYMBOL:.   
10770 20 20 20 69 66 28 20 21 69 73 61 6c 70 68 61 28     if( !isalpha(
10780 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
10790 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
107a0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
107b0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
107c0 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65      "Symbol name
107d0 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20 25   missing after %
107e0 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f  destructor keywo
107f0 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  rd");.        ps
10800 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
10810 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10820 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
10830 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
10840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10850 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
10860 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
10870 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  (x);.        psp
10880 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10890 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b  &sp->destructor;
108a0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
108b0 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  cllnslot = &sp->
108c0 64 65 73 74 72 75 63 74 6f 72 6c 6e 3b 0a 20 20  destructorln;.  
108d0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
108e0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
108f0 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d  ECL_ARG;.      }
10900 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10910 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
10920 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42  OR_DATATYPE_SYMB
10930 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69  OL:.      if( !i
10940 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a  salpha(x[0]) ){.
10950 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
10960 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
10970 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
10980 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
10990 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20  ol name missing 
109a0 61 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f  after %destructo
109b0 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20  r keyword");.   
109c0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
109d0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
109e0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
109f0 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
10a00 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
10a10 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
10a20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
10a30 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
10a40 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10a50 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61  slot = &sp->data
10a60 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70 73  type;.        ps
10a70 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
10a80 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
10a90 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
10aa0 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20  FOR_DECL_ARG;.  
10ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
10ac0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
10ad0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
10ae0 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  CE_SYMBOL:.     
10af0 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
10b00 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
10b10 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
10b20 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
10b30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
10b40 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29   isupper(x[0]) )
10b50 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
10b60 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20   symbol *sp;.   
10b70 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c       sp = Symbol
10b80 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
10b90 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30   if( sp->prec>=0
10ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
10bb0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
10bc0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
10bd0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
10be0 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c     "Symbol \"%s\
10bf0 22 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  " has already be
10c00 20 67 69 76 65 6e 20 61 20 70 72 65 63 65 64 65   given a precede
10c10 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  nce.",x);.      
10c20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
10c30 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20  t++;..}else{.   
10c40 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63 20         sp->prec 
10c50 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74  = psp->preccount
10c60 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70  er;.          sp
10c70 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64  ->assoc = psp->d
10c80 65 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20 20  eclassoc;..}.   
10c90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10ca0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
10cb0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
10cc0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
10cd0 20 20 20 20 20 22 43 61 6e 27 74 20 61 73 73 69       "Can't assi
10ce0 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65 20  gn a precedence 
10cf0 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  to \"%s\".",x);.
10d00 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
10d10 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
10d20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10d30 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
10d40 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20  OR_DECL_ARG:.   
10d50 20 20 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7b     if( (x[0]=='{
10d60 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20  ' || x[0]=='\"' 
10d70 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29  || isalnum(x[0])
10d80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
10d90 20 2a 28 70 73 70 2d 3e 64 65 63 6c 61 72 67 73   *(psp->declargs
10da0 6c 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lot)!=0 ){.     
10db0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10dc0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10dd0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
10de0 20 20 20 20 20 20 20 20 20 20 22 54 68 65 20 61            "The a
10df0 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 74  rgument \"%s\" t
10e00 6f 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 5c 22  o declaration \"
10e10 25 25 25 73 5c 22 20 69 73 20 6e 6f 74 20 74 68  %%%s\" is not th
10e20 65 20 66 69 72 73 74 2e 22 2c 0a 20 20 20 20 20  e first.",.     
10e30 20 20 20 20 20 20 20 78 5b 30 5d 3d 3d 27 5c 22         x[0]=='\"
10e40 27 20 3f 20 26 78 5b 31 5d 20 3a 20 78 2c 70 73  ' ? &x[1] : x,ps
10e50 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 29 3b  p->declkeyword);
10e60 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10e70 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10e80 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10e90 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10ea0 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c  DECL_ERROR;..}el
10eb0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  se{.          *(
10ec0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10ed0 29 20 3d 20 28 78 5b 30 5d 3d 3d 27 5c 22 27 20  ) = (x[0]=='\"' 
10ee0 7c 7c 20 78 5b 30 5d 3d 3d 27 7b 27 29 20 3f 20  || x[0]=='{') ? 
10ef0 26 78 5b 31 5d 20 3a 20 78 3b 0a 20 20 20 20 20  &x[1] : x;.     
10f00 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64 65       if( psp->de
10f10 63 6c 6c 6e 73 6c 6f 74 20 29 20 2a 70 73 70 2d  cllnslot ) *psp-
10f20 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 70 73  >decllnslot = ps
10f30 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
10f40 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
10f50 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
10f60 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
10f70 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ..}.      }else{
10f80 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
10f90 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10fa0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10fb0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c  ,.          "Ill
10fc0 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f  egal argument to
10fd0 20 25 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e   %%%s: %s",psp->
10fe0 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a  declkeyword,x);.
10ff0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11000 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11010 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11020 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
11030 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
11040 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11050 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
11060 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20  _FALLBACK_ID:.  
11070 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e      if( x[0]=='.
11080 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
11090 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
110a0 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
110b0 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  LE;.      }else 
110c0 69 66 28 20 21 69 73 75 70 70 65 72 28 78 5b 30  if( !isupper(x[0
110d0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
110e0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
110f0 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
11100 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
11110 20 20 22 25 25 66 61 6c 6c 62 61 63 6b 20 61 72    "%%fallback ar
11120 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68  gument \"%s\" sh
11130 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22  ould be a token"
11140 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  , x);.        ps
11150 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
11160 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11170 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
11180 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
11190 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69  ew(x);.        i
111a0 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b  f( psp->fallback
111b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
111c0 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d   psp->fallback =
111d0 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   sp;.        }el
111e0 73 65 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62  se if( sp->fallb
111f0 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ack ){.         
11200 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
11210 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
11220 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11230 20 20 20 20 20 20 20 22 4d 6f 72 65 20 74 68 61         "More tha
11240 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61  n one fallback a
11250 73 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e  ssigned to token
11260 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20   %s", x);.      
11270 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
11280 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
11290 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70  se{.          sp
112a0 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70  ->fallback = psp
112b0 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  ->fallback;.    
112c0 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68        psp->gp->h
112d0 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b  as_fallback = 1;
112e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
112f0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11300 20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f      case RESYNC_
11310 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
11320 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b  :./*      if( x[
11330 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73  0]=='.' ) psp->s
11340 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11350 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
11360 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20  .**      break; 
11370 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45 53 59  */.    case RESY
11380 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
11390 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ROR:.      if( x
113a0 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e  [0]=='.' ) psp->
113b0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
113c0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
113d0 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  ;.      if( x[0]
113e0 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61  =='%' ) psp->sta
113f0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11400 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20  _DECL_KEYWORD;. 
11410 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
11420 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69 74 65 20 6f  }../* In spite o
11430 66 20 69 74 73 20 6e 61 6d 65 2c 20 74 68 69 73  f its name, this
11440 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 61   function is rea
11450 6c 6c 79 20 61 20 73 63 61 6e 6e 65 72 2e 20 20  lly a scanner.  
11460 49 74 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  It read.** in th
11470 65 20 65 6e 74 69 72 65 20 69 6e 70 75 74 20 66  e entire input f
11480 69 6c 65 20 28 61 6c 6c 20 61 74 20 6f 6e 63 65  ile (all at once
11490 29 20 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65 73  ) then tokenizes
114a0 20 69 74 2e 20 20 45 61 63 68 0a 2a 2a 20 74 6f   it.  Each.** to
114b0 6b 65 6e 20 69 73 20 70 61 73 73 65 64 20 74 6f  ken is passed to
114c0 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 70   the function "p
114d0 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 22 20 77 68  arseonetoken" wh
114e0 69 63 68 20 62 75 69 6c 64 73 20 61 6c 6c 0a 2a  ich builds all.*
114f0 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
11500 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
11510 73 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20  s in the global 
11520 73 74 61 74 65 20 76 65 63 74 6f 72 20 22 67 70  state vector "gp
11530 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65  "..*/.void Parse
11540 28 67 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  (gp).struct lemo
11550 6e 20 2a 67 70 3b 0a 7b 0a 20 20 73 74 72 75 63  n *gp;.{.  struc
11560 74 20 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46  t pstate ps;.  F
11570 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20  ILE *fp;.  char 
11580 2a 66 69 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20  *filebuf;.  int 
11590 66 69 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20  filesize;.  int 
115a0 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b  lineno;.  int c;
115b0 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65  .  char *cp, *ne
115c0 78 74 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72  xtcp;.  int star
115d0 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 70 73  tline = 0;..  ps
115e0 2e 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66  .gp = gp;.  ps.f
115f0 69 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69  ilename = gp->fi
11600 6c 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72  lename;.  ps.err
11610 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e  orcnt = 0;.  ps.
11620 73 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49  state = INITIALI
11630 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  ZE;..  /* Begin 
11640 62 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 69  by reading the i
11650 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66  nput file */.  f
11660 70 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c  p = fopen(ps.fil
11670 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69  ename,"rb");.  i
11680 66 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( fp==0 ){.    
11690 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
116a0 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70  name,0,"Can't op
116b0 65 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  en this file for
116c0 20 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20   reading.");.   
116d0 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b   gp->errorcnt++;
116e0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
116f0 0a 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29  .  fseek(fp,0,2)
11700 3b 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66  ;.  filesize = f
11710 74 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69  tell(fp);.  rewi
11720 6e 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75  nd(fp);.  filebu
11730 66 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c  f = (char *)mall
11740 6f 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29  oc( filesize+1 )
11750 3b 0a 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d  ;.  if( filebuf=
11760 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d  =0 ){.    ErrorM
11770 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30  sg(ps.filename,0
11780 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65  ,"Can't allocate
11790 20 25 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f   %d of memory to
117a0 20 68 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e   hold this file.
117b0 22 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a  ",.      filesiz
117c0 65 2b 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72  e+1);.    gp->er
117d0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
117e0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
117f0 66 72 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c  fread(filebuf,1,
11800 66 69 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69  filesize,fp)!=fi
11810 6c 65 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72  lesize ){.    Er
11820 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
11830 6d 65 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64  me,0,"Can't read
11840 20 69 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73   in all %d bytes
11850 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c   of this file.",
11860 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29  .      filesize)
11870 3b 0a 20 20 20 20 66 72 65 65 28 66 69 6c 65 62  ;.    free(fileb
11880 75 66 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  uf);.    gp->err
11890 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
118a0 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73  urn;.  }.  fclos
118b0 65 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66  e(fp);.  filebuf
118c0 5b 66 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a  [filesize] = 0;.
118d0 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74  .  /* Now scan t
118e0 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 69  he text of the i
118f0 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c  nput file */.  l
11900 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72  ineno = 1;.  for
11910 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d  (cp=filebuf; (c=
11920 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20   *cp)!=0; ){.   
11930 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
11940 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20  ineno++;        
11950 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72        /* Keep tr
11960 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20  ack of the line 
11970 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 66  number */.    if
11980 28 20 69 73 73 70 61 63 65 28 63 29 20 29 7b 20  ( isspace(c) ){ 
11990 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20  cp++; continue; 
119a0 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77  }  /* Skip all w
119b0 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a 20 20  hite space */.  
119c0 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20    if( c=='/' && 
119d0 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20  cp[1]=='/' ){   
119e0 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43         /* Skip C
119f0 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74  ++ style comment
11a00 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32  s */.      cp+=2
11a10 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  ;.      while( (
11a20 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
11a30 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20  ='\n' ) cp++;.  
11a40 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
11a50 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27    }.    if( c=='
11a60 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27  /' && cp[1]=='*'
11a70 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
11a80 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63 6f 6d  Skip C style com
11a90 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63  ments */.      c
11aa0 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  p+=2;.      whil
11ab0 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
11ac0 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b  & (c!='/' || cp[
11ad0 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20  -1]!='*') ){.   
11ae0 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
11af0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
11b00 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
11b10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 20 29   }.      if( c )
11b20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e   cp++;.      con
11b30 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
11b40 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d   ps.tokenstart =
11b50 20 63 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   cp;            
11b60 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20      /* Mark the 
11b70 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
11b80 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73   token */.    ps
11b90 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c  .tokenlineno = l
11ba0 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  ineno;          
11bb0 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f   /* Linenumber o
11bc0 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20 62 65  n which token be
11bd0 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  gins */.    if( 
11be0 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 20 20  c=='\"' ){      
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11c00 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  * String literal
11c10 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b  s */.      cp++;
11c20 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
11c30 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d  = *cp)!=0 && c!=
11c40 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\"' ){.        
11c50 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
11c60 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
11c70 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp++;.      }.  
11c80 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a      if( c==0 ){.
11c90 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11ca0 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61  (ps.filename,sta
11cb0 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20  rtline,."String 
11cc0 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73  starting on this
11cd0 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72   line is not ter
11ce0 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74  minated before t
11cf0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
11d00 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  le.");.        p
11d10 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  s.errorcnt++;.  
11d20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
11d30 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  p;.      }else{.
11d40 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
11d50 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20   cp+1;.      }. 
11d60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
11d70 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20 20 20  '{' ){          
11d80 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20       /* A block 
11d90 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20  of C code */.   
11da0 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20     int level;.  
11db0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
11dc0 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d  for(level=1; (c=
11dd0 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c 65 76   *cp)!=0 && (lev
11de0 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b  el>1 || c!='}');
11df0 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   cp++){.        
11e00 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
11e10 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
11e20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20  else if( c=='{' 
11e30 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20  ) level++;.     
11e40 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
11e50 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20  }' ) level--;.  
11e60 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
11e70 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
11e80 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20  '*' ){  /* Skip 
11e90 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  comments */.    
11ea0 20 20 20 20 20 20 69 6e 74 20 70 72 65 76 63 3b        int prevc;
11eb0 0a 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20  .          cp = 
11ec0 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  &cp[2];.        
11ed0 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20    prevc = 0;.   
11ee0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
11ef0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
11f00 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21 3d 27  ='/' || prevc!='
11f10 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  *') ){.         
11f20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
11f30 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
11f40 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63         prevc = c
11f50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70  ;.            cp
11f60 2b 2b 3b 0a 09 20 20 7d 0a 09 7d 65 6c 73 65 20  ++;..  }..}else 
11f70 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
11f80 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20  [1]=='/' ){  /* 
11f90 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
11fa0 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20  omments too */. 
11fb0 20 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63           cp = &c
11fc0 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[2];.          
11fd0 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
11fe0 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
11ff0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  cp++;.          
12000 69 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b  if( c ) lineno++
12010 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d  ;..}else if( c==
12020 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 5c 22 27 20  '\'' || c=='\"' 
12030 29 7b 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20  ){    /* String 
12040 61 20 63 68 61 72 61 63 74 65 72 20 6c 69 74 65  a character lite
12050 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rals */.        
12060 20 20 69 6e 74 20 73 74 61 72 74 63 68 61 72 2c    int startchar,
12070 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20   prevc;.        
12080 20 20 73 74 61 72 74 63 68 61 72 20 3d 20 63 3b    startchar = c;
12090 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63  .          prevc
120a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
120b0 66 6f 72 28 63 70 2b 2b 3b 20 28 63 3d 20 2a 63  for(cp++; (c= *c
120c0 70 29 21 3d 30 20 26 26 20 28 63 21 3d 73 74 61  p)!=0 && (c!=sta
120d0 72 74 63 68 61 72 20 7c 7c 20 70 72 65 76 63 3d  rtchar || prevc=
120e0 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b 29 7b 0a 20  ='\\'); cp++){. 
120f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
12100 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
12110 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  +;.            i
12120 66 28 20 70 72 65 76 63 3d 3d 27 5c 5c 27 20 29  f( prevc=='\\' )
12130 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
12140 20 20 20 20 20 20 20 20 65 6c 73 65 20 20 20 20          else    
12150 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20            prevc 
12160 3d 20 63 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20  = c;..  }..}.   
12170 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
12180 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
12190 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
121a0 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65  ame,ps.tokenline
121b0 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74 61 72  no,."C code star
121c0 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e  ting on this lin
121d0 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61  e is not termina
121e0 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 65  ted before the e
121f0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22  nd of the file."
12200 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72  );.        ps.er
12210 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12220 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
12230 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12240 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b      nextcp = cp+
12250 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
12260 65 6c 73 65 20 69 66 28 20 69 73 61 6c 6e 75 6d  else if( isalnum
12270 28 63 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  (c) ){          
12280 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73 20 2a  /* Identifiers *
12290 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  /.      while( (
122a0 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 69  c= *cp)!=0 && (i
122b0 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d  salnum(c) || c==
122c0 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '_') ) cp++;.   
122d0 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
122e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
122f0 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  =':' && cp[1]=='
12300 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27 3d 27  :' && cp[2]=='='
12310 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65 72 61   ){ /* The opera
12320 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20  tor "::=" */.   
12330 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20 20 20     cp += 3;.    
12340 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
12350 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20     }else{       
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20     /* All other 
12380 28 6f 6e 65 20 63 68 61 72 61 63 74 65 72 29 20  (one character) 
12390 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20  operators */.   
123a0 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e     cp++;.      n
123b0 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
123c0 7d 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20  }.    c = *cp;. 
123d0 20 20 20 2a 63 70 20 3d 20 30 3b 20 20 20 20 20     *cp = 0;     
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 20 2f 2a 20 4e 75 6c 6c 20 74 65 72 6d 69     /* Null termi
12400 6e 61 74 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a  nate the token *
12410 2f 0a 20 20 20 20 70 61 72 73 65 6f 6e 65 74 6f  /.    parseoneto
12420 6b 65 6e 28 26 70 73 29 3b 20 20 20 20 20 20 20  ken(&ps);       
12430 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 74        /* Parse t
12440 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
12450 2a 63 70 20 3d 20 63 3b 20 20 20 20 20 20 20 20  *cp = c;        
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12470 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 62  /* Restore the b
12480 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 63 70 20  uffer */.    cp 
12490 3d 20 6e 65 78 74 63 70 3b 0a 20 20 7d 0a 20 20  = nextcp;.  }.  
124a0 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 20 20  free(filebuf);  
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
124d0 20 62 75 66 66 65 72 20 61 66 74 65 72 20 70 61   buffer after pa
124e0 72 73 69 6e 67 20 2a 2f 0a 20 20 67 70 2d 3e 72  rsing */.  gp->r
124f0 75 6c 65 20 3d 20 70 73 2e 66 69 72 73 74 72 75  ule = ps.firstru
12500 6c 65 3b 0a 20 20 67 70 2d 3e 65 72 72 6f 72 63  le;.  gp->errorc
12510 6e 74 20 3d 20 70 73 2e 65 72 72 6f 72 63 6e 74  nt = ps.errorcnt
12520 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
12530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12540 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
12550 70 6c 69 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  plink.c" *******
12560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
12570 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70  /*.** Routines p
12580 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 66 69 67  rocessing config
12590 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73  uration follow-s
125a0 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  et propagation l
125b0 69 6e 6b 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4c  inks.** in the L
125c0 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
125d0 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
125e0 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70   struct plink *p
125f0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20  link_freelist = 
12600 30 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  0;../* Allocate 
12610 61 20 6e 65 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73  a new plink */.s
12620 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69  truct plink *Pli
12630 6e 6b 5f 6e 65 77 28 29 7b 0a 20 20 73 74 72 75  nk_new(){.  stru
12640 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 0a  ct plink *new;..
12650 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65    if( plink_free
12660 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
12670 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d  nt i;.    int am
12680 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 70 6c 69  t = 100;.    pli
12690 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 28 73  nk_freelist = (s
126a0 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29 6d 61  truct plink *)ma
126b0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
126c0 75 63 74 20 70 6c 69 6e 6b 29 2a 61 6d 74 20 29  uct plink)*amt )
126d0 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f  ;.    if( plink_
126e0 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
126f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
12700 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e 61 62  err,.      "Unab
12710 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  le to allocate m
12720 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20  emory for a new 
12730 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61  follow-set propa
12740 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29  gation link.\n")
12750 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b  ;.      exit(1);
12760 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
12770 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b  =0; i<amt-1; i++
12780 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  ) plink_freelist
12790 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e  [i].next = &plin
127a0 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b  k_freelist[i+1];
127b0 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  .    plink_freel
127c0 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20  ist[amt-1].next 
127d0 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d  = 0;.  }.  new =
127e0 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b   plink_freelist;
127f0 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  .  plink_freelis
12800 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  t = plink_freeli
12810 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75  st->next;.  retu
12820 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 41 64  rn new;.}../* Ad
12830 64 20 61 20 70 6c 69 6e 6b 20 74 6f 20 61 20 70  d a plink to a p
12840 6c 69 6e 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  link list */.voi
12850 64 20 50 6c 69 6e 6b 5f 61 64 64 28 70 6c 70 70  d Plink_add(plpp
12860 2c 63 66 70 29 0a 73 74 72 75 63 74 20 70 6c 69  ,cfp).struct pli
12870 6e 6b 20 2a 2a 70 6c 70 70 3b 0a 73 74 72 75 63  nk **plpp;.struc
12880 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b  t config *cfp;.{
12890 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
128a0 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d 20 50 6c  *new;.  new = Pl
128b0 69 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77  ink_new();.  new
128c0 2d 3e 6e 65 78 74 20 3d 20 2a 70 6c 70 70 3b 0a  ->next = *plpp;.
128d0 20 20 2a 70 6c 70 70 20 3d 20 6e 65 77 3b 0a 20    *plpp = new;. 
128e0 20 6e 65 77 2d 3e 63 66 70 20 3d 20 63 66 70 3b   new->cfp = cfp;
128f0 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20  .}../* Transfer 
12900 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74  every plink on t
12910 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22 20 74  he list "from" t
12920 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f 22 20  o the list "to" 
12930 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f  */.void Plink_co
12940 70 79 28 74 6f 2c 66 72 6f 6d 29 0a 73 74 72 75  py(to,from).stru
12950 63 74 20 70 6c 69 6e 6b 20 2a 2a 74 6f 3b 0a 73  ct plink **to;.s
12960 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66 72 6f  truct plink *fro
12970 6d 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  m;.{.  struct pl
12980 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20 20 77  ink *nextpl;.  w
12990 68 69 6c 65 28 20 66 72 6f 6d 20 29 7b 0a 20 20  hile( from ){.  
129a0 20 20 6e 65 78 74 70 6c 20 3d 20 66 72 6f 6d 2d    nextpl = from-
129b0 3e 6e 65 78 74 3b 0a 20 20 20 20 66 72 6f 6d 2d  >next;.    from-
129c0 3e 6e 65 78 74 20 3d 20 2a 74 6f 3b 0a 20 20 20  >next = *to;.   
129d0 20 2a 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20 20   *to = from;.   
129e0 20 66 72 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a   from = nextpl;.
129f0 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65    }.}../* Delete
12a00 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20   every plink on 
12a10 74 68 65 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  the list */.void
12a20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 70 6c   Plink_delete(pl
12a30 70 29 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  p).struct plink 
12a40 2a 70 6c 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  *plp;.{.  struct
12a50 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a   plink *nextpl;.
12a60 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b  .  while( plp ){
12a70 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c  .    nextpl = pl
12a80 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70  p->next;.    plp
12a90 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66  ->next = plink_f
12aa0 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69  reelist;.    pli
12ab0 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c  nk_freelist = pl
12ac0 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20 6e 65 78  p;.    plp = nex
12ad0 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a  tpl;.  }.}./****
12ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12af0 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
12b00 65 20 22 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a  e "report.c" ***
12b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b20 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50  *******/./*.** P
12b30 72 6f 63 65 64 75 72 65 73 20 66 6f 72 20 67 65  rocedures for ge
12b40 6e 65 72 61 74 69 6e 67 20 72 65 70 6f 72 74 73  nerating reports
12b50 20 61 6e 64 20 74 61 62 6c 65 73 20 69 6e 20 74   and tables in t
12b60 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
12b70 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f  generator..*/../
12b80 2a 20 47 65 6e 65 72 61 74 65 20 61 20 66 69 6c  * Generate a fil
12b90 65 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20 67  ename with the g
12ba0 69 76 65 6e 20 73 75 66 66 69 78 2e 20 20 53 70  iven suffix.  Sp
12bb0 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
12bc0 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72  ** name comes fr
12bd0 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  om malloc() and 
12be0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
12bf0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
12c00 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49  function..*/.PRI
12c10 56 41 54 45 20 63 68 61 72 20 2a 66 69 6c 65 5f  VATE char *file_
12c20 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 73 75  makename(lemp,su
12c30 66 66 69 78 29 0a 73 74 72 75 63 74 20 6c 65 6d  ffix).struct lem
12c40 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a  on *lemp;.char *
12c50 73 75 66 66 69 78 3b 0a 7b 0a 20 20 63 68 61 72  suffix;.{.  char
12c60 20 2a 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a   *name;.  char *
12c70 63 70 3b 0a 0a 20 20 6e 61 6d 65 20 3d 20 6d 61  cp;..  name = ma
12c80 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 6c 65 6d  lloc( strlen(lem
12c90 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20 73  p->filename) + s
12ca0 74 72 6c 65 6e 28 73 75 66 66 69 78 29 20 2b 20  trlen(suffix) + 
12cb0 35 20 29 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d  5 );.  if( name=
12cc0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
12cd0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
12ce0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
12cf0 6f 72 20 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e  or a filename.\n
12d00 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
12d10 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 6e 61  .  }.  strcpy(na
12d20 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  me,lemp->filenam
12d30 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72 72 63  e);.  cp = strrc
12d40 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20  hr(name,'.');.  
12d50 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d 20 30  if( cp ) *cp = 0
12d60 3b 0a 20 20 73 74 72 63 61 74 28 6e 61 6d 65 2c  ;.  strcat(name,
12d70 73 75 66 66 69 78 29 3b 0a 20 20 72 65 74 75 72  suffix);.  retur
12d80 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70  n name;.}../* Op
12d90 65 6e 20 61 20 66 69 6c 65 20 77 69 74 68 20 61  en a file with a
12da0 20 6e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 74   name based on t
12db0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
12dc0 6e 70 75 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75  nput file,.** bu
12dd0 74 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  t with a differe
12de0 6e 74 20 28 73 70 65 63 69 66 69 65 64 29 20 73  nt (specified) s
12df0 75 66 66 69 78 2c 20 61 6e 64 20 72 65 74 75 72  uffix, and retur
12e00 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
12e10 6f 20 74 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a  o the stream */.
12e20 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a 66 69  PRIVATE FILE *fi
12e30 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 73 75 66  le_open(lemp,suf
12e40 66 69 78 2c 6d 6f 64 65 29 0a 73 74 72 75 63 74  fix,mode).struct
12e50 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68   lemon *lemp;.ch
12e60 61 72 20 2a 73 75 66 66 69 78 3b 0a 63 68 61 72  ar *suffix;.char
12e70 20 2a 6d 6f 64 65 3b 0a 7b 0a 20 20 46 49 4c 45   *mode;.{.  FILE
12e80 20 2a 66 70 3b 0a 0a 20 20 69 66 28 20 6c 65 6d   *fp;..  if( lem
12e90 70 2d 3e 6f 75 74 6e 61 6d 65 20 29 20 66 72 65  p->outname ) fre
12ea0 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  e(lemp->outname)
12eb0 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  ;.  lemp->outnam
12ec0 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d  e = file_makenam
12ed0 65 28 6c 65 6d 70 2c 20 73 75 66 66 69 78 29 3b  e(lemp, suffix);
12ee0 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 6c 65  .  fp = fopen(le
12ef0 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64 65  mp->outname,mode
12f00 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 26  );.  if( fp==0 &
12f10 26 20 2a 6d 6f 64 65 3d 3d 27 77 27 20 29 7b 0a  & *mode=='w' ){.
12f20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
12f30 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 66  rr,"Can't open f
12f40 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 6c  ile \"%s\".\n",l
12f50 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20  emp->outname);. 
12f60 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
12f70 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t++;.    return 
12f80 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
12f90 66 70 3b 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63  fp;.}../* Duplic
12fa0 61 74 65 20 74 68 65 20 69 6e 70 75 74 20 66 69  ate the input fi
12fb0 6c 65 20 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65  le without comme
12fc0 6e 74 73 20 61 6e 64 20 77 69 74 68 6f 75 74 20  nts and without 
12fd0 61 63 74 69 6f 6e 73 20 0a 2a 2a 20 6f 6e 20 72  actions .** on r
12fe0 75 6c 65 73 20 2a 2f 0a 76 6f 69 64 20 52 65 70  ules */.void Rep
12ff0 72 69 6e 74 28 6c 65 6d 70 29 0a 73 74 72 75 63  rint(lemp).struc
13000 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
13010 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
13020 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  rp;.  struct sym
13030 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69  bol *sp;.  int i
13040 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e  , j, maxlen, len
13050 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70  , ncolumns, skip
13060 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f 20 52  ;.  printf("// R
13070 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75 74 20  eprint of input 
13080 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f  file \"%s\".\n//
13090 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d   Symbols:\n",lem
130a0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
130b0 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66  maxlen = 10;.  f
130c0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
130d0 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
130e0 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79     sp = lemp->sy
130f0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65  mbols[i];.    le
13100 6e 20 3d 20 73 74 72 6c 65 6e 28 73 70 2d 3e 6e  n = strlen(sp->n
13110 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  ame);.    if( le
13120 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65  n>maxlen ) maxle
13130 6e 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e  n = len;.  }.  n
13140 63 6f 6c 75 6d 6e 73 20 3d 20 37 36 2f 28 6d 61  columns = 76/(ma
13150 78 6c 65 6e 2b 35 29 3b 0a 20 20 69 66 28 20 6e  xlen+5);.  if( n
13160 63 6f 6c 75 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c  columns<1 ) ncol
13170 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 73 6b 69 70  umns = 1;.  skip
13180 20 3d 20 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f   = (lemp->nsymbo
13190 6c 20 2b 20 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31  l + ncolumns - 1
131a0 29 2f 6e 63 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f  )/ncolumns;.  fo
131b0 72 28 69 3d 30 3b 20 69 3c 73 6b 69 70 3b 20 69  r(i=0; i<skip; i
131c0 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  ++){.    printf(
131d0 22 2f 2f 22 29 3b 0a 20 20 20 20 66 6f 72 28 6a  "//");.    for(j
131e0 3d 69 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =i; j<lemp->nsym
131f0 62 6f 6c 3b 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20  bol; j+=skip){. 
13200 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e       sp = lemp->
13210 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20  symbols[j];.    
13220 20 20 61 73 73 65 72 74 28 20 73 70 2d 3e 69 6e    assert( sp->in
13230 64 65 78 3d 3d 6a 20 29 3b 0a 20 20 20 20 20 20  dex==j );.      
13240 70 72 69 6e 74 66 28 22 20 25 33 64 20 25 2d 2a  printf(" %3d %-*
13250 2e 2a 73 22 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61  .*s",j,maxlen,ma
13260 78 6c 65 6e 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a  xlen,sp->name);.
13270 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
13280 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 6f  ("\n");.  }.  fo
13290 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
132a0 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
132b0 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25  ){.    printf("%
132c0 73 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  s",rp->lhs->name
132d0 29 3b 0a 2f 2a 20 20 20 20 69 66 28 20 72 70 2d  );./*    if( rp-
132e0 3e 6c 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e  >lhsalias ) prin
132f0 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68  tf("(%s)",rp->lh
13300 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20  salias); */.    
13310 70 72 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a  printf(" ::=");.
13320 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
13330 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
13340 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 25 73       printf(" %s
13350 22 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61  ",rp->rhs[i]->na
13360 6d 65 29 3b 0a 2f 2a 20 20 20 20 20 20 69 66 28  me);./*      if(
13370 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
13380 20 29 20 70 72 69 6e 74 66 28 22 28 25 73 29 22   ) printf("(%s)"
13390 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
133a0 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ); */.    }.    
133b0 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a 20 20 20  printf(".");.   
133c0 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d   if( rp->precsym
133d0 20 29 20 70 72 69 6e 74 66 28 22 20 5b 25 73 5d   ) printf(" [%s]
133e0 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e  ",rp->precsym->n
133f0 61 6d 65 29 3b 0a 2f 2a 20 20 20 20 69 66 28 20  ame);./*    if( 
13400 72 70 2d 3e 63 6f 64 65 20 29 20 70 72 69 6e 74  rp->code ) print
13410 66 28 22 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d  f("\n    %s",rp-
13420 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70  >code); */.    p
13430 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d  rintf("\n");.  }
13440 0a 7d 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50  .}..void ConfigP
13450 72 69 6e 74 28 66 70 2c 63 66 70 29 0a 46 49 4c  rint(fp,cfp).FIL
13460 45 20 2a 66 70 3b 0a 73 74 72 75 63 74 20 63 6f  E *fp;.struct co
13470 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73  nfig *cfp;.{.  s
13480 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
13490 20 20 69 6e 74 20 69 3b 0a 20 20 72 70 20 3d 20    int i;.  rp = 
134a0 63 66 70 2d 3e 72 70 3b 0a 20 20 66 70 72 69 6e  cfp->rp;.  fprin
134b0 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d 22 2c 72  tf(fp,"%s ::=",r
134c0 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
134d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 72 70 2d   for(i=0; i<=rp-
134e0 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
134f0 20 69 66 28 20 69 3d 3d 63 66 70 2d 3e 64 6f 74   if( i==cfp->dot
13500 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20   ) fprintf(fp," 
13510 2a 22 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d  *");.    if( i==
13520 72 70 2d 3e 6e 72 68 73 20 29 20 62 72 65 61 6b  rp->nrhs ) break
13530 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  ;.    fprintf(fp
13540 2c 22 20 25 73 22 2c 72 70 2d 3e 72 68 73 5b 69  ," %s",rp->rhs[i
13550 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a  ]->name);.  }.}.
13560 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 45 53 54  ./* #define TEST
13570 20 2a 2f 0a 23 69 66 64 65 66 20 54 45 53 54 0a   */.#ifdef TEST.
13580 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20 2a  /* Print a set *
13590 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 53  /.PRIVATE void S
135a0 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c  etPrint(out,set,
135b0 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  lemp).FILE *out;
135c0 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72 75  .char *set;.stru
135d0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
135e0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
135f0 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70 61  r *spacer;.  spa
13600 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72 69  cer = "";.  fpri
13610 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c  ntf(out,"%12s[",
13620 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  "");.  for(i=0; 
13630 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
13640 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
13650 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29 20   SetFind(set,i) 
13660 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
13670 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61 63  (out,"%s%s",spac
13680 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  er,lemp->symbols
13690 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
136a0 20 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b 0a    spacer = " ";.
136b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
136c0 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a  ntf(out,"]\n");.
136d0 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c  }../* Print a pl
136e0 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49  ink chain */.PRI
136f0 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50  VATE void PlinkP
13700 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67  rint(out,plp,tag
13710 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
13720 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
13730 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77  char *tag;.{.  w
13740 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20  hile( plp ){.   
13750 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31   fprintf(out,"%1
13760 32 73 25 73 20 28 73 74 61 74 65 20 25 32 64 29  2s%s (state %2d)
13770 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63   ","",tag,plp->c
13780 66 70 2d 3e 73 74 70 2d 3e 69 6e 64 65 78 29 3b  fp->stp->index);
13790 0a 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74  .    ConfigPrint
137a0 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a  (out,plp->cfp);.
137b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
137c0 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d  "\n");.    plp =
137d0 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a   plp->next;.  }.
137e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69  }.#endif../* Pri
137f0 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20  nt an action to 
13800 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
13810 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
13820 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e  rn FALSE if.** n
13830 6f 74 68 69 6e 67 20 77 61 73 20 61 63 74 75 61  othing was actua
13840 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a  lly printed..*/.
13850 69 6e 74 20 50 72 69 6e 74 41 63 74 69 6f 6e 28  int PrintAction(
13860 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
13870 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20 69 6e 74  p, FILE *fp, int
13880 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20   indent){.  int 
13890 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77  result = 1;.  sw
138a0 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29  itch( ap->type )
138b0 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54  {.    case SHIFT
138c0 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
138d0 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 25  fp,"%*s shift  %
138e0 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  d",indent,ap->sp
138f0 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70  ->name,ap->x.stp
13900 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
13910 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
13920 52 45 44 55 43 45 3a 0a 20 20 20 20 20 20 66 70  REDUCE:.      fp
13930 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 72 65  rintf(fp,"%*s re
13940 64 75 63 65 20 25 64 22 2c 69 6e 64 65 6e 74 2c  duce %d",indent,
13950 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d  ap->sp->name,ap-
13960 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  >x.rp->index);. 
13970 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13980 63 61 73 65 20 41 43 43 45 50 54 3a 0a 20 20 20  case ACCEPT:.   
13990 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
139a0 2a 73 20 61 63 63 65 70 74 22 2c 69 6e 64 65 6e  *s accept",inden
139b0 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b  t,ap->sp->name);
139c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
139d0 20 20 63 61 73 65 20 45 52 52 4f 52 3a 0a 20 20    case ERROR:.  
139e0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
139f0 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e 64 65 6e  %*s error",inden
13a00 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b  t,ap->sp->name);
13a10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13a20 20 20 63 61 73 65 20 43 4f 4e 46 4c 49 43 54 3a    case CONFLICT:
13a30 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
13a40 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d  p,"%*s reduce %-
13a50 33 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f  3d ** Parsing co
13a60 6e 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20  nflict **",.    
13a70 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73      indent,ap->s
13a80 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70  p->name,ap->x.rp
13a90 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
13aa0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
13ab0 53 48 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20  SH_RESOLVED:.   
13ac0 20 63 61 73 65 20 52 44 5f 52 45 53 4f 4c 56 45   case RD_RESOLVE
13ad0 44 3a 0a 20 20 20 20 63 61 73 65 20 4e 4f 54 5f  D:.    case NOT_
13ae0 55 53 45 44 3a 0a 20 20 20 20 20 20 72 65 73 75  USED:.      resu
13af0 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  lt = 0;.      br
13b00 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
13b10 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20  n result;.}../* 
13b20 47 65 6e 65 72 61 74 65 20 74 68 65 20 22 79 2e  Generate the "y.
13b30 6f 75 74 70 75 74 22 20 6c 6f 67 20 66 69 6c 65  output" log file
13b40 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f   */.void ReportO
13b50 75 74 70 75 74 28 6c 65 6d 70 29 0a 73 74 72 75  utput(lemp).stru
13b60 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
13b70 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
13b80 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
13b90 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
13ba0 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *cfp;.  struct a
13bb0 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 46 49 4c  ction *ap;.  FIL
13bc0 45 20 2a 66 70 3b 0a 0a 20 20 66 70 20 3d 20 66  E *fp;..  fp = f
13bd0 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e  ile_open(lemp,".
13be0 6f 75 74 22 2c 22 77 22 29 3b 0a 20 20 69 66 28  out","w");.  if(
13bf0 20 66 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   fp==0 ) return;
13c00 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20  .  fprintf(fp," 
13c10 5c 62 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  \b");.  for(i=0;
13c20 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
13c30 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
13c40 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
13c50 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  ;.    fprintf(fp
13c60 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22 2c 73  ,"State %d:\n",s
13c70 74 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  tp->index);.    
13c80 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66  if( lemp->basisf
13c90 6c 61 67 20 29 20 63 66 70 3d 73 74 70 2d 3e 62  lag ) cfp=stp->b
13ca0 70 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20  p;.    else     
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70               cfp
13cc0 3d 73 74 70 2d 3e 63 66 70 3b 0a 20 20 20 20 77  =stp->cfp;.    w
13cd0 68 69 6c 65 28 20 63 66 70 20 29 7b 0a 20 20 20  hile( cfp ){.   
13ce0 20 20 20 63 68 61 72 20 62 75 66 5b 32 30 5d 3b     char buf[20];
13cf0 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e  .      if( cfp->
13d00 64 6f 74 3d 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72  dot==cfp->rp->nr
13d10 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70  hs ){.        sp
13d20 72 69 6e 74 66 28 62 75 66 2c 22 28 25 64 29 22  rintf(buf,"(%d)"
13d30 2c 63 66 70 2d 3e 72 70 2d 3e 69 6e 64 65 78 29  ,cfp->rp->index)
13d40 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
13d50 66 28 66 70 2c 22 20 20 20 20 25 35 73 20 22 2c  f(fp,"    %5s ",
13d60 62 75 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  buf);.      }els
13d70 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  e{.        fprin
13d80 74 66 28 66 70 2c 22 20 20 20 20 20 20 20 20 20  tf(fp,"         
13d90 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ");.      }.   
13da0 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66     ConfigPrint(f
13db0 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 66 70  p,cfp);.      fp
13dc0 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
13dd0 23 69 66 64 65 66 20 54 45 53 54 0a 20 20 20 20  #ifdef TEST.    
13de0 20 20 53 65 74 50 72 69 6e 74 28 66 70 2c 63 66    SetPrint(fp,cf
13df0 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20  p->fws,lemp);.  
13e00 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66      PlinkPrint(f
13e10 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20  p,cfp->fplp,"To 
13e20 20 22 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b   ");.      Plink
13e30 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70  Print(fp,cfp->bp
13e40 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64  lp,"From");.#end
13e50 69 66 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6d  if.      if( lem
13e60 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63  p->basisflag ) c
13e70 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20  fp=cfp->bp;.    
13e80 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
13e90 20 20 20 20 20 20 20 20 63 66 70 3d 63 66 70 2d          cfp=cfp-
13ea0 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  >next;.    }.   
13eb0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
13ec0 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  );.    for(ap=st
13ed0 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
13ee0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
13ef0 66 28 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 61  f( PrintAction(a
13f00 70 2c 66 70 2c 33 30 29 20 29 20 66 70 72 69 6e  p,fp,30) ) fprin
13f10 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20  tf(fp,"\n");.   
13f20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
13f30 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66  p,"\n");.  }.  f
13f40 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 72 65 74  close(fp);.  ret
13f50 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72 63  urn;.}../* Searc
13f60 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 22  h for the file "
13f70 6e 61 6d 65 22 20 77 68 69 63 68 20 69 73 20 69  name" which is i
13f80 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63  n the same direc
13f90 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20 65  tory as.** the e
13fa0 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a 50 52 49  xacutable */.PRI
13fb0 56 41 54 45 20 63 68 61 72 20 2a 70 61 74 68 73  VATE char *paths
13fc0 65 61 72 63 68 28 61 72 67 76 30 2c 6e 61 6d 65  earch(argv0,name
13fd0 2c 6d 6f 64 65 6d 61 73 6b 29 0a 63 68 61 72 20  ,modemask).char 
13fe0 2a 61 72 67 76 30 3b 0a 63 68 61 72 20 2a 6e 61  *argv0;.char *na
13ff0 6d 65 3b 0a 69 6e 74 20 6d 6f 64 65 6d 61 73 6b  me;.int modemask
14000 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 70 61 74 68  ;.{.  char *path
14010 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a 70 61  list;.  char *pa
14020 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20 63  th,*cp;.  char c
14030 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 61  ;.  extern int a
14040 63 63 65 73 73 28 29 3b 0a 0a 23 69 66 64 65 66  ccess();..#ifdef
14050 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63 70 20   __WIN32__.  cp 
14060 3d 20 73 74 72 72 63 68 72 28 61 72 67 76 30 2c  = strrchr(argv0,
14070 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20 20 63  '\\');.#else.  c
14080 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76  p = strrchr(argv
14090 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66 0a 20  0,'/');.#endif. 
140a0 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 63   if( cp ){.    c
140b0 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20   = *cp;.    *cp 
140c0 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20 3d 20  = 0;.    path = 
140d0 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20  (char *)malloc( 
140e0 73 74 72 6c 65 6e 28 61 72 67 76 30 29 20 2b 20  strlen(argv0) + 
140f0 73 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32  strlen(name) + 2
14100 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68   );.    if( path
14110 20 29 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c   ) sprintf(path,
14120 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61  "%s/%s",argv0,na
14130 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63  me);.    *cp = c
14140 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  ;.  }else{.    e
14150 78 74 65 72 6e 20 63 68 61 72 20 2a 67 65 74 65  xtern char *gete
14160 6e 76 28 29 3b 0a 20 20 20 20 70 61 74 68 6c 69  nv();.    pathli
14170 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50 41 54  st = getenv("PAT
14180 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74  H");.    if( pat
14190 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74 68 6c  hlist==0 ) pathl
141a0 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75  ist = ".:/bin:/u
141b0 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70 61 74  sr/bin";.    pat
141c0 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c  h = (char *)mall
141d0 6f 63 28 20 73 74 72 6c 65 6e 28 70 61 74 68 6c  oc( strlen(pathl
141e0 69 73 74 29 2b 73 74 72 6c 65 6e 28 6e 61 6d 65  ist)+strlen(name
141f0 29 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  )+2 );.    if( p
14200 61 74 68 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ath!=0 ){.      
14210 77 68 69 6c 65 28 20 2a 70 61 74 68 6c 69 73 74  while( *pathlist
14220 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70 20 3d   ){.        cp =
14230 20 73 74 72 63 68 72 28 70 61 74 68 6c 69 73 74   strchr(pathlist
14240 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69  ,':');.        i
14250 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20  f( cp==0 ) cp = 
14260 26 70 61 74 68 6c 69 73 74 5b 73 74 72 6c 65 6e  &pathlist[strlen
14270 28 70 61 74 68 6c 69 73 74 29 5d 3b 0a 20 20 20  (pathlist)];.   
14280 20 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20       c = *cp;.  
14290 20 20 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20        *cp = 0;. 
142a0 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70         sprintf(p
142b0 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61 74 68  ath,"%s/%s",path
142c0 6c 69 73 74 2c 6e 61 6d 65 29 3b 0a 20 20 20 20  list,name);.    
142d0 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20      *cp = c;.   
142e0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
142f0 70 61 74 68 6c 69 73 74 20 3d 20 22 22 3b 0a 20  pathlist = "";. 
14300 20 20 20 20 20 20 20 65 6c 73 65 20 70 61 74 68         else path
14310 6c 69 73 74 20 3d 20 26 63 70 5b 31 5d 3b 0a 20  list = &cp[1];. 
14320 20 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73         if( acces
14330 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29  s(path,modemask)
14340 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
14350 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
14360 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a   return path;.}.
14370 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61 63 74  ./* Given an act
14380 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74 68 65  ion, compute the
14390 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
143a0 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a  or that action.*
143b0 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20 62 65  * which is to be
143c0 20 70 75 74 20 69 6e 20 74 68 65 20 61 63 74 69   put in the acti
143d0 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  on table of the 
143e0 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68 69 6e  generated machin
143f0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67  e..** Return neg
14400 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63 74 69  ative if no acti
14410 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67 65 6e  on should be gen
14420 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41  erated..*/.PRIVA
14430 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61  TE int compute_a
14440 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 0a 73  ction(lemp,ap).s
14450 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
14460 70 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  p;.struct action
14470 20 2a 61 70 3b 0a 7b 0a 20 20 69 6e 74 20 61 63   *ap;.{.  int ac
14480 74 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d  t;.  switch( ap-
14490 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  >type ){.    cas
144a0 65 20 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20  e SHIFT:  act = 
144b0 61 70 2d 3e 78 2e 73 74 70 2d 3e 69 6e 64 65 78  ap->x.stp->index
144c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
144d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
144e0 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20 61 70  REDUCE: act = ap
144f0 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2b 20  ->x.rp->index + 
14500 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 62 72  lemp->nstate; br
14510 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52  eak;.    case ER
14520 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70  ROR:  act = lemp
14530 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
14540 3e 6e 72 75 6c 65 3b 20 20 20 20 20 62 72 65 61  >nrule;     brea
14550 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45  k;.    case ACCE
14560 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e  PT: act = lemp->
14570 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e  nstate + lemp->n
14580 72 75 6c 65 20 2b 20 31 3b 20 62 72 65 61 6b 3b  rule + 1; break;
14590 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
145a0 20 20 61 63 74 20 3d 20 2d 31 3b 20 62 72 65 61    act = -1; brea
145b0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
145c0 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  act;.}..#define 
145d0 4c 49 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f 2a  LINESIZE 1000./*
145e0 20 54 68 65 20 6e 65 78 74 20 63 6c 75 73 74 65   The next cluste
145f0 72 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  r of routines ar
14600 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68  e for reading th
14610 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 0a  e template file.
14620 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74  ** and writing t
14630 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68  he results to th
14640 65 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73  e generated pars
14650 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69 72  er */./* The fir
14660 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 72 61 6e  st function tran
14670 73 66 65 72 73 20 64 61 74 61 20 66 72 6f 6d 20  sfers data from 
14680 22 69 6e 22 20 74 6f 20 22 6f 75 74 22 20 75 6e  "in" to "out" un
14690 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69 73  til.** a line is
146a0 20 73 65 65 6e 20 77 68 69 63 68 20 62 65 67 69   seen which begi
146b0 6e 73 20 77 69 74 68 20 22 25 25 22 2e 20 20 54  ns with "%%".  T
146c0 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69  he line number i
146d0 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a 2a  s.** tracked..**
146e0 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c 20  .** if name!=0, 
146f0 74 68 65 6e 20 61 6e 79 20 77 6f 72 64 20 74 68  then any word th
14700 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 50  at begin with "P
14710 61 72 73 65 22 20 69 73 20 63 68 61 6e 67 65 64  arse" is changed
14720 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69 74   to.** begin wit
14730 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64 2e  h *name instead.
14740 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64  .*/.PRIVATE void
14750 20 74 70 6c 74 5f 78 66 65 72 28 6e 61 6d 65 2c   tplt_xfer(name,
14760 69 6e 2c 6f 75 74 2c 6c 69 6e 65 6e 6f 29 0a 63  in,out,lineno).c
14770 68 61 72 20 2a 6e 61 6d 65 3b 0a 46 49 4c 45 20  har *name;.FILE 
14780 2a 69 6e 3b 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a  *in;.FILE *out;.
14790 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20  int *lineno;.{. 
147a0 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a   int i, iStart;.
147b0 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45    char line[LINE
147c0 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20  SIZE];.  while( 
147d0 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53  fgets(line,LINES
147e0 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65  IZE,in) && (line
147f0 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65  [0]!='%' || line
14800 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a 20 20 20  [1]!='%') ){.   
14810 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
14820 20 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 20 20    iStart = 0;.  
14830 20 20 69 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20    if( name ){.  
14840 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e      for(i=0; lin
14850 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  e[i]; i++){.    
14860 20 20 20 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d      if( line[i]=
14870 3d 27 50 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='P' && strncmp(
14880 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22  &line[i],"Parse"
14890 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ,5)==0.         
148a0 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 21 69 73   && (i==0 || !is
148b0 61 6c 70 68 61 28 6c 69 6e 65 5b 69 2d 31 5d 29  alpha(line[i-1])
148c0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
148d0 20 20 20 20 20 20 20 69 66 28 20 69 3e 69 53 74         if( i>iSt
148e0 61 72 74 20 29 20 66 70 72 69 6e 74 66 28 6f 75  art ) fprintf(ou
148f0 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72  t,"%.*s",i-iStar
14900 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29  t,&line[iStart])
14910 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  ;.          fpri
14920 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d  ntf(out,"%s",nam
14930 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  e);.          i 
14940 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  += 4;.          
14950 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20  iStart = i+1;.  
14960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14970 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74      }.    fprint
14980 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65  f(out,"%s",&line
14990 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d  [iStart]);.  }.}
149a0 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20 66 75  ../* The next fu
149b0 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
149c0 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 61   template file a
149d0 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20 72 65 74  nd opens it, ret
149e0 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e  urning.** a poin
149f0 74 65 72 20 74 6f 20 74 68 65 20 6f 70 65 6e 65  ter to the opene
14a00 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41  d file. */.PRIVA
14a10 54 45 20 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70  TE FILE *tplt_op
14a20 65 6e 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  en(lemp).struct 
14a30 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
14a40 20 73 74 61 74 69 63 20 63 68 61 72 20 74 65 6d   static char tem
14a50 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c  platename[] = "l
14a60 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68 61 72  empar.c";.  char
14a70 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49   buf[1000];.  FI
14a80 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a  LE *in;.  char *
14a90 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72  tpltname;.  char
14aa0 20 2a 63 70 3b 0a 0a 20 20 63 70 20 3d 20 73 74   *cp;..  cp = st
14ab0 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65  rrchr(lemp->file
14ac0 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28  name,'.');.  if(
14ad0 20 63 70 20 29 7b 0a 20 20 20 20 73 70 72 69 6e   cp ){.    sprin
14ae0 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e 6c 74 22  tf(buf,"%.*s.lt"
14af0 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d 70 2d 3e  ,(int)(cp-lemp->
14b00 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e  filename),lemp->
14b10 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  filename);.  }el
14b20 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  se{.    sprintf(
14b30 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d 70  buf,"%s.lt",lemp
14b40 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  ->filename);.  }
14b50 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 62 75  .  if( access(bu
14b60 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20  f,004)==0 ){.   
14b70 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75 66 3b   tpltname = buf;
14b80 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 63 63  .  }else if( acc
14b90 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ess(templatename
14ba0 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,004)==0 ){.    
14bb0 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d 70 6c  tpltname = templ
14bc0 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65  atename;.  }else
14bd0 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d  {.    tpltname =
14be0 20 70 61 74 68 73 65 61 72 63 68 28 6c 65 6d 70   pathsearch(lemp
14bf0 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61 74 65  ->argv0,template
14c00 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20 20 69  name,0);.  }.  i
14c10 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30 20 29  f( tpltname==0 )
14c20 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
14c30 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64  derr,"Can't find
14c40 20 74 68 65 20 70 61 72 73 65 72 20 64 72 69 76   the parser driv
14c50 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  er template file
14c60 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20   \"%s\".\n",.   
14c70 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a   templatename);.
14c80 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
14c90 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
14ca0 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66   0;.  }.  in = f
14cb0 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c 22 72  open(tpltname,"r
14cc0 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  ");.  if( in==0 
14cd0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
14ce0 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65  tderr,"Can't ope
14cf0 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66  n the template f
14d00 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74  ile \"%s\".\n",t
14d10 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20  emplatename);.  
14d20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
14d30 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ++;.    return 0
14d40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
14d50 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  n;.}../* Print a
14d60 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 66   string to the f
14d70 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74 68 65  ile and keep the
14d80 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70 20 74   linenumber up t
14d90 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56 41 54  o date */.PRIVAT
14da0 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e  E void tplt_prin
14db0 74 28 6f 75 74 2c 6c 65 6d 70 2c 73 74 72 2c 73  t(out,lemp,str,s
14dc0 74 72 6c 6e 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c  trln,lineno).FIL
14dd0 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 6c  E *out;.struct l
14de0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72  emon *lemp;.char
14df0 20 2a 73 74 72 3b 0a 69 6e 74 20 73 74 72 6c 6e   *str;.int strln
14e00 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
14e10 0a 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29 20  .  if( str==0 ) 
14e20 72 65 74 75 72 6e 3b 0a 20 20 66 70 72 69 6e 74  return;.  fprint
14e30 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20  f(out,"#line %d 
14e40 5c 22 25 73 5c 22 5c 6e 22 2c 73 74 72 6c 6e 2c  \"%s\"\n",strln,
14e50 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
14e60 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
14e70 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20  while( *str ){. 
14e80 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e     if( *str=='\n
14e90 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  ' ) (*lineno)++;
14ea0 0a 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c 6f  .    putc(*str,o
14eb0 75 74 29 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a  ut);.    str++;.
14ec0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
14ed0 74 2c 22 5c 6e 23 6c 69 6e 65 20 25 64 20 5c 22  t,"\n#line %d \"
14ee0 25 73 5c 22 5c 6e 22 2c 2a 6c 69 6e 65 6e 6f 2b  %s\"\n",*lineno+
14ef0 32 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  2,lemp->outname)
14f00 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 3d 32 3b 0a  ; (*lineno)+=2;.
14f10 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
14f20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
14f30 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73 20 63   routine emits c
14f40 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 73 74  ode for the dest
14f50 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a  ructor for the.*
14f60 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76  * symbol sp.*/.v
14f70 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72 75 63  oid emit_destruc
14f80 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 73 70 2c  tor_code(out,sp,
14f90 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c  lemp,lineno).FIL
14fa0 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 73  E *out;.struct s
14fb0 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63  ymbol *sp;.struc
14fc0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69  t lemon *lemp;.i
14fd0 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63  nt *lineno;.{. c
14fe0 68 61 72 20 2a 63 70 3b 0a 0a 20 69 6e 74 20 6c  har *cp;.. int l
14ff0 69 6e 65 63 6e 74 20 3d 20 30 3b 0a 20 69 66 28  inecnt = 0;. if(
15000 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
15010 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c  NAL ){.   cp = l
15020 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a  emp->tokendest;.
15030 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72     if( cp==0 ) r
15040 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74  eturn;.   fprint
15050 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20  f(out,"#line %d 
15060 5c 22 25 73 5c 22 5c 6e 7b 22 2c 6c 65 6d 70 2d  \"%s\"\n{",lemp-
15070 3e 74 6f 6b 65 6e 64 65 73 74 6c 6e 2c 6c 65 6d  >tokendestln,lem
15080 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d  p->filename);. }
15090 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73  else if( sp->des
150a0 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70  tructor ){.   cp
150b0 20 3d 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f   = sp->destructo
150c0 72 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  r;.   fprintf(ou
150d0 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25 73  t,"#line %d \"%s
150e0 5c 22 5c 6e 7b 22 2c 73 70 2d 3e 64 65 73 74 72  \"\n{",sp->destr
150f0 75 63 74 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e 66 69  uctorln,lemp->fi
15100 6c 65 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73 65 20  lename);. }else 
15110 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73  if( lemp->vardes
15120 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d  t ){.   cp = lem
15130 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 69  p->vardest;.   i
15140 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72  f( cp==0 ) retur
15150 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  n;.   fprintf(ou
15160 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25 73  t,"#line %d \"%s
15170 5c 22 5c 6e 7b 22 2c 6c 65 6d 70 2d 3e 76 61 72  \"\n{",lemp->var
15180 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c  destln,lemp->fil
15190 65 6e 61 6d 65 29 3b 0a 20 7d 0a 20 66 6f 72 28  ename);. }. for(
151a0 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20  ; *cp; cp++){.  
151b0 20 69 66 28 20 2a 63 70 3d 3d 27 24 27 20 26 26   if( *cp=='$' &&
151c0 20 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20   cp[1]=='$' ){. 
151d0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
151e0 22 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64  "(yypminor->yy%d
151f0 29 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20  )",sp->dtnum);. 
15200 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63      cp++;.     c
15210 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20  ontinue;.   }.  
15220 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29   if( *cp=='\n' )
15230 20 6c 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 66   linecnt++;.   f
15240 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20  putc(*cp,out);. 
15250 7d 0a 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20  }. (*lineno) += 
15260 33 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20 66 70  3 + linecnt;. fp
15270 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 23 6c  rintf(out,"}\n#l
15280 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22  ine %d \"%s\"\n"
15290 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f  ,*lineno,lemp->o
152a0 75 74 6e 61 6d 65 29 3b 0a 20 72 65 74 75 72 6e  utname);. return
152b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
152c0 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
152d0 29 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  ) if the given s
152e0 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65 73 74  ymbol has a dest
152f0 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68  ructor..*/.int h
15300 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 73 70  as_destructor(sp
15310 2c 20 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 73  , lemp).struct s
15320 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63  ymbol *sp;.struc
15330 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
15340 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66  .  int ret;.  if
15350 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( sp->type==TERM
15360 49 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20  INAL ){.    ret 
15370 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  = lemp->tokendes
15380 74 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t!=0;.  }else{. 
15390 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76     ret = lemp->v
153a0 61 72 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d  ardest!=0 || sp-
153b0 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a  >destructor!=0;.
153c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
153d0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65  ;.}../* .** Gene
153e0 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
153f0 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68  executes when th
15400 65 20 72 75 6c 65 20 22 72 70 22 20 69 73 20 72  e rule "rp" is r
15410 65 64 75 63 65 64 2e 20 20 57 72 69 74 65 0a 2a  educed.  Write.*
15420 2a 20 74 68 65 20 63 6f 64 65 20 74 6f 20 22 6f  * the code to "o
15430 75 74 22 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ut".  Make sure 
15440 6c 69 6e 65 6e 6f 20 73 74 61 79 73 20 75 70 2d  lineno stays up-
15450 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56  to-date..*/.PRIV
15460 41 54 45 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f  ATE void emit_co
15470 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 6c  de(out,rp,lemp,l
15480 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74  ineno).FILE *out
15490 3b 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72  ;.struct rule *r
154a0 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p;.struct lemon 
154b0 2a 6c 65 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65  *lemp;.int *line
154c0 6e 6f 3b 0a 7b 0a 20 63 68 61 72 20 2a 63 70 2c  no;.{. char *cp,
154d0 20 2a 78 70 3b 0a 20 69 6e 74 20 6c 69 6e 65 63   *xp;. int linec
154e0 6e 74 20 3d 20 30 3b 0a 20 69 6e 74 20 69 3b 0a  nt = 0;. int i;.
154f0 20 63 68 61 72 20 6c 68 73 75 73 65 64 20 3d 20   char lhsused = 
15500 30 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  0;    /* True if
15510 20 74 68 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74   the LHS element
15520 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a   has been used *
15530 2f 0a 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58  /. char used[MAX
15540 52 48 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20  RHS];   /* True 
15550 66 6f 72 20 65 61 63 68 20 52 48 53 20 65 6c 65  for each RHS ele
15560 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 75 73  ment which is us
15570 65 64 20 2a 2f 0a 0a 20 66 6f 72 28 69 3d 30 3b  ed */.. for(i=0;
15580 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
15590 29 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20  ) used[i] = 0;. 
155a0 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 2f  lhsused = 0;.. /
155b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
155c0 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63 65  to do the reduce
155d0 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20   action */. if( 
155e0 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 66  rp->code ){.   f
155f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e  printf(out,"#lin
15600 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 7b 22 2c  e %d \"%s\"\n{",
15610 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66  rp->line,lemp->f
15620 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 66 6f 72  ilename);.   for
15630 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63  (cp=rp->code; *c
15640 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 69  p; cp++){.     i
15650 66 28 20 69 73 61 6c 70 68 61 28 2a 63 70 29 20  f( isalpha(*cp) 
15660 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65  && (cp==rp->code
15670 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d 28 63 70   || (!isalnum(cp
15680 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d 21  [-1]) && cp[-1]!
15690 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20 20 20  ='_')) ){.      
156a0 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20 20   char saved;.   
156b0 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70 5b      for(xp= &cp[
156c0 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70 29  1]; isalnum(*xp)
156d0 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70   || *xp=='_'; xp
156e0 2b 2b 29 3b 0a 20 20 20 20 20 20 20 73 61 76 65  ++);.       save
156f0 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 20  d = *xp;.       
15700 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  *xp = 0;.       
15710 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
15720 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
15730 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29  ->lhsalias)==0 )
15740 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  {.         fprin
15750 74 66 28 6f 75 74 2c 22 79 79 67 6f 74 6f 6d 69  tf(out,"yygotomi
15760 6e 6f 72 2e 79 79 25 64 22 2c 72 70 2d 3e 6c 68  nor.yy%d",rp->lh
15770 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20  s->dtnum);.     
15780 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
15790 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20        lhsused = 
157a0 31 3b 0a 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  1;.       }else{
157b0 0a 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  .         for(i=
157c0 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
157d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
157e0 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
157f0 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28 63 70  [i] && strcmp(cp
15800 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
15810 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
15820 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15830 2c 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f  ,"yymsp[%d].mino
15840 72 2e 79 79 25 64 22 2c 69 2d 72 70 2d 3e 6e 72  r.yy%d",i-rp->nr
15850 68 73 2b 31 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  hs+1,rp->rhs[i]-
15860 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20  >dtnum);.       
15870 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20        cp = xp;. 
15880 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 64              used
15890 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  [i] = 1;.       
158a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
158b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
158c0 20 20 20 7d 0a 20 20 20 20 20 20 20 7d 0a 20 20     }.       }.  
158d0 20 20 20 20 20 2a 78 70 20 3d 20 73 61 76 65 64       *xp = saved
158e0 3b 0a 20 20 20 20 20 7d 0a 20 20 20 20 20 69 66  ;.     }.     if
158f0 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69  ( *cp=='\n' ) li
15900 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 66 70  necnt++;.     fp
15910 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 20  utc(*cp,out);.  
15920 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a   } /* End loop *
15930 2f 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b  /.   (*lineno) +
15940 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20  = 3 + linecnt;. 
15950 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d    fprintf(out,"}
15960 5c 6e 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c  \n#line %d \"%s\
15970 22 5c 6e 22 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  "\n",*lineno,lem
15980 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d 20  p->outname);. } 
15990 2f 2a 20 45 6e 64 20 69 66 28 20 72 70 2d 3e 63  /* End if( rp->c
159a0 6f 64 65 20 29 20 2a 2f 0a 0a 20 2f 2a 20 43 68  ode ) */.. /* Ch
159b0 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
159c0 20 74 68 65 20 4c 48 53 20 68 61 73 20 62 65 65   the LHS has bee
159d0 6e 20 75 73 65 64 20 2a 2f 0a 20 69 66 28 20 72  n used */. if( r
159e0 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 21  p->lhsalias && !
159f0 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20 45 72  lhsused ){.   Er
15a00 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
15a10 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
15a20 6e 65 2c 0a 20 20 20 20 20 22 4c 61 62 65 6c 20  ne,.     "Label 
15a30 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25 73 28  \"%s\" for \"%s(
15a40 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75  %s)\" is never u
15a50 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 72 70  sed.",.       rp
15a60 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c  ->lhsalias,rp->l
15a70 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73  hs->name,rp->lhs
15a80 61 6c 69 61 73 29 3b 0a 20 20 20 6c 65 6d 70 2d  alias);.   lemp-
15a90 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 7d 0a  >errorcnt++;. }.
15aa0 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64 65  . /* Generate de
15ab0 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66 6f  structor code fo
15ac0 72 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 68  r RHS symbols wh
15ad0 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64  ich are not used
15ae0 20 69 6e 20 74 68 65 0a 20 2a 2a 20 72 65 64 75   in the. ** redu
15af0 63 65 20 63 6f 64 65 20 2a 2f 0a 20 66 6f 72 28  ce code */. for(
15b00 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
15b10 20 69 2b 2b 29 7b 0a 20 20 20 69 66 28 20 72 70   i++){.   if( rp
15b20 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26  ->rhsalias[i] &&
15b30 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20   !used[i] ){.   
15b40 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
15b50 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
15b60 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 22  leline,.       "
15b70 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25  Label %s for \"%
15b80 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
15b90 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
15ba0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c  rp->rhsalias[i],
15bb0 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65  rp->rhs[i]->name
15bc0 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
15bd0 29 3b 0a 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  );.     lemp->er
15be0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 7d 65 6c  rorcnt++;.   }el
15bf0 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c  se if( rp->rhsal
15c00 69 61 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  ias[i]==0 ){.   
15c10 20 20 69 66 28 20 68 61 73 5f 64 65 73 74 72 75    if( has_destru
15c20 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c  ctor(rp->rhs[i],
15c30 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20 20 20  lemp) ){.       
15c40 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 79  fprintf(out,"  y
15c50 79 5f 64 65 73 74 72 75 63 74 6f 72 28 25 64 2c  y_destructor(%d,
15c60 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72  &yymsp[%d].minor
15c70 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  );\n",.         
15c80 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64   rp->rhs[i]->ind
15c90 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29  ex,i-rp->nrhs+1)
15ca0 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20  ; (*lineno)++;. 
15cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15cc0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
15cd0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73         /* No des
15ce0 74 72 75 63 74 6f 72 20 64 65 66 69 6e 65 64 20  tructor defined 
15cf0 66 6f 72 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20  for %s */\n",.  
15d00 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d        rp->rhs[i]
15d10 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
15d20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
15d30 20 20 20 7d 0a 20 20 20 7d 0a 20 7d 0a 20 72 65     }.   }. }. re
15d40 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  turn;.}../*.** P
15d50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69 74  rint the definit
15d60 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e  ion of the union
15d70 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 61   used for the pa
15d80 72 73 65 72 27 73 20 64 61 74 61 20 73 74 61 63  rser's data stac
15d90 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e  k..** This union
15da0 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64 73   contains fields
15db0 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73 69   for every possi
15dc0 62 6c 65 20 64 61 74 61 20 74 79 70 65 20 66 6f  ble data type fo
15dd0 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20  r tokens.** and 
15de0 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49  nonterminals.  I
15df0 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  n the process of
15e00 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20 70   computing and p
15e10 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20  rinting this.** 
15e20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20  union, also set 
15e30 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65  the ".dtnum" fie
15e40 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65 72 6d  ld of every term
15e50 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d  inal and nonterm
15e60 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a  inal.** symbol..
15e70 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73 74  */.void print_st
15e80 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65  ack_union(out,le
15e90 6d 70 2c 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61  mp,plineno,mhfla
15ea0 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20  g).FILE *out;   
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ec0 2a 20 54 68 65 20 6f 75 74 70 75 74 20 73 74 72  * The output str
15ed0 65 61 6d 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65  eam */.struct le
15ee0 6d 6f 6e 20 2a 6c 65 6d 70 3b 20 20 20 20 20 20  mon *lemp;      
15ef0 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69     /* The main i
15f00 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f  nfo structure fo
15f10 72 20 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f  r this parser */
15f20 0a 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20  .int *plineno;  
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15f40 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  Pointer to the l
15f50 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 69 6e  ine number */.in
15f60 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 20 20  t mhflag;       
15f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15f80 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67 20  e if generating 
15f90 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74 70  makeheaders outp
15fa0 75 74 20 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c 69  ut */.{.  int li
15fb0 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b  neno = *plineno;
15fc0 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20      /* The line 
15fd0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f 75  number of the ou
15fe0 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tput */.  char *
15ff0 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20 20 20  *types;         
16000 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74 61      /* A hash ta
16010 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73  ble of datatypes
16020 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79 73   */.  int arrays
16030 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
16040 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 22  /* Size of the "
16050 74 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f 0a  types" array */.
16060 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74    int maxdtlengt
16070 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  h;          /* M
16080 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66  aximum length of
16090 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65 22   any ".datatype"
160a0 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61   field. */.  cha
160b0 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20 20  r *stddt;       
160c0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64 61         /* Standa
160d0 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20  rdized name for 
160e0 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20 20  a datatype */.  
160f0 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20 20  int i,j;        
16100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
16110 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
16120 69 6e 74 20 68 61 73 68 3b 20 20 20 20 20 20 20  int hash;       
16130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
16140 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61 6d   hashing the nam
16150 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a 20  e of a type */. 
16160 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20   char *name;    
16170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
16180 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  me of the parser
16190 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
161a0 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
161b0 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c  e types[] and al
161c0 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20 2a  locate stddt[] *
161d0 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d 20  /.  arraysize = 
161e0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20  lemp->nsymbol * 
161f0 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63 68  2;.  types = (ch
16200 61 72 2a 2a 29 6d 61 6c 6c 6f 63 28 20 61 72 72  ar**)malloc( arr
16210 61 79 73 69 7a 65 20 2a 20 73 69 7a 65 6f 66 28  aysize * sizeof(
16220 63 68 61 72 2a 29 20 29 3b 0a 20 20 66 6f 72 28  char*) );.  for(
16230 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65  i=0; i<arraysize
16240 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20  ; i++) types[i] 
16250 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67  = 0;.  maxdtleng
16260 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65  th = 0;.  if( le
16270 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b 0a 20  mp->vartype ){. 
16280 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d     maxdtlength =
16290 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61   strlen(lemp->va
162a0 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  rtype);.  }.  fo
162b0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
162c0 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
162d0 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73    int len;.    s
162e0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
162f0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
16300 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  [i];.    if( sp-
16310 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20 63  >datatype==0 ) c
16320 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e  ontinue;.    len
16330 20 3d 20 73 74 72 6c 65 6e 28 73 70 2d 3e 64 61   = strlen(sp->da
16340 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  tatype);.    if(
16350 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68   len>maxdtlength
16360 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d   ) maxdtlength =
16370 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64   len;.  }.  stdd
16380 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  t = (char*)mallo
16390 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32  c( maxdtlength*2
163a0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 74 79   + 1 );.  if( ty
163b0 70 65 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d  pes==0 || stddt=
163c0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
163d0 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66  f(stderr,"Out of
163e0 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20   memory.\n");.  
163f0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a    exit(1);.  }..
16400 20 20 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73    /* Build a has
16410 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74  h table of datat
16420 79 70 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75  ypes. The ".dtnu
16430 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68  m" field of each
16440 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20   symbol.  ** is 
16450 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74  filled in with t
16460 68 65 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c  he hash index pl
16470 75 73 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d  us 1.  A ".dtnum
16480 22 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a  " value of 0 is.
16490 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65    ** used for te
164a0 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20  rminal symbols. 
164b0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
164c0 25 64 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65  %default_type de
164d0 66 69 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20  fined then.  ** 
164e0 30 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61  0 is also used a
164f0 73 20 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c  s the .dtnum val
16500 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e  ue for nontermin
16510 61 6c 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74  als which do not
16520 20 73 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20   specify.  ** a 
16530 64 61 74 61 74 79 70 65 20 75 73 69 6e 67 20 74  datatype using t
16540 68 65 20 25 74 79 70 65 20 64 69 72 65 63 74 69  he %type directi
16550 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ve..  */.  for(i
16560 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
16570 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
16580 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
16590 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
165a0 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  [i];.    char *c
165b0 70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c  p;.    if( sp==l
165c0 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20  emp->errsym ){. 
165d0 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
165e0 20 61 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20   arraysize+1;.  
165f0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
16600 20 20 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e    }.    if( sp->
16610 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type!=NONTERMINA
16620 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79  L || (sp->dataty
16630 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76  pe==0 && lemp->v
16640 61 72 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20  artype==0) ){.  
16650 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
16660 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
16670 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20  e;.    }.    cp 
16680 3d 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a  = sp->datatype;.
16690 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20      if( cp==0 ) 
166a0 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79  cp = lemp->varty
166b0 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20  pe;.    j = 0;. 
166c0 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
166d0 65 28 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20  e(*cp) ) cp++;. 
166e0 20 20 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20     while( *cp ) 
166f0 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70  stddt[j++] = *cp
16700 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a  ++;.    while( j
16710 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 73 74  >0 && isspace(st
16720 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b  ddt[j-1]) ) j--;
16730 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20  .    stddt[j] = 
16740 30 3b 0a 20 20 20 20 68 61 73 68 20 3d 20 30 3b  0;.    hash = 0;
16750 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74  .    for(j=0; st
16760 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ddt[j]; j++){.  
16770 20 20 20 20 68 61 73 68 20 3d 20 68 61 73 68 2a      hash = hash*
16780 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20  53 + stddt[j];. 
16790 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20 3d 20     }.    hash = 
167a0 28 68 61 73 68 20 26 20 30 78 37 66 66 66 66 66  (hash & 0x7fffff
167b0 66 66 29 25 61 72 72 61 79 73 69 7a 65 3b 0a 20  ff)%arraysize;. 
167c0 20 20 20 77 68 69 6c 65 28 20 74 79 70 65 73 5b     while( types[
167d0 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20 20 69  hash] ){.      i
167e0 66 28 20 73 74 72 63 6d 70 28 74 79 70 65 73 5b  f( strcmp(types[
167f0 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20  hash],stddt)==0 
16800 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d 3e 64  ){.        sp->d
16810 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b  tnum = hash + 1;
16820 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
16830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 68 61        }.      ha
16840 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  sh++;.      if( 
16850 68 61 73 68 3e 3d 61 72 72 61 79 73 69 7a 65 20  hash>=arraysize 
16860 29 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20  ) hash = 0;.    
16870 7d 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b  }.    if( types[
16880 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  hash]==0 ){.    
16890 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61    sp->dtnum = ha
168a0 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 74 79  sh + 1;.      ty
168b0 70 65 73 5b 68 61 73 68 5d 20 3d 20 28 63 68 61  pes[hash] = (cha
168c0 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65  r*)malloc( strle
168d0 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20  n(stddt)+1 );.  
168e0 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61      if( types[ha
168f0 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sh]==0 ){.      
16900 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
16910 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
16920 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78  \n");.        ex
16930 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  it(1);.      }. 
16940 20 20 20 20 20 73 74 72 63 70 79 28 74 79 70 65       strcpy(type
16950 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a  s[hash],stddt);.
16960 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16970 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20 64 65  Print out the de
16980 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f  finition of YYTO
16990 4b 45 4e 54 59 50 45 20 61 6e 64 20 59 59 4d 49  KENTYPE and YYMI
169a0 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d  NORTYPE */.  nam
169b0 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f  e = lemp->name ?
169c0 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50   lemp->name : "P
169d0 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20  arse";.  lineno 
169e0 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66  = *plineno;.  if
169f0 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69  ( mhflag ){ fpri
16a00 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54  ntf(out,"#if INT
16a10 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65  ERFACE\n"); line
16a20 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74  no++; }.  fprint
16a30 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
16a40 73 54 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22  sTOKENTYPE %s\n"
16a50 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d  ,name,.    lemp-
16a60 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d  >tokentype?lemp-
16a70 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64  >tokentype:"void
16a80 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  *");  lineno++;.
16a90 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20    if( mhflag ){ 
16aa0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
16ab0 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
16ac0 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  +; }.  fprintf(o
16ad0 75 74 2c 22 74 79 70 65 64 65 66 20 75 6e 69 6f  ut,"typedef unio
16ae0 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  n {\n"); lineno+
16af0 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
16b00 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59 50 45 20  ,"  %sTOKENTYPE 
16b10 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  yy0;\n",name); l
16b20 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
16b30 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b  =0; i<arraysize;
16b40 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74   i++){.    if( t
16b50 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  ypes[i]==0 ) con
16b60 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e  tinue;.    fprin
16b70 74 66 28 6f 75 74 2c 22 20 20 25 73 20 79 79 25  tf(out,"  %s yy%
16b80 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69  d;\n",types[i],i
16b90 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  +1); lineno++;. 
16ba0 20 20 20 66 72 65 65 28 74 79 70 65 73 5b 69 5d     free(types[i]
16bb0 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  );.  }.  fprintf
16bc0 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79 25 64  (out,"  int yy%d
16bd0 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  ;\n",lemp->errsy
16be0 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e  m->dtnum); linen
16bf0 6f 2b 2b 3b 0a 20 20 66 72 65 65 28 73 74 64 64  o++;.  free(stdd
16c00 74 29 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73  t);.  free(types
16c10 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
16c20 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b  ,"} YYMINORTYPE;
16c30 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
16c40 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e    *plineno = lin
16c50 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eno;.}../*.** Re
16c60 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
16c70 20 61 20 43 20 64 61 74 61 74 79 70 65 20 61 62   a C datatype ab
16c80 6c 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  le to represent 
16c90 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 0a 2a  values between.*
16ca0 2a 20 6c 77 72 20 61 6e 64 20 75 70 72 2c 20 69  * lwr and upr, i
16cb0 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61  nclusive..*/.sta
16cc0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
16cd0 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
16ce0 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75  e(int lwr, int u
16cf0 70 72 29 7b 0a 20 20 69 66 28 20 6c 77 72 3e 3d  pr){.  if( lwr>=
16d00 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75 70 72  0 ){.    if( upr
16d10 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20 20 20 72  <=255 ){.      r
16d20 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20  eturn "unsigned 
16d30 63 68 61 72 22 3b 0a 20 20 20 20 7d 65 6c 73 65  char";.    }else
16d40 20 69 66 28 20 75 70 72 3c 36 35 35 33 35 20 29   if( upr<65535 )
16d50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  {.      return "
16d60 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69  unsigned short i
16d70 6e 74 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nt";.    }else{.
16d80 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e        return "un
16d90 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20  signed int";.   
16da0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c   }.  }else if( l
16db0 77 72 3e 3d 2d 31 32 37 20 26 26 20 75 70 72 3c  wr>=-127 && upr<
16dc0 3d 31 32 37 20 29 7b 0a 20 20 20 20 72 65 74 75  =127 ){.    retu
16dd0 72 6e 20 22 73 69 67 6e 65 64 20 63 68 61 72 22  rn "signed char"
16de0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77  ;.  }else if( lw
16df0 72 3e 3d 2d 33 32 37 36 37 20 26 26 20 75 70 72  r>=-32767 && upr
16e00 3c 33 32 37 36 37 20 29 7b 0a 20 20 20 20 72 65  <32767 ){.    re
16e10 74 75 72 6e 20 22 73 68 6f 72 74 22 3b 0a 20 20  turn "short";.  
16e20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
16e30 6e 20 22 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a  n "int";.  }.}..
16e40 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61 74 65  /*.** Each state
16e50 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 74 20   contains a set 
16e60 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63  of token transac
16e70 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 74 20 6f  tion and a set o
16e80 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  f.** nonterminal
16e90 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20   transactions.  
16ea0 45 61 63 68 20 6f 66 20 74 68 65 73 65 20 73 65  Each of these se
16eb0 74 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74  ts makes an inst
16ec0 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ance.** of the f
16ed0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
16ee0 72 65 2e 20 20 41 6e 20 61 72 72 61 79 20 6f 66  re.  An array of
16ef0 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65   these structure
16f00 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20  s is used.** to 
16f10 6f 72 64 65 72 20 74 68 65 20 63 72 65 61 74 69  order the creati
16f20 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  on of entries in
16f30 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
16f40 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63   table..*/.struc
16f50 74 20 61 78 73 65 74 20 7b 0a 20 20 73 74 72 75  t axset {.  stru
16f60 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
16f70 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f   /* A pointer to
16f80 20 61 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e   a state */.  in
16f90 74 20 69 73 54 6b 6e 3b 20 20 20 20 20 20 20 20  t isTkn;        
16fa0 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73     /* True to us
16fb0 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65  e tokens.  False
16fc0 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61   for non-termina
16fd0 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74  ls */.  int nAct
16fe0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ion;         /* 
16ff0 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e  Number of action
17000 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
17010 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65 74 20  ompare to axset 
17020 73 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 73  structures for s
17030 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a  orting purposes.
17040 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 78  */.static int ax
17050 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73  set_compare(cons
17060 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74  t void *a, const
17070 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72   void *b){.  str
17080 75 63 74 20 61 78 73 65 74 20 2a 70 31 20 3d 20  uct axset *p1 = 
17090 28 73 74 72 75 63 74 20 61 78 73 65 74 2a 29 61  (struct axset*)a
170a0 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74  ;.  struct axset
170b0 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74 20 61   *p2 = (struct a
170c0 78 73 65 74 2a 29 62 3b 0a 20 20 72 65 74 75 72  xset*)b;.  retur
170d0 6e 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20  n p2->nAction - 
170e0 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 7d 0a 0a  p1->nAction;.}..
170f0 2f 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f  /* Generate C so
17100 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68  urce code for th
17110 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64  e parser */.void
17120 20 52 65 70 6f 72 74 54 61 62 6c 65 28 6c 65 6d   ReportTable(lem
17130 70 2c 20 6d 68 66 6c 61 67 29 0a 73 74 72 75 63  p, mhflag).struc
17140 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69  t lemon *lemp;.i
17150 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 2f  nt mhflag;     /
17160 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65  * Output in make
17170 68 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69  headers format i
17180 66 20 74 72 75 65 20 2a 2f 0a 7b 0a 20 20 46 49  f true */.{.  FI
17190 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20  LE *out, *in;.  
171a0 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49  char line[LINESI
171b0 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65  ZE];.  int  line
171c0 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  no;.  struct sta
171d0 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
171e0 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
171f0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
17200 0a 20 20 73 74 72 75 63 74 20 61 63 74 74 61 62  .  struct acttab
17210 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74   *pActtab;.  int
17220 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68 61 72   i, j, n;.  char
17230 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e   *name;.  int mn
17240 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66  TknOfst, mxTknOf
17250 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66  st;.  int mnNtOf
17260 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20  st, mxNtOfst;.  
17270 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 61 78  struct axset *ax
17280 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f  ;..  in = tplt_o
17290 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28  pen(lemp);.  if(
172a0 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   in==0 ) return;
172b0 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70  .  out = file_op
172c0 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 22  en(lemp,".c","w"
172d0 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20  );.  if( out==0 
172e0 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  ){.    fclose(in
172f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
17300 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b   }.  lineno = 1;
17310 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
17320 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
17330 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
17340 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c  enerate the incl
17350 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79  ude code, if any
17360 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
17370 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
17380 69 6e 63 6c 75 64 65 2c 6c 65 6d 70 2d 3e 69 6e  include,lemp->in
17390 63 6c 75 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29  cludeln,&lineno)
173a0 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  ;.  if( mhflag )
173b0 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65  {.    char *name
173c0 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65   = file_makename
173d0 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20  (lemp, ".h");.  
173e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
173f0 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e  include \"%s\"\n
17400 22 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  ", name); lineno
17410 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e 61 6d  ++;.    free(nam
17420 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  e);.  }.  tplt_x
17430 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
17440 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
17450 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23  .  /* Generate #
17460 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20  defines for all 
17470 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20  tokens */.  if( 
17480 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68  mhflag ){.    ch
17490 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20  ar *prefix;.    
174a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66  fprintf(out,"#if
174b0 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20   INTERFACE\n"); 
174c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66  lineno++;.    if
174d0 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  ( lemp->tokenpre
174e0 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c  fix ) prefix = l
174f0 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
17500 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20  ;.    else      
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
17520 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66  efix = "";.    f
17530 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=1; i<lemp->
17540 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b  nterminal; i++){
17550 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
17560 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  ut,"#define %s%-
17570 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69  30s %2d\n",prefi
17580 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
17590 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
175a0 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
175b0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
175c0 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
175d0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
175e0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
175f0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
17600 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
17610 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73  rate the defines
17620 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
17630 74 2c 22 2f 2a 20 5c 30 30 31 20 2a 2f 5c 6e 22  t,"/* \001 */\n"
17640 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  );.  fprintf(out
17650 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45  ,"#define YYCODE
17660 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
17670 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
17680 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  e(0, lemp->nsymb
17690 6f 6c 2b 35 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ol+5)); lineno++
176a0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
176b0 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44  "#define YYNOCOD
176c0 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73  E %d\n",lemp->ns
176d0 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e  ymbol+1);  linen
176e0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
176f0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43  ut,"#define YYAC
17700 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a  TIONTYPE %s\n",.
17710 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
17720 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e  _type(0, lemp->n
17730 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c  state+lemp->nrul
17740 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  e+5));  lineno++
17750 3b 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  ;.  print_stack_
17760 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26  union(out,lemp,&
17770 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a  lineno,mhflag);.
17780 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63    if( lemp->stac
17790 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  ksize ){.    if(
177a0 20 61 74 6f 69 28 6c 65 6d 70 2d 3e 73 74 61 63   atoi(lemp->stac
177b0 6b 73 69 7a 65 29 3c 3d 30 20 29 7b 0a 20 20 20  ksize)<=0 ){.   
177c0 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
177d0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 49  ->filename,0,."I
177e0 6c 6c 65 67 61 6c 20 73 74 61 63 6b 20 73 69 7a  llegal stack siz
177f0 65 3a 20 5b 25 73 5d 2e 20 20 54 68 65 20 73 74  e: [%s].  The st
17800 61 63 6b 20 73 69 7a 65 20 73 68 6f 75 6c 64 20  ack size should 
17810 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  be an integer co
17820 6e 73 74 61 6e 74 2e 22 2c 0a 20 20 20 20 20 20  nstant.",.      
17830 20 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a    lemp->stacksiz
17840 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e  e);.      lemp->
17850 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
17860 20 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a    lemp->stacksiz
17870 65 20 3d 20 22 31 30 30 22 3b 0a 20 20 20 20 7d  e = "100";.    }
17880 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
17890 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43  ,"#define YYSTAC
178a0 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d  KDEPTH %s\n",lem
178b0 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 20 20  p->stacksize);  
178c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73  lineno++;.  }els
178d0 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
178e0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54  ut,"#define YYST
178f0 41 43 4b 44 45 50 54 48 20 31 30 30 5c 6e 22 29  ACKDEPTH 100\n")
17900 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
17910 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
17920 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
17930 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c  ,"#if INTERFACE\
17940 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
17950 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70   }.  name = lemp
17960 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e  ->name ? lemp->n
17970 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20  ame : "Parse";. 
17980 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26   if( lemp->arg &
17990 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29  & lemp->arg[0] )
179a0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
179b0 20 69 20 3d 20 73 74 72 6c 65 6e 28 6c 65 6d 70   i = strlen(lemp
179c0 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77 68 69 6c  ->arg);.    whil
179d0 65 28 20 69 3e 3d 31 20 26 26 20 69 73 73 70 61  e( i>=1 && isspa
179e0 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31  ce(lemp->arg[i-1
179f0 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77 68  ]) ) i--;.    wh
17a00 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28 69 73  ile( i>=1 && (is
17a10 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72 67 5b  alnum(lemp->arg[
17a20 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61  i-1]) || lemp->a
17a30 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29 20  rg[i-1]=='_') ) 
17a40 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  i--;.    fprintf
17a50 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
17a60 41 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e 22  ARG_SDECL %s;\n"
17a70 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29  ,name,lemp->arg)
17a80 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
17a90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
17aa0 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43  efine %sARG_PDEC
17ab0 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65  L ,%s\n",name,le
17ac0 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e  mp->arg);  linen
17ad0 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
17ae0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
17af0 41 52 47 5f 46 45 54 43 48 20 25 73 20 3d 20 79  ARG_FETCH %s = y
17b00 79 70 50 61 72 73 65 72 2d 3e 25 73 5c 6e 22 2c  ypParser->%s\n",
17b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17b20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67    name,lemp->arg
17b30 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b  ,&lemp->arg[i]);
17b40 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
17b50 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
17b60 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52 45  fine %sARG_STORE
17b70 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 20 3d   yypParser->%s =
17b80 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
17b90 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 26 6c           name,&l
17ba0 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d  emp->arg[i],&lem
17bb0 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e  p->arg[i]);  lin
17bc0 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eno++;.  }else{.
17bd0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17be0 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
17bf0 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20  DECL\n",name);  
17c00 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
17c10 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
17c20 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c 5c 6e  ne %sARG_PDECL\n
17c30 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f  ",name);  lineno
17c40 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
17c50 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
17c60 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d 65  RG_FETCH\n",name
17c70 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
17c80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
17c90 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52  efine %sARG_STOR
17ca0 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  E\n",name); line
17cb0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  no++;.  }.  if( 
17cc0 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70  mhflag ){.    fp
17cd0 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69  rintf(out,"#endi
17ce0 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
17cf0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
17d00 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 53  ut,"#define YYNS
17d10 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d  TATE %d\n",lemp-
17d20 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69 6e 65 6e  >nstate);  linen
17d30 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
17d40 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 52  ut,"#define YYNR
17d50 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  ULE %d\n",lemp->
17d60 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  nrule);  lineno+
17d70 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
17d80 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52 4f  ,"#define YYERRO
17d90 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c 6c 65  RSYMBOL %d\n",le
17da0 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e 64 65  mp->errsym->inde
17db0 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  x);  lineno++;. 
17dc0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
17dd0 65 66 69 6e 65 20 59 59 45 52 52 53 59 4d 44 54  efine YYERRSYMDT
17de0 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65   yy%d\n",lemp->e
17df0 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 20  rrsym->dtnum);  
17e00 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
17e10 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  lemp->has_fallba
17e20 63 6b 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ck ){.    fprint
17e30 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
17e40 59 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b  YFALLBACK 1\n");
17e50 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a    lineno++;.  }.
17e60 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
17e70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
17e80 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
17e90 6e 65 72 61 74 65 20 74 68 65 20 61 63 74 69 6f  nerate the actio
17ea0 6e 20 74 61 62 6c 65 20 61 6e 64 20 69 74 73 20  n table and its 
17eb0 61 73 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a  associates:.  **
17ec0 0a 20 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e  .  **  yy_action
17ed0 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69 6e 67  []        A sing
17ee0 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  le table contain
17ef0 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e  ing all actions.
17f00 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68  .  **  yy_lookah
17f10 65 61 64 5b 5d 20 20 20 20 20 41 20 74 61 62 6c  ead[]     A tabl
17f20 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
17f30 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 65   lookahead for e
17f40 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a  ach entry in.  *
17f50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
17f60 20 20 20 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e        yy_action.
17f70 20 20 55 73 65 64 20 74 6f 20 64 65 74 65 63 74    Used to detect
17f80 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73   hash collisions
17f90 2e 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69 66 74  ..  **  yy_shift
17fa0 5f 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72 20 65  _ofst[]    For e
17fb0 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f  ach state, the o
17fc0 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63  ffset into yy_ac
17fd0 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20  tion for.  **   
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 73 68 69 66 74 69 6e 67 20 74 65 72 6d 69    shifting termi
18000 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72  nals..  **  yy_r
18010 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46  educe_ofst[]   F
18020 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c 20 74  or each state, t
18030 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79  he offset into y
18040 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a  y_action for.  *
18050 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
18060 20 20 20 20 20 20 73 68 69 66 74 69 6e 67 20 6e        shifting n
18070 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66 74  on-terminals aft
18080 65 72 20 61 20 72 65 64 75 63 65 2e 0a 20 20 2a  er a reduce..  *
18090 2a 20 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20  *  yy_default[] 
180a0 20 20 20 20 20 20 44 65 66 61 75 6c 74 20 61 63        Default ac
180b0 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 74  tion for each st
180c0 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ate..  */..  /* 
180d0 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69  Compute the acti
180e0 6f 6e 73 20 6f 6e 20 61 6c 6c 20 73 74 61 74 65  ons on all state
180f0 73 20 61 6e 64 20 63 6f 75 6e 74 20 74 68 65 6d  s and count them
18100 20 75 70 20 2a 2f 0a 20 20 61 78 20 3d 20 6d 61   up */.  ax = ma
18110 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61 78 5b  lloc( sizeof(ax[
18120 30 5d 29 2a 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  0])*lemp->nstate
18130 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d  *2 );.  if( ax==
18140 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
18150 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20  (stderr,"malloc 
18160 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20  failed\n");.    
18170 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66  exit(1);.  }.  f
18180 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
18190 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
181a0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
181b0 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70  rted[i];.    stp
181c0 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d  ->nTknAct = stp-
181d0 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20 20  >nNtAct = 0;.   
181e0 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 6c 65   stp->iDflt = le
181f0 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d  mp->nstate + lem
18200 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 73 74  p->nrule;.    st
18210 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f  p->iTknOfst = NO
18220 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74 70  _OFFSET;.    stp
18230 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f  ->iNtOfst = NO_O
18240 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28 61  FFSET;.    for(a
18250 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
18260 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
18270 20 20 20 69 66 28 20 63 6f 6d 70 75 74 65 5f 61     if( compute_a
18280 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d  ction(lemp,ap)>=
18290 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
182a0 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c   ap->sp->index<l
182b0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
182c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d  {.          stp-
182d0 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20 20  >nTknAct++;.    
182e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70      }else if( ap
182f0 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70  ->sp->index<lemp
18300 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20  ->nsymbol ){.   
18310 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74 41         stp->nNtA
18320 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  ct++;.        }e
18330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
18340 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f 6d 70  tp->iDflt = comp
18350 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
18360 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ap);.        }.
18370 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18380 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20 3d 20    ax[i*2].stp = 
18390 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  stp;.    ax[i*2]
183a0 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20 20 20  .isTkn = 1;.    
183b0 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20  ax[i*2].nAction 
183c0 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a  = stp->nTknAct;.
183d0 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 73 74      ax[i*2+1].st
183e0 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b  p = stp;.    ax[
183f0 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20 30  i*2+1].isTkn = 0
18400 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
18410 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e  nAction = stp->n
18420 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d 78 54  NtAct;.  }.  mxT
18430 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66  knOfst = mnTknOf
18440 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f 66  st = 0;.  mxNtOf
18450 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st = mnNtOfst = 
18460 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  0;..  /* Compute
18470 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
18480 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  e.  In order to 
18490 74 72 79 20 74 6f 20 6b 65 65 70 20 74 68 65 20  try to keep the 
184a0 73 69 7a 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  size of the.  **
184b0 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 74 6f   action table to
184c0 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 74 68 65 20   a minimum, the 
184d0 68 65 75 72 69 73 74 69 63 20 6f 66 20 70 6c 61  heuristic of pla
184e0 63 69 6e 67 20 74 68 65 20 6c 61 72 67 65 73 74  cing the largest
184f0 20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 73 65 74   action.  ** set
18500 73 20 66 69 72 73 74 20 69 73 20 75 73 65 64 2e  s first is used.
18510 0a 20 20 2a 2f 0a 20 20 71 73 6f 72 74 28 61 78  .  */.  qsort(ax
18520 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  , lemp->nstate*2
18530 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2c  , sizeof(ax[0]),
18540 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 29 3b   axset_compare);
18550 0a 20 20 70 41 63 74 74 61 62 20 3d 20 61 63 74  .  pActtab = act
18560 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 66  tab_alloc();.  f
18570 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
18580 6e 73 74 61 74 65 2a 32 20 26 26 20 61 78 5b 69  nstate*2 && ax[i
18590 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b  ].nAction>0; i++
185a0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 61 78 5b  ){.    stp = ax[
185b0 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69 66 28 20  i].stp;.    if( 
185c0 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20  ax[i].isTkn ){. 
185d0 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d       for(ap=stp-
185e0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
185f0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
18600 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20  nt action;.     
18610 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
18620 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72  ndex>=lemp->nter
18630 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
18640 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e  ;.        action
18650 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f   = compute_actio
18660 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20  n(lemp, ap);.   
18670 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c       if( action<
18680 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
18690 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74        acttab_act
186a0 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d  ion(pActtab, ap-
186b0 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69  >sp->index, acti
186c0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on);.      }.   
186d0 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74     stp->iTknOfst
186e0 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
186f0 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
18700 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66   if( stp->iTknOf
18710 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20 6d  st<mnTknOfst ) m
18720 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e  nTknOfst = stp->
18730 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20 20  iTknOfst;.      
18740 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  if( stp->iTknOfs
18750 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d 78  t>mxTknOfst ) mx
18760 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69  TknOfst = stp->i
18770 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65 6c  TknOfst;.    }el
18780 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70  se{.      for(ap
18790 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
187a0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
187b0 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a      int action;.
187c0 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
187d0 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
187e0 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74  nterminal ) cont
187f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
18800 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d  ( ap->sp->index=
18810 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29  =lemp->nsymbol )
18820 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
18830 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70     action = comp
18840 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
18850 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66   ap);.        if
18860 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e  ( action<0 ) con
18870 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
18880 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63  cttab_action(pAc
18890 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e  ttab, ap->sp->in
188a0 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  dex, action);.  
188b0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d      }.      stp-
188c0 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63 74 74 61  >iNtOfst = actta
188d0 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62  b_insert(pActtab
188e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
188f0 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66  ->iNtOfst<mnNtOf
18900 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d 20  st ) mnNtOfst = 
18910 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20  stp->iNtOfst;.  
18920 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74      if( stp->iNt
18930 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29 20  Ofst>mxNtOfst ) 
18940 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e  mxNtOfst = stp->
18950 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a 20  iNtOfst;.    }. 
18960 20 7d 0a 20 20 66 72 65 65 28 61 78 29 3b 0a 0a   }.  free(ax);..
18970 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
18980 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  yy_action table 
18990 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
189a0 2c 22 73 74 61 74 69 63 20 59 59 41 43 54 49 4f  ,"static YYACTIO
189b0 4e 54 59 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b  NTYPE yy_action[
189c0 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ] = {\n"); linen
189d0 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 61 63 74 74 61  o++;.  n = actta
189e0 62 5f 73 69 7a 65 28 70 41 63 74 74 61 62 29 3b  b_size(pActtab);
189f0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c  .  for(i=j=0; i<
18a00 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; i++){.    int
18a10 20 61 63 74 69 6f 6e 20 3d 20 61 63 74 74 61 62   action = acttab
18a20 5f 79 79 61 63 74 69 6f 6e 28 70 41 63 74 74 61  _yyaction(pActta
18a30 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 61  b, i);.    if( a
18a40 63 74 69 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e  ction<0 ) action
18a50 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   = lemp->nsymbol
18a60 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b   + lemp->nrule +
18a70 20 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30   2;.    if( j==0
18a80 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
18a90 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
18aa0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
18ab0 74 2c 20 22 20 25 34 64 2c 22 2c 20 61 63 74 69  t, " %4d,", acti
18ac0 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  on);.    if( j==
18ad0 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
18ae0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
18af0 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
18b00 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
18b10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18b20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
18b30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
18b40 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
18b50 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
18b60 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20  he yy_lookahead 
18b70 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e  table */.  fprin
18b80 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20 59  tf(out,"static Y
18b90 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f 6f  YCODETYPE yy_loo
18ba0 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29  kahead[] = {\n")
18bb0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
18bc0 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
18bd0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20 3d  +){.    int la =
18be0 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68   acttab_yylookah
18bf0 65 61 64 28 70 41 63 74 74 61 62 2c 20 69 29 3b  ead(pActtab, i);
18c00 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29 20  .    if( la<0 ) 
18c10 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  la = lemp->nsymb
18c20 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30  ol;.    if( j==0
18c30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
18c40 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
18c50 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
18c60 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29 3b  t, " %4d,", la);
18c70 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
18c80 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
18c90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
18ca0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
18cb0 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
18cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
18cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
18ce0 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
18cf0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
18d00 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
18d10 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 74  y_shift_ofst[] t
18d20 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
18d30 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
18d40 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46 4c  YY_SHIFT_USE_DFL
18d50 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e  T (%d)\n", mnTkn
18d60 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  Ofst-1); lineno+
18d70 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
18d80 2c 20 22 73 74 61 74 69 63 20 25 73 20 79 79 5f  , "static %s yy_
18d90 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b  shift_ofst[] = {
18da0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
18db0 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
18dc0 65 28 6d 6e 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d  e(mnTknOfst-1, m
18dd0 78 54 6b 6e 4f 66 73 74 29 29 3b 20 6c 69 6e 65  xTknOfst)); line
18de0 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70  no++;.  n = lemp
18df0 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72 28  ->nstate;.  for(
18e00 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
18e10 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a  {.    int ofst;.
18e20 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
18e30 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f  sorted[i];.    o
18e40 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f  fst = stp->iTknO
18e50 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73  fst;.    if( ofs
18e60 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f  t==NO_OFFSET ) o
18e70 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20  fst = mnTknOfst 
18e80 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  - 1;.    if( j==
18e90 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
18ea0 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
18eb0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
18ec0 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73  ut, " %4d,", ofs
18ed0 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  t);.    if( j==9
18ee0 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
18ef0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
18f00 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
18f10 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
18f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18f30 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
18f40 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
18f50 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
18f60 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
18f70 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74  e yy_reduce_ofst
18f80 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  [] table */.  fp
18f90 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
18fa0 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55 53  ine YY_REDUCE_US
18fb0 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20  E_DFLT (%d)\n", 
18fc0 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69 6e  mnNtOfst-1); lin
18fd0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
18fe0 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 25 73  (out, "static %s
18ff0 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
19000 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20  ] = {\n", .     
19010 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a       minimum_siz
19020 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d  e_type(mnNtOfst-
19030 31 2c 20 6d 78 4e 74 4f 66 73 74 29 29 3b 20 6c  1, mxNtOfst)); l
19040 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c  ineno++;.  n = l
19050 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66  emp->nstate;.  f
19060 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
19070 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73  ++){.    int ofs
19080 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  t;.    stp = lem
19090 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
190a0 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e    ofst = stp->iN
190b0 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  tOfst;.    if( o
190c0 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
190d0 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74   ofst = mnNtOfst
190e0 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d   - 1;.    if( j=
190f0 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
19100 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
19110 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
19120 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66  out, " %4d,", of
19130 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  st);.    if( j==
19140 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
19150 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
19160 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
19170 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
19180 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19190 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
191a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
191b0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
191c0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
191d0 68 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f  he default actio
191e0 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  n table */.  fpr
191f0 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69  intf(out, "stati
19200 63 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79  c YYACTIONTYPE y
19210 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c  y_default[] = {\
19220 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
19230 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74   n = lemp->nstat
19240 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  e;.  for(i=j=0; 
19250 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  i<n; i++){.    s
19260 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
19270 64 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 6a 3d  d[i];.    if( j=
19280 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
19290 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
192a0 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
192b0 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 73 74  out, " %4d,", st
192c0 70 2d 3e 69 44 66 6c 74 29 3b 0a 20 20 20 20 69  p->iDflt);.    i
192d0 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
192e0 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
192f0 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
19300 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
19310 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
19320 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
19330 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
19340 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
19350 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78  neno++;.  tplt_x
19360 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
19370 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
19380 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
19390 68 65 20 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c  he table of fall
193a0 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a  back tokens..  *
193b0 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61  /.  if( lemp->ha
193c0 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  s_fallback ){.  
193d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
193e0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
193f0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
19400 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d   symbol *p = lem
19410 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
19420 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c       if( p->fall
19430 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  back==0 ){.     
19440 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
19450 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73  "    0,  /* %10s
19460 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e   => nothing */\n
19470 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ", p->name);.   
19480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19490 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
194a0 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20    %3d,  /* %10s 
194b0 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  => %s */\n", p->
194c0 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c  fallback->index,
194d0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61  .          p->na
194e0 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d  me, p->fallback-
194f0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
19500 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a        lineno++;.
19510 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74      }.  }.  tplt
19520 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
19530 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65  , in, out, &line
19540 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
19550 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74  ate a table cont
19560 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f  aining the symbo
19570 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72  lic name of ever
19580 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20  y symbol.  */.  
19590 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
195a0 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
195b0 20 20 20 20 73 70 72 69 6e 74 66 28 6c 69 6e 65      sprintf(line
195c0 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d  ,"\"%s\",",lemp-
195d0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
195e0 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  e);.    fprintf(
195f0 6f 75 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69  out,"  %-15s",li
19600 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28 69 26  ne);.    if( (i&
19610 33 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74 66  3)==3 ){ fprintf
19620 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65  (out,"\n"); line
19630 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66  no++; }.  }.  if
19640 28 20 28 69 26 33 29 21 3d 30 20 29 7b 20 66 70  ( (i&3)!=0 ){ fp
19650 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
19660 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74   lineno++; }.  t
19670 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
19680 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
19690 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
196a0 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74  ate a table cont
196b0 61 69 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74  aining a text st
196c0 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
196d0 62 65 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72  bes every.  ** r
196e0 75 6c 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20  ule in the rule 
196f0 73 65 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  set of the gramm
19700 65 72 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  er.  This inform
19710 61 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20  ation is used.  
19720 2a 2a 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20  ** when tracing 
19730 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a  REDUCE actions..
19740 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
19750 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
19760 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20  p; rp=rp->next, 
19770 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
19780 28 20 72 70 2d 3e 69 6e 64 65 78 3d 3d 69 20 29  ( rp->index==i )
19790 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
197a0 74 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22  t," /* %3d */ \"
197b0 25 73 20 3a 3a 3d 22 2c 20 69 2c 20 72 70 2d 3e  %s ::=", i, rp->
197c0 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  lhs->name);.    
197d0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e  for(j=0; j<rp->n
197e0 72 68 73 3b 20 6a 2b 2b 29 20 66 70 72 69 6e 74  rhs; j++) fprint
197f0 66 28 6f 75 74 2c 22 20 25 73 22 2c 72 70 2d 3e  f(out," %s",rp->
19800 72 68 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  rhs[j]->name);. 
19810 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19820 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  \",\n"); lineno+
19830 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
19840 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
19850 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
19860 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
19870 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
19880 73 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 73  s every time a s
19890 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20  ymbol is popped 
198a0 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74  from.  ** the st
198b0 61 63 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73  ack while proces
198c0 73 69 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77  sing errors or w
198d0 68 69 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20  hile destroying 
198e0 74 68 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a  the parser. .  *
198f0 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  * (In other word
19900 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  s, generate the 
19910 25 64 65 73 74 72 75 63 74 6f 72 20 61 63 74 69  %destructor acti
19920 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons).  */.  if( 
19930 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20  lemp->tokendest 
19940 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
19950 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
19960 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
19970 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
19980 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
19990 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d  ];.      if( sp=
199a0 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d  =0 || sp->type!=
199b0 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69  TERMINAL ) conti
199c0 6e 75 65 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  nue;.      fprin
199d0 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
199e0 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65   %d:\n",sp->inde
199f0 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
19a00 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
19a10 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
19a20 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c   && lemp->symbol
19a30 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52 4d  s[i]->type!=TERM
19a40 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20 20  INAL; i++);.    
19a50 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  if( i<lemp->nsym
19a60 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d 69  bol ){.      emi
19a70 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
19a80 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62  e(out,lemp->symb
19a90 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e  ols[i],lemp,&lin
19aa0 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72 69  eno);.      fpri
19ab0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
19ac0 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
19ad0 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  o++;.    }.  }. 
19ae0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
19af0 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
19b00 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
19b10 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
19b20 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69  ymbols[i];.    i
19b30 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e  f( sp==0 || sp->
19b40 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c  type==TERMINAL |
19b50 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  | sp->destructor
19b60 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
19b70 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19b80 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22  "    case %d:\n"
19b90 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e  ,sp->index); lin
19ba0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 65 6d 69 74 5f  eno++;.    emit_
19bb0 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
19bc0 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  out,lemp->symbol
19bd0 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  s[i],lemp,&linen
19be0 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  o);.    fprintf(
19bf0 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
19c00 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
19c10 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
19c20 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20  >vardest ){.    
19c30 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
19c40 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20  flt_sp = 0;.    
19c50 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
19c60 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
19c70 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
19c80 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
19c90 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
19ca0 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73    if( sp==0 || s
19cb0 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
19cc0 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73  L ||.          s
19cd0 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73  p->index<=0 || s
19ce0 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30  p->destructor!=0
19cf0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
19d00 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19d10 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c      case %d:\n",
19d20 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65  sp->index); line
19d30 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74  no++;.      dflt
19d40 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a  _sp = sp;.    }.
19d50 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21      if( dflt_sp!
19d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74  =0 ){.      emit
19d70 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65  _destructor_code
19d80 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d  (out,dflt_sp,lem
19d90 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
19da0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
19db0 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
19dc0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
19dd0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
19de0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
19df0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
19e00 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
19e10 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
19e20 77 68 65 6e 65 76 65 72 20 74 68 65 20 70 61 72  whenever the par
19e30 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c  ser stack overfl
19e40 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  ows */.  tplt_pr
19e50 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
19e60 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 6c 65 6d 70  p->overflow,lemp
19e70 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 2c 26 6c 69  ->overflowln,&li
19e80 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
19e90 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
19ea0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
19eb0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
19ec0 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c 65 20  e table of rule 
19ed0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a  information .  *
19ee0 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69  *.  ** Note: Thi
19ef0 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
19f00 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
19f10 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72  rules are number
19f20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c  .  ** sequentual
19f30 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ly beginning wit
19f40 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  h 0..  */.  for(
19f50 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
19f60 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
19f70 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
19f80 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c  ,"  { %d, %d },\
19f90 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65  n",rp->lhs->inde
19fa0 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e  x,rp->nrhs); lin
19fb0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
19fc0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
19fd0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
19fe0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
19ff0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1a000 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61  cution during ea
1a010 63 68 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e  ch REDUCE action
1a020 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
1a030 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
1a040 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66  rp->next){.    f
1a050 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1a060 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 72 70    case %d:\n",rp
1a070 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f  ->index); lineno
1a080 2b 2b 3b 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64  ++;.    emit_cod
1a090 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c  e(out,rp,lemp,&l
1a0a0 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69  ineno);.    fpri
1a0b0 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20  ntf(out,"       
1a0c0 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1a0d0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1a0e0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1a0f0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1a100 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1a110 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1a120 63 75 74 65 73 20 69 66 20 61 20 70 61 72 73 65  cutes if a parse
1a130 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74   fails */.  tplt
1a140 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1a150 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 6c 65  lemp->failure,le
1a160 6d 70 2d 3e 66 61 69 6c 75 72 65 6c 6e 2c 26 6c  mp->failureln,&l
1a170 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
1a180 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1a190 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1a1a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1a1b0 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1a1c0 65 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78  es when a syntax
1a1d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f   error occurs */
1a1e0 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1a1f0 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72  t,lemp,lemp->err
1a200 6f 72 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 6c 6e  or,lemp->errorln
1a210 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
1a220 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1a230 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1a240 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1a250 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1a260 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 70  cutes when the p
1a270 61 72 73 65 72 20 61 63 63 65 70 74 73 20 69 74  arser accepts it
1a280 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c  s input */.  tpl
1a290 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1a2a0 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c 6c 65  ,lemp->accept,le
1a2b0 6d 70 2d 3e 61 63 63 65 70 74 6c 6e 2c 26 6c 69  mp->acceptln,&li
1a2c0 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1a2d0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1a2e0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1a2f0 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20    /* Append any 
1a300 61 64 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68  addition code th
1a310 65 20 75 73 65 72 20 64 65 73 69 72 65 73 20 2a  e user desires *
1a320 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
1a330 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78  ut,lemp,lemp->ex
1a340 74 72 61 63 6f 64 65 2c 6c 65 6d 70 2d 3e 65 78  tracode,lemp->ex
1a350 74 72 61 63 6f 64 65 6c 6e 2c 26 6c 69 6e 65 6e  tracodeln,&linen
1a360 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e  o);..  fclose(in
1a370 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29  );.  fclose(out)
1a380 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
1a390 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 65 61  * Generate a hea
1a3a0 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65  der file for the
1a3b0 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20   parser */.void 
1a3c0 52 65 70 6f 72 74 48 65 61 64 65 72 28 6c 65 6d  ReportHeader(lem
1a3d0 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
1a3e0 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c 45 20  *lemp;.{.  FILE 
1a3f0 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61  *out, *in;.  cha
1a400 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61  r *prefix;.  cha
1a410 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
1a420 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65 72 6e  ;.  char pattern
1a430 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e  [LINESIZE];.  in
1a440 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70  t i;..  if( lemp
1a450 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20  ->tokenprefix ) 
1a460 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74  prefix = lemp->t
1a470 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c  okenprefix;.  el
1a480 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
1a490 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22        prefix = "
1a4a0 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f  ";.  in = file_o
1a4b0 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72  pen(lemp,".h","r
1a4c0 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a  ");.  if( in ){.
1a4d0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c      for(i=1; i<l
1a4e0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26  emp->nterminal &
1a4f0 26 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e  & fgets(line,LIN
1a500 45 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b  ESIZE,in); i++){
1a510 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70  .      sprintf(p
1a520 61 74 74 65 72 6e 2c 22 23 64 65 66 69 6e 65 20  attern,"#define 
1a530 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70  %s%-30s %2d\n",p
1a540 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
1a550 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
1a560 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
1a570 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20  p(line,pattern) 
1a580 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
1a590 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
1a5a0 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e     if( i==lemp->
1a5b0 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20  nterminal ){.   
1a5c0 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20     /* No change 
1a5d0 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 44 6f  in the file.  Do
1a5e0 6e 27 74 20 72 65 77 72 69 74 65 20 69 74 2e 20  n't rewrite it. 
1a5f0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
1a600 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74  .    }.  }.  out
1a610 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d   = file_open(lem
1a620 70 2c 22 2e 68 22 2c 22 77 22 29 3b 0a 20 20 69  p,".h","w");.  i
1a630 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f  f( out ){.    fo
1a640 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
1a650 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
1a660 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1a670 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  t,"#define %s%-3
1a680 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78  0s %2d\n",prefix
1a690 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1a6a0 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
1a6b0 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74  }.    fclose(out
1a6c0 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  );  .  }.  retur
1a6d0 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20  n;.}../* Reduce 
1a6e0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a6f0 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69  action tables, i
1a700 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d  f possible, by m
1a710 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20  aking use.** of 
1a720 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20  defaults..**.** 
1a730 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c  In this version,
1a740 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d 6f 73   we take the mos
1a750 74 20 66 72 65 71 75 65 6e 74 20 52 45 44 55 43  t frequent REDUC
1a760 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b  E action and mak
1a770 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65 66 61  e.** it the defa
1a780 75 6c 74 2e 20 20 4f 6e 6c 79 20 64 65 66 61 75  ult.  Only defau
1a790 6c 74 20 61 20 72 65 64 75 63 65 20 69 66 20 74  lt a reduce if t
1a7a0 68 65 72 65 20 61 72 65 20 6d 6f 72 65 20 74 68  here are more th
1a7b0 61 6e 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  an one..*/.void 
1a7c0 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 6c  CompressTables(l
1a7d0 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
1a7e0 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72  n *lemp;.{.  str
1a7f0 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
1a800 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
1a810 2a 61 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72  *ap, *ap2;.  str
1a820 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72  uct rule *rp, *r
1a830 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e  p2, *rbest;.  in
1a840 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e  t nbest, n;.  in
1a850 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  t i;..  for(i=0;
1a860 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
1a870 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1a880 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1a890 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b  ;.    nbest = 0;
1a8a0 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a  .    rbest = 0;.
1a8b0 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
1a8c0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1a8d0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1a8e0 20 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43   ap->type!=REDUC
1a8f0 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  E ) continue;.  
1a900 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72      rp = ap->x.r
1a910 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 3d  p;.      if( rp=
1a920 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75  =rbest ) continu
1a930 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  e;.      n = 1;.
1a940 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d 61 70        for(ap2=ap
1a950 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61 70 32  ->next; ap2; ap2
1a960 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =ap2->next){.   
1a970 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e 74 79       if( ap2->ty
1a980 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e  pe!=REDUCE ) con
1a990 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 72  tinue;.        r
1a9a0 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a  p2 = ap2->x.rp;.
1a9b0 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d          if( rp2=
1a9c0 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75  =rbest ) continu
1a9d0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e;.        if( r
1a9e0 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20  p2==rp ) n++;.  
1a9f0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1aa00 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20 20 20  n>nbest ){.     
1aa10 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20     nbest = n;.  
1aa20 20 20 20 20 20 20 72 62 65 73 74 20 3d 20 72 70        rbest = rp
1aa30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1aa40 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20   .    /* Do not 
1aa50 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20 69  make a default i
1aa60 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1aa70 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c 74  rules to default
1aa80 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  .    ** is not a
1aa90 74 20 6c 65 61 73 74 20 32 20 2a 2f 0a 20 20 20  t least 2 */.   
1aaa0 20 69 66 28 20 6e 62 65 73 74 3c 32 20 29 20 63   if( nbest<2 ) c
1aab0 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f  ontinue;...    /
1aac0 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69  * Combine matchi
1aad0 6e 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e  ng REDUCE action
1aae0 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20  s into a single 
1aaf0 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66  default */.    f
1ab00 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
1ab10 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
1ab20 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
1ab30 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61  ype==REDUCE && a
1ab40 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29  p->x.rp==rbest )
1ab50 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ab60 20 20 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a    assert( ap );.
1ab70 20 20 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d      ap->sp = Sym
1ab80 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c  bol_new("{defaul
1ab90 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70  t}");.    for(ap
1aba0 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61  =ap->next; ap; a
1abb0 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
1abc0 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
1abd0 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78  =REDUCE && ap->x
1abe0 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d  .rp==rbest ) ap-
1abf0 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44  >type = NOT_USED
1ac00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d  ;.    }.    stp-
1ac10 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72  >ap = Action_sor
1ac20 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a  t(stp->ap);.  }.
1ac30 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
1ac40 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1ac50 69 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a  ile "set.c" ****
1ac60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac80 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69  /./*.** Set mani
1ac90 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  pulation routine
1aca0 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20  s for the LEMON 
1acb0 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
1acc0 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
1acd0 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53   size = 0;../* S
1ace0 65 74 20 74 68 65 20 73 65 74 20 73 69 7a 65 20  et the set size 
1acf0 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28  */.void SetSize(
1ad00 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69  n).int n;.{.  si
1ad10 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20  ze = n+1;.}../* 
1ad20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
1ad30 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e  et */.char *SetN
1ad40 65 77 28 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b  ew(){.  char *s;
1ad50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 20 3d 20  .  int i;.  s = 
1ad60 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 73  (char*)malloc( s
1ad70 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 73 3d 3d  ize );.  if( s==
1ad80 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  0 ){.    extern 
1ad90 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
1ada0 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f  r();.    memory_
1adb0 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 66  error();.  }.  f
1adc0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
1add0 69 2b 2b 29 20 73 5b 69 5d 20 3d 20 30 3b 0a 20  i++) s[i] = 0;. 
1ade0 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a   return s;.}../*
1adf0 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65   Deallocate a se
1ae00 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65  t */.void SetFre
1ae10 65 28 73 29 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a  e(s).char *s;.{.
1ae20 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a    free(s);.}../*
1ae30 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
1ae40 6e 74 20 74 6f 20 74 68 65 20 73 65 74 2e 20 20  nt to the set.  
1ae50 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1ae60 68 65 20 65 6c 65 6d 65 6e 74 20 77 61 73 20 61  he element was a
1ae70 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53  dded.** and FALS
1ae80 45 20 69 66 20 69 74 20 77 61 73 20 61 6c 72 65  E if it was alre
1ae90 61 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e  ady there. */.in
1aea0 74 20 53 65 74 41 64 64 28 73 2c 65 29 0a 63 68  t SetAdd(s,e).ch
1aeb0 61 72 20 2a 73 3b 0a 69 6e 74 20 65 3b 0a 7b 0a  ar *s;.int e;.{.
1aec0 20 20 69 6e 74 20 72 76 3b 0a 20 20 72 76 20 3d    int rv;.  rv =
1aed0 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20   s[e];.  s[e] = 
1aee0 31 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b  1;.  return !rv;
1aef0 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79  .}../* Add every
1af00 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74   element of s2 t
1af10 6f 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52  o s1.  Return TR
1af20 55 45 20 69 66 20 73 31 20 63 68 61 6e 67 65 73  UE if s1 changes
1af30 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f  . */.int SetUnio
1af40 6e 28 73 31 2c 73 32 29 0a 63 68 61 72 20 2a 73  n(s1,s2).char *s
1af50 31 3b 0a 63 68 61 72 20 2a 73 32 3b 0a 7b 0a 20  1;.char *s2;.{. 
1af60 20 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73 73   int i, progress
1af70 3b 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30  ;.  progress = 0
1af80 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
1af90 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ize; i++){.    i
1afa0 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f  f( s2[i]==0 ) co
1afb0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
1afc0 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  s1[i]==0 ){.    
1afd0 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a    progress = 1;.
1afe0 20 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b        s1[i] = 1;
1aff0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1b000 75 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a  urn progress;.}.
1b010 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1b020 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
1b030 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22 20   file "table.c" 
1b040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
1b060 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20  .** All code in 
1b070 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65  this file has be
1b080 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  en automatically
1b090 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72   generated.** fr
1b0a0 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69  om a specificati
1b0b0 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a  on in the file.*
1b0c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  *              "
1b0d0 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74  table.q".** by t
1b0e0 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  he associative a
1b0f0 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69  rray code buildi
1b100 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65  ng program "aage
1b110 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64  n"..** Do not ed
1b120 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49  it this file!  I
1b130 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65  nstead, edit the
1b140 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a   specification.*
1b150 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72  * file, then rer
1b160 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a  un aagen..*/./*.
1b170 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63  ** Code for proc
1b180 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e  essing tables in
1b190 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
1b1a0 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
1b1b0 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 72  .PRIVATE int str
1b1c0 68 61 73 68 28 78 29 0a 63 68 61 72 20 2a 78 3b  hash(x).char *x;
1b1d0 0a 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a  .{.  int h = 0;.
1b1e0 20 20 77 68 69 6c 65 28 20 2a 78 29 20 68 20 3d    while( *x) h =
1b1f0 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a   h*13 + *(x++);.
1b200 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
1b210 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72  * Works like str
1b220 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53  dup, sort of.  S
1b230 61 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20  ave a string in 
1b240 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c  malloced memory,
1b250 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72   but.** keep str
1b260 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20  ings in a table 
1b270 73 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  so that the same
1b280 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69   string is not i
1b290 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f  n more.** than o
1b2a0 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 68 61  ne place..*/.cha
1b2b0 72 20 2a 53 74 72 73 61 66 65 28 79 29 0a 63 68  r *Strsafe(y).ch
1b2c0 61 72 20 2a 79 3b 0a 7b 0a 20 20 63 68 61 72 20  ar *y;.{.  char 
1b2d0 2a 7a 3b 0a 0a 20 20 7a 20 3d 20 53 74 72 73 61  *z;..  z = Strsa
1b2e0 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69 66  fe_find(y);.  if
1b2f0 28 20 7a 3d 3d 30 20 26 26 20 28 7a 3d 6d 61 6c  ( z==0 && (z=mal
1b300 6c 6f 63 28 20 73 74 72 6c 65 6e 28 79 29 2b 31  loc( strlen(y)+1
1b310 20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   ))!=0 ){.    st
1b320 72 63 70 79 28 7a 2c 79 29 3b 0a 20 20 20 20 53  rcpy(z,y);.    S
1b330 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29  trsafe_insert(z)
1b340 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68  ;.  }.  MemoryCh
1b350 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  eck(z);.  return
1b360 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20   z;.}../* There 
1b370 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
1b380 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1b390 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
1b3a0 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
1b3b0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
1b3c0 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x1"..*/.struct
1b3d0 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69   s_x1 {.  int si
1b3e0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1b3f0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1b400 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
1b410 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b430 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
1b440 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
1b450 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
1b480 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
1b490 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
1b4a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b4b0 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
1b4c0 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
1b4d0 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74  ruct s_x1node *t
1b4e0 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
1b4f0 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
1b500 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64    struct s_x1nod
1b510 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
1b520 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
1b530 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
1b540 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1b550 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
1b560 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
1b570 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
1b580 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
1b590 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
1b5a0 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x1"..*/.typedef 
1b5b0 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
1b5c0 7b 0a 20 20 63 68 61 72 20 2a 64 61 74 61 3b 20  {.  char *data; 
1b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5e0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
1b5f0 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64    struct s_x1nod
1b600 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
1b610 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
1b620 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
1b630 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1b640 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
1b650 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
1b660 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x1node;../* Ther
1b670 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
1b680 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
1b690 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
1b6a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
1b6b0 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
1b6c0 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  1 *x1a;../* Allo
1b6d0 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
1b6e0 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
1b6f0 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69  void Strsafe_ini
1b700 74 28 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29  t(){.  if( x1a )
1b710 20 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d   return;.  x1a =
1b720 20 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d   (struct s_x1*)m
1b730 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
1b740 72 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20  ruct s_x1) );.  
1b750 69 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78  if( x1a ){.    x
1b760 31 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b  1a->size = 1024;
1b770 0a 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20  .    x1a->count 
1b780 3d 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62  = 0;.    x1a->tb
1b790 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c  l = (x1node*)mal
1b7a0 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a  loc( .      (siz
1b7b0 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69  eof(x1node) + si
1b7c0 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 31  zeof(x1node*))*1
1b7d0 30 32 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78  024 );.    if( x
1b7e0 31 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20  1a->tbl==0 ){.  
1b7f0 20 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20      free(x1a);. 
1b800 20 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20       x1a = 0;.  
1b810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1b820 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d  nt i;.      x1a-
1b830 3e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29  >ht = (x1node**)
1b840 26 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d  &(x1a->tbl[1024]
1b850 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
1b860 3b 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78  ; i<1024; i++) x
1b870 31 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  1a->ht[i] = 0;. 
1b880 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
1b890 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
1b8a0 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
1b8b0 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1b8c0 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
1b8d0 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
1b8e0 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
1b8f0 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
1b900 20 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f   */.int Strsafe_
1b910 69 6e 73 65 72 74 28 64 61 74 61 29 0a 63 68 61  insert(data).cha
1b920 72 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78 31 6e  r *data;.{.  x1n
1b930 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68  ode *np;.  int h
1b940 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69  ;.  int ph;..  i
1b950 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75  f( x1a==0 ) retu
1b960 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72  rn 0;.  ph = str
1b970 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20  hash(data);.  h 
1b980 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a  = ph & (x1a->siz
1b990 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61  e-1);.  np = x1a
1b9a0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
1b9b0 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
1b9c0 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  strcmp(np->data,
1b9d0 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20  data)==0 ){.    
1b9e0 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
1b9f0 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
1ba00 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
1ba10 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
1ba20 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
1ba30 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
1ba40 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
1ba50 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1ba60 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
1ba70 0a 20 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e  .  }.  if( x1a->
1ba80 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65  count>=x1a->size
1ba90 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
1baa0 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
1bab0 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
1bac0 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  .    int i,size;
1bad0 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 31  .    struct s_x1
1bae0 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
1baf0 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20  y.size = size = 
1bb00 78 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x1a->size*2;.   
1bb10 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
1bb20 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  1a->count;.    a
1bb30 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f  rray.tbl = (x1no
1bb40 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20  de*)malloc(.    
1bb50 20 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65    (sizeof(x1node
1bb60 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64  ) + sizeof(x1nod
1bb70 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20  e*))*size );.   
1bb80 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
1bb90 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
1bba0 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
1bbb0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
1bbc0 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
1bbd0 78 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x1node**)&(array
1bbe0 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20  .tbl[size]);.   
1bbf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1bc00 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
1bc10 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
1bc20 69 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e  i=0; i<x1a->coun
1bc30 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
1bc40 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  1node *oldnp, *n
1bc50 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
1bc60 70 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69  p = &(x1a->tbl[i
1bc70 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74  ]);.      h = st
1bc80 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74  rhash(oldnp->dat
1bc90 61 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20  a) & (size-1);. 
1bca0 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
1bcb0 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
1bcc0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
1bcd0 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
1bce0 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
1bcf0 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
1bd00 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
1bd10 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
1bd20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f   newnp->data = o
1bd30 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20  ldnp->data;.    
1bd40 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20    newnp->from = 
1bd50 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a  &(array.ht[h]);.
1bd60 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68        array.ht[h
1bd70 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d  ] = newnp;.    }
1bd80 0a 20 20 20 20 66 72 65 65 28 78 31 61 2d 3e 74  .    free(x1a->t
1bd90 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20  bl);.    *x1a = 
1bda0 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20  array;.  }.  /* 
1bdb0 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
1bdc0 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20  ata */.  h = ph 
1bdd0 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x1a->size-1);
1bde0 0a 20 20 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74  .  np = &(x1a->t
1bdf0 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d  bl[x1a->count++]
1be00 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  );.  np->data = 
1be10 64 61 74 61 3b 0a 20 20 69 66 28 20 78 31 61 2d  data;.  if( x1a-
1be20 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74  >ht[h] ) x1a->ht
1be30 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
1be40 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
1be50 65 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d  ext = x1a->ht[h]
1be60 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x1a->ht[h] =
1be70 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
1be80 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x1a->ht[h]);
1be90 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1bea0 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
1beb0 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
1bec0 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
1bed0 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
1bee0 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
1bef0 68 20 6b 65 79 2e 20 2a 2f 0a 63 68 61 72 20 2a  h key. */.char *
1bf00 53 74 72 73 61 66 65 5f 66 69 6e 64 28 6b 65 79  Strsafe_find(key
1bf10 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20  ).char *key;.{. 
1bf20 20 69 6e 74 20 68 3b 0a 20 20 78 31 6e 6f 64 65   int h;.  x1node
1bf30 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61   *np;..  if( x1a
1bf40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1bf50 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65    h = strhash(ke
1bf60 79 29 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d  y) & (x1a->size-
1bf70 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e  1);.  np = x1a->
1bf80 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
1bf90 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
1bfa0 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65  rcmp(np->data,ke
1bfb0 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  y)==0 ) break;. 
1bfc0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
1bfd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
1bfe0 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30  p ? np->data : 0
1bff0 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
1c000 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1c010 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e  (terminal or non
1c020 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c  terminal) symbol
1c030 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20   "x"..** Create 
1c040 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20  a new symbol if 
1c050 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1c060 74 20 74 69 6d 65 20 22 78 22 20 68 61 73 20 62  t time "x" has b
1c070 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72  een seen..*/.str
1c080 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
1c090 6f 6c 5f 6e 65 77 28 78 29 0a 63 68 61 72 20 2a  ol_new(x).char *
1c0a0 78 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  x;.{.  struct sy
1c0b0 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20  mbol *sp;..  sp 
1c0c0 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29  = Symbol_find(x)
1c0d0 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b  ;.  if( sp==0 ){
1c0e0 0a 20 20 20 20 73 70 20 3d 20 28 73 74 72 75 63  .    sp = (struc
1c0f0 74 20 73 79 6d 62 6f 6c 20 2a 29 6d 61 6c 6c 6f  t symbol *)mallo
1c100 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
1c110 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20 20   symbol) );.    
1c120 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 70 29 3b  MemoryCheck(sp);
1c130 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d 20  .    sp->name = 
1c140 53 74 72 73 61 66 65 28 78 29 3b 0a 20 20 20 20  Strsafe(x);.    
1c150 73 70 2d 3e 74 79 70 65 20 3d 20 69 73 75 70 70  sp->type = isupp
1c160 65 72 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e 41  er(*x) ? TERMINA
1c170 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b  L : NONTERMINAL;
1c180 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d 20  .    sp->rule = 
1c190 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62  0;.    sp->fallb
1c1a0 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  ack = 0;.    sp-
1c1b0 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20  >prec = -1;.    
1c1c0 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b  sp->assoc = UNK;
1c1d0 0a 20 20 20 20 73 70 2d 3e 66 69 72 73 74 73 65  .    sp->firstse
1c1e0 74 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c  t = 0;.    sp->l
1c1f0 61 6d 62 64 61 20 3d 20 42 5f 46 41 4c 53 45 3b  ambda = B_FALSE;
1c200 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 72 75 63  .    sp->destruc
1c210 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  tor = 0;.    sp-
1c220 3e 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20  >datatype = 0;. 
1c230 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74     Symbol_insert
1c240 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  (sp,sp->name);. 
1c250 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 70 3b 0a   }.  return sp;.
1c260 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77  }../* Compare tw
1c270 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 69 6e 74  o symbols */.int
1c280 20 53 79 6d 62 6f 6c 63 6d 70 70 28 61 2c 62 29   Symbolcmpp(a,b)
1c290 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
1c2a0 2a 61 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  *a;.struct symbo
1c2b0 6c 20 2a 2a 62 3b 0a 7b 0a 20 20 72 65 74 75 72  l **b;.{.  retur
1c2c0 6e 20 73 74 72 63 6d 70 28 28 2a 2a 61 29 2e 6e  n strcmp((**a).n
1c2d0 61 6d 65 2c 28 2a 2a 62 29 2e 6e 61 6d 65 29 3b  ame,(**b).name);
1c2e0 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  .}../* There is 
1c2f0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
1c300 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
1c310 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
1c320 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20  .** associative 
1c330 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
1c340 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  2"..*/.struct s_
1c350 78 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b  x2 {.  int size;
1c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c370 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
1c380 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e  available slots.
1c390 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c3b0 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77     Must be a pow
1c3c0 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
1c3d0 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20  than or */.     
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3f0 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20       /*   equal 
1c400 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  to 1 */.  int co
1c410 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  unt;            
1c420 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1c430 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66  urrently slots f
1c440 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  illed */.  struc
1c450 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b  t s_x2node *tbl;
1c460 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74    /* The data st
1c470 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73  ored here */.  s
1c480 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a  truct s_x2node *
1c490 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61  *ht;  /* Hash ta
1c4a0 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20  ble for lookups 
1c4b0 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  */.};../* There 
1c4c0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
1c4d0 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
1c4e0 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  e for every data
1c4f0 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61   element.** in a
1c500 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  n associative ar
1c510 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22  ray of type "x2"
1c520 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1c530 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20  uct s_x2node {. 
1c540 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1c550 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  data;           
1c560 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1c570 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6b 65  ta */.  char *ke
1c580 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1c590 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
1c5a0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32  */.  struct s_x2
1c5b0 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
1c5c0 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
1c5d0 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
1c5e0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
1c5f0 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
1c600 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
1c610 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x2node;../* T
1c620 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
1c630 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1c640 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
1c650 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
1c660 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
1c670 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41  s_x2 *x2a;../* A
1c680 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
1c690 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1c6a0 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69  */.void Symbol_i
1c6b0 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 32 61  nit(){.  if( x2a
1c6c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61   ) return;.  x2a
1c6d0 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a   = (struct s_x2*
1c6e0 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
1c6f0 73 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a  struct s_x2) );.
1c700 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20    if( x2a ){.   
1c710 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38   x2a->size = 128
1c720 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74  ;.    x2a->count
1c730 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74   = 0;.    x2a->t
1c740 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61  bl = (x2node*)ma
1c750 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69  lloc( .      (si
1c760 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73  zeof(x2node) + s
1c770 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a  izeof(x2node*))*
1c780 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78  128 );.    if( x
1c790 32 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20  2a->tbl==0 ){.  
1c7a0 20 20 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20      free(x2a);. 
1c7b0 20 20 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20       x2a = 0;.  
1c7c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1c7d0 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d  nt i;.      x2a-
1c7e0 3e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29  >ht = (x2node**)
1c7f0 26 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29  &(x2a->tbl[128])
1c800 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1c810 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61   i<128; i++) x2a
1c820 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
1c830 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
1c840 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
1c850 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
1c860 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1c870 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
1c880 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
1c890 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
1c8a0 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
1c8b0 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73  /.int Symbol_ins
1c8c0 65 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74  ert(data,key).st
1c8d0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74  ruct symbol *dat
1c8e0 61 3b 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a  a;.char *key;.{.
1c8f0 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x2node *np;.  
1c900 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b  int h;.  int ph;
1c910 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ..  if( x2a==0 )
1c920 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20   return 0;.  ph 
1c930 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a  = strhash(key);.
1c940 20 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d    h = ph & (x2a-
1c950 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
1c960 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x2a->ht[h];.  w
1c970 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
1c980 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b  if( strcmp(np->k
1c990 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  ey,key)==0 ){.  
1c9a0 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
1c9b0 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
1c9c0 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
1c9d0 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
1c9e0 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
1c9f0 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
1ca00 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
1ca10 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1ca20 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
1ca30 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61  t;.  }.  if( x2a
1ca40 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69  ->count>=x2a->si
1ca50 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
1ca60 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
1ca70 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
1ca80 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a  */.    int i,siz
1ca90 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f  e;.    struct s_
1caa0 78 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72  x2 array;.    ar
1cab0 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20  ray.size = size 
1cac0 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x2a->size*2;. 
1cad0 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
1cae0 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x2a->count;.   
1caf0 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32   array.tbl = (x2
1cb00 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20  node*)malloc(.  
1cb10 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f      (sizeof(x2no
1cb20 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e  de) + sizeof(x2n
1cb30 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20  ode*))*size );. 
1cb40 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
1cb50 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1cb60 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
1cb70 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
1cb80 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
1cb90 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x2node**)&(arr
1cba0 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20  ay.tbl[size]);. 
1cbb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
1cbc0 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68  ze; i++) array.h
1cbd0 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t[i] = 0;.    fo
1cbe0 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f  r(i=0; i<x2a->co
1cbf0 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unt; i++){.     
1cc00 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20   x2node *oldnp, 
1cc10 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c  *newnp;.      ol
1cc20 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c  dnp = &(x2a->tbl
1cc30 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  [i]);.      h = 
1cc40 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b  strhash(oldnp->k
1cc50 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a  ey) & (size-1);.
1cc60 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28        newnp = &(
1cc70 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20  array.tbl[i]);. 
1cc80 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68       if( array.h
1cc90 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b  t[h] ) array.ht[
1cca0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77  h]->from = &(new
1ccb0 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20  np->next);.     
1ccc0 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61   newnp->next = a
1ccd0 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20  rray.ht[h];.    
1cce0 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f    newnp->key = o
1ccf0 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20  ldnp->key;.     
1cd00 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f   newnp->data = o
1cd10 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20  ldnp->data;.    
1cd20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20    newnp->from = 
1cd30 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a  &(array.ht[h]);.
1cd40 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68        array.ht[h
1cd50 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d  ] = newnp;.    }
1cd60 0a 20 20 20 20 66 72 65 65 28 78 32 61 2d 3e 74  .    free(x2a->t
1cd70 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20  bl);.    *x2a = 
1cd80 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20  array;.  }.  /* 
1cd90 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
1cda0 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20  ata */.  h = ph 
1cdb0 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x2a->size-1);
1cdc0 0a 20 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74  .  np = &(x2a->t
1cdd0 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d  bl[x2a->count++]
1cde0 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b  );.  np->key = k
1cdf0 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d  ey;.  np->data =
1ce00 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61   data;.  if( x2a
1ce10 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68  ->ht[h] ) x2a->h
1ce20 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
1ce30 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e  p->next);.  np->
1ce40 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68  next = x2a->ht[h
1ce50 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20  ];.  x2a->ht[h] 
1ce60 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d  = np;.  np->from
1ce70 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29   = &(x2a->ht[h])
1ce80 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
1ce90 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
1cea0 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73  nter to data ass
1ceb0 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76  igned to the giv
1cec0 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20  en key.  Return 
1ced0 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75  NULL.** if no su
1cee0 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63  ch key. */.struc
1cef0 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
1cf00 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68 61 72 20  _find(key).char 
1cf10 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b  *key;.{.  int h;
1cf20 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x2node *np;..
1cf30 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72    if( x2a==0 ) r
1cf40 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73  eturn 0;.  h = s
1cf50 74 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78  trhash(key) & (x
1cf60 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  2a->size-1);.  n
1cf70 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x2a->ht[h];.
1cf80 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
1cf90 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
1cfa0 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20  ->key,key)==0 ) 
1cfb0 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
1cfc0 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
1cfd0 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
1cfe0 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
1cff0 52 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20  Return the n-th 
1d000 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55  data.  Return NU
1d010 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f  LL if n is out o
1d020 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75  f range. */.stru
1d030 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
1d040 6c 5f 4e 74 68 28 6e 29 0a 69 6e 74 20 6e 3b 0a  l_Nth(n).int n;.
1d050 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
1d060 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78  l *data;.  if( x
1d070 32 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d  2a && n>0 && n<=
1d080 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20  x2a->count ){.  
1d090 20 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62    data = x2a->tb
1d0a0 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d  l[n-1].data;.  }
1d0b0 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d  else{.    data =
1d0c0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1d0d0 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74   data;.}../* Ret
1d0e0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
1d0f0 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74  the array */.int
1d100 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a   Symbol_count().
1d110 7b 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f  {.  return x2a ?
1d120 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b   x2a->count : 0;
1d130 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e  .}../* Return an
1d140 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
1d150 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69  rs to all data i
1d160 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
1d170 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  The array is obt
1d180 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
1d190 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  c.  Return NULL 
1d1a0 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  if memory alloca
1d1b0 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73  tion.** problems
1d1c0 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61  , or if the arra
1d1d0 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73  y is empty. */.s
1d1e0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53  truct symbol **S
1d1f0 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a  ymbol_arrayof().
1d200 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
1d210 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74  l **array;.  int
1d220 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78   i,size;.  if( x
1d230 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  2a==0 ) return 0
1d240 3b 0a 20 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e  ;.  size = x2a->
1d250 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d  count;.  array =
1d260 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
1d270 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  **)malloc( sizeo
1d280 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  f(struct symbol 
1d290 2a 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66 28  *)*size );.  if(
1d2a0 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f   array ){.    fo
1d2b0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
1d2c0 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78  ++) array[i] = x
1d2d0 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b  2a->tbl[i].data;
1d2e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72  .  }.  return ar
1d2f0 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61  ray;.}../* Compa
1d300 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61  re two configura
1d310 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e  tions */.int Con
1d320 66 69 67 63 6d 70 28 61 2c 62 29 0a 73 74 72 75  figcmp(a,b).stru
1d330 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74  ct config *a;.st
1d340 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a  ruct config *b;.
1d350 7b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d  {.  int x;.  x =
1d360 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20   a->rp->index - 
1d370 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  b->rp->index;.  
1d380 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61  if( x==0 ) x = a
1d390 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a  ->dot - b->dot;.
1d3a0 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f    return x;.}../
1d3b0 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  * Compare two st
1d3c0 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20  ates */.PRIVATE 
1d3d0 69 6e 74 20 73 74 61 74 65 63 6d 70 28 61 2c 62  int statecmp(a,b
1d3e0 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
1d3f0 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  *a;.struct confi
1d400 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 72 63  g *b;.{.  int rc
1d410 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63  ;.  for(rc=0; rc
1d420 3d 3d 30 20 26 26 20 61 20 26 26 20 62 3b 20 20  ==0 && a && b;  
1d430 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70  a=a->bp, b=b->bp
1d440 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72  ){.    rc = a->r
1d450 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70  p->index - b->rp
1d460 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  ->index;.    if(
1d470 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d   rc==0 ) rc = a-
1d480 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20  >dot - b->dot;. 
1d490 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29   }.  if( rc==0 )
1d4a0 7b 0a 20 20 20 20 69 66 28 20 61 20 29 20 72 63  {.    if( a ) rc
1d4b0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20   = 1;.    if( b 
1d4c0 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  ) rc = -1;.  }. 
1d4d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d4e0 2a 20 48 61 73 68 20 61 20 73 74 61 74 65 20 2a  * Hash a state *
1d4f0 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74  /.PRIVATE int st
1d500 61 74 65 68 61 73 68 28 61 29 0a 73 74 72 75 63  atehash(a).struc
1d510 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20  t config *a;.{. 
1d520 20 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68 69 6c   int h=0;.  whil
1d530 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20  e( a ){.    h = 
1d540 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69  h*571 + a->rp->i
1d550 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74  ndex*37 + a->dot
1d560 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b  ;.    a = a->bp;
1d570 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b  .  }.  return h;
1d580 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  .}../* Allocate 
1d590 61 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75  a new state stru
1d5a0 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20  cture */.struct 
1d5b0 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77  state *State_new
1d5c0 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74  ().{.  struct st
1d5d0 61 74 65 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20  ate *new;.  new 
1d5e0 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20  = (struct state 
1d5f0 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
1d600 28 73 74 72 75 63 74 20 73 74 61 74 65 29 20 29  (struct state) )
1d610 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ;.  MemoryCheck(
1d620 6e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  new);.  return n
1d630 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  ew;.}../* There 
1d640 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
1d650 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1d660 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
1d670 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
1d680 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
1d690 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x3"..*/.struct
1d6a0 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69   s_x3 {.  int si
1d6b0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1d6c0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1d6d0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
1d6e0 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d700 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
1d710 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
1d720 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
1d750 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
1d760 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
1d770 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d780 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
1d790 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
1d7a0 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74  ruct s_x3node *t
1d7b0 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
1d7c0 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
1d7d0 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
1d7e0 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
1d7f0 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
1d800 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
1d810 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1d820 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
1d830 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
1d840 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
1d850 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
1d860 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
1d870 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x3"..*/.typedef 
1d880 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
1d890 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
1d8a0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
1d8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d8c0 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74  data */.  struct
1d8d0 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20   config *key;   
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
1d900 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
1d910 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
1d920 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
1d930 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
1d940 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
1d950 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
1d960 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33  ous link */.} x3
1d970 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
1d980 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
1d990 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
1d9a0 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
1d9b0 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
1d9c0 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 33 20  tic struct s_x3 
1d9d0 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x3a;../* Alloca
1d9e0 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
1d9f0 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
1da00 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b  id State_init(){
1da10 0a 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74  .  if( x3a ) ret
1da20 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74  urn;.  x3a = (st
1da30 72 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f  ruct s_x3*)mallo
1da40 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
1da50 20 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20   s_x3) );.  if( 
1da60 78 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e  x3a ){.    x3a->
1da70 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20  size = 128;.    
1da80 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x3a->count = 0;.
1da90 20 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28      x3a->tbl = (
1daa0 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20  x3node*)malloc( 
1dab0 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
1dac0 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  3node) + sizeof(
1dad0 78 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b  x3node*))*128 );
1dae0 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62  .    if( x3a->tb
1daf0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
1db00 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78  ee(x3a);.      x
1db10 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  3a = 0;.    }els
1db20 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
1db30 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20        x3a->ht = 
1db40 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d  (x3node**)&(x3a-
1db50 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20  >tbl[128]);.    
1db60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38    for(i=0; i<128
1db70 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69  ; i++) x3a->ht[i
1db80 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
1db90 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e  .}./* Insert a n
1dba0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
1dbb0 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  he array.  Retur
1dbc0 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73  n TRUE if succes
1dbd0 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64  sful..** Prior d
1dbe0 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d  ata with the sam
1dbf0 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65  e key is NOT ove
1dc00 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20  rwritten */.int 
1dc10 53 74 61 74 65 5f 69 6e 73 65 72 74 28 64 61 74  State_insert(dat
1dc20 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20 73 74  a,key).struct st
1dc30 61 74 65 20 2a 64 61 74 61 3b 0a 73 74 72 75 63  ate *data;.struc
1dc40 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b  t config *key;.{
1dc50 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x3node *np;. 
1dc60 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68   int h;.  int ph
1dc70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  ;..  if( x3a==0 
1dc80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
1dc90 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79   = statehash(key
1dca0 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
1dcb0 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
1dcc0 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x3a->ht[h];.
1dcd0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
1dce0 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28     if( statecmp(
1dcf0 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
1dd00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
1dd10 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
1dd20 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
1dd30 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
1dd40 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
1dd50 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
1dd60 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
1dd70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1dd80 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
1dd90 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
1dda0 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33  ( x3a->count>=x3
1ddb0 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
1ddc0 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
1ddd0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
1dde0 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
1ddf0 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  i,size;.    stru
1de00 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20  ct s_x3 array;. 
1de10 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
1de20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a 65  size = x3a->size
1de30 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
1de40 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74  unt = x3a->count
1de50 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
1de60 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f  = (x3node*)mallo
1de70 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  c(.      (sizeof
1de80 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x3node) + sizeo
1de90 66 28 78 33 6e 6f 64 65 2a 29 29 2a 73 69 7a 65  f(x3node*))*size
1dea0 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61   );.    if( arra
1deb0 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
1dec0 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
1ded0 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
1dee0 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
1def0 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29  .ht = (x3node**)
1df00 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65  &(array.tbl[size
1df10 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
1df20 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
1df30 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
1df40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 33     for(i=0; i<x3
1df50 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
1df60 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f 6c        x3node *ol
1df70 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
1df80 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33 61     oldnp = &(x3a
1df90 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
1dfa0 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6f   h = statehash(o
1dfb0 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69  ldnp->key) & (si
1dfc0 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
1dfd0 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
1dfe0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
1dff0 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
1e000 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
1e010 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
1e020 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
1e030 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
1e040 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
1e050 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79  key = oldnp->key
1e060 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
1e070 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
1e080 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
1e090 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
1e0a0 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
1e0b0 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
1e0c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
1e0d0 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x3a->tbl);.    
1e0e0 2a 78 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x3a = array;.  
1e0f0 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
1e100 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
1e110 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73  h = ph & (x3a->s
1e120 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
1e130 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63  (x3a->tbl[x3a->c
1e140 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
1e150 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d  key = key;.  np-
1e160 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
1e170 69 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29  if( x3a->ht[h] )
1e180 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x3a->ht[h]->fro
1e190 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
1e1a0 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33  .  np->next = x3
1e1b0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d  a->ht[h];.  x3a-
1e1c0 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
1e1d0 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d  p->from = &(x3a-
1e1e0 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
1e1f0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
1e200 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
1e210 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
1e220 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
1e230 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
1e240 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
1e250 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  /.struct state *
1e260 53 74 61 74 65 5f 66 69 6e 64 28 6b 65 79 29 0a  State_find(key).
1e270 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
1e280 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey;.{.  int h;. 
1e290 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x3node *np;..  
1e2a0 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
1e2b0 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61  urn 0;.  h = sta
1e2c0 74 65 68 61 73 68 28 6b 65 79 29 20 26 20 28 78  tehash(key) & (x
1e2d0 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
1e2e0 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x3a->ht[h];.
1e2f0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
1e300 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28     if( statecmp(
1e310 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
1e320 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20  ) break;.    np 
1e330 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
1e340 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70    return np ? np
1e350 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->data : 0;.}../
1e360 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61  * Return an arra
1e370 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
1e380 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65   all data in the
1e390 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61   table..** The a
1e3a0 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
1e3b0 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52   from malloc.  R
1e3c0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65  eturn NULL if me
1e3d0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
1e3e0 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20  ** problems, or 
1e3f0 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  if the array is 
1e400 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74  empty. */.struct
1e410 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61   state **State_a
1e420 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
1e430 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61  uct state **arra
1e440 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  y;.  int i,size;
1e450 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
1e460 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65  return 0;.  size
1e470 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x3a->count;. 
1e480 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74   array = (struct
1e490 20 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63   state **)malloc
1e4a0 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
1e4b0 73 74 61 74 65 20 2a 29 2a 73 69 7a 65 20 29 3b  state *)*size );
1e4c0 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
1e4d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1e4e0 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b  ize; i++) array[
1e4f0 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d  i] = x3a->tbl[i]
1e500 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74  .data;.  }.  ret
1e510 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  urn array;.}../*
1e520 20 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72   Hash a configur
1e530 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45  ation */.PRIVATE
1e540 20 69 6e 74 20 63 6f 6e 66 69 67 68 61 73 68 28   int confighash(
1e550 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a).struct config
1e560 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30   *a;.{.  int h=0
1e570 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20  ;.  h = h*571 + 
1e580 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20  a->rp->index*37 
1e590 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75  + a->dot;.  retu
1e5a0 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  rn h;.}../* Ther
1e5b0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1e5c0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1e5d0 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
1e5e0 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
1e5f0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
1e600 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x4"..*/.stru
1e610 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20  ct s_x4 {.  int 
1e620 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
1e630 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
1e640 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
1e650 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
1e680 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
1e690 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
1e6c0 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
1e6d0 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
1e6e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e6f0 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
1e700 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
1e710 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
1e720 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
1e730 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
1e740 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
1e750 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
1e760 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
1e770 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
1e780 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
1e790 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
1e7a0 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
1e7b0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
1e7c0 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
1e7d0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
1e7e0 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x4"..*/.typede
1e7f0 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64  f struct s_x4nod
1e800 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  e {.  struct con
1e810 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20 20 20  fig *data;      
1e820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e830 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72  he data */.  str
1e840 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65  uct s_x4node *ne
1e850 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
1e860 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
1e870 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
1e880 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72  ct s_x4node **fr
1e890 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
1e8a0 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64   link */.} x4nod
1e8b0 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
1e8c0 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
1e8d0 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
1e8e0 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
1e8f0 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
1e900 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a 78 34   struct s_x4 *x4
1e910 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
1e920 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
1e930 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
1e940 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74  Configtable_init
1e950 28 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20  (){.  if( x4a ) 
1e960 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20  return;.  x4a = 
1e970 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61  (struct s_x4*)ma
1e980 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
1e990 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69  uct s_x4) );.  i
1e9a0 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34  f( x4a ){.    x4
1e9b0 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20  a->size = 64;.  
1e9c0 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x4a->count = 0
1e9d0 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d  ;.    x4a->tbl =
1e9e0 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x4node*)malloc
1e9f0 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  ( .      (sizeof
1ea00 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x4node) + sizeo
1ea10 66 28 78 34 6e 6f 64 65 2a 29 29 2a 36 34 20 29  f(x4node*))*64 )
1ea20 3b 0a 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74  ;.    if( x4a->t
1ea30 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
1ea40 72 65 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20  ree(x4a);.      
1ea50 78 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x4a = 0;.    }el
1ea60 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1ea70 0a 20 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d  .      x4a->ht =
1ea80 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61   (x4node**)&(x4a
1ea90 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20  ->tbl[64]);.    
1eaa0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b    for(i=0; i<64;
1eab0 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d   i++) x4a->ht[i]
1eac0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1ead0 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
1eae0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
1eaf0 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
1eb00 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
1eb10 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
1eb20 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
1eb30 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
1eb40 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43  written */.int C
1eb50 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72  onfigtable_inser
1eb60 74 28 64 61 74 61 29 0a 73 74 72 75 63 74 20 63  t(data).struct c
1eb70 6f 6e 66 69 67 20 2a 64 61 74 61 3b 0a 7b 0a 20  onfig *data;.{. 
1eb80 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x4node *np;.  i
1eb90 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
1eba0 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20  .  if( x4a==0 ) 
1ebb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
1ebc0 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61   confighash(data
1ebd0 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
1ebe0 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
1ebf0 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x4a->ht[h];.
1ec00 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
1ec10 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70     if( Configcmp
1ec20 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d  (np->data,data)=
1ec30 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
1ec40 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
1ec50 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
1ec60 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
1ec70 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
1ec80 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
1ec90 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
1eca0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
1ecb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
1ecc0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
1ecd0 20 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e   if( x4a->count>
1ece0 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x4a->size ){.  
1ecf0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
1ed00 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
1ed10 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
1ed20 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73  nt i,size;.    s
1ed30 74 72 75 63 74 20 73 5f 78 34 20 61 72 72 61 79  truct s_x4 array
1ed40 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
1ed50 20 3d 20 73 69 7a 65 20 3d 20 78 34 61 2d 3e 73   = size = x4a->s
1ed60 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
1ed70 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f  .count = x4a->co
1ed80 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.t
1ed90 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61  bl = (x4node*)ma
1eda0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a  lloc(.      (siz
1edb0 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69  eof(x4node) + si
1edc0 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 73  zeof(x4node*))*s
1edd0 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61  ize );.    if( a
1ede0 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
1edf0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
1ee00 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
1ee10 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
1ee20 72 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65  ray.ht = (x4node
1ee30 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73  **)&(array.tbl[s
1ee40 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
1ee50 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
1ee60 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
1ee70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1ee80 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x4a->count; i++
1ee90 29 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20  ){.      x4node 
1eea0 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
1eeb0 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
1eec0 78 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x4a->tbl[i]);.  
1eed0 20 20 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61      h = configha
1eee0 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20  sh(oldnp->data) 
1eef0 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20  & (size-1);.    
1ef00 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61    newnp = &(arra
1ef10 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  y.tbl[i]);.     
1ef20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d   if( array.ht[h]
1ef30 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e   ) array.ht[h]->
1ef40 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e  from = &(newnp->
1ef50 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77  next);.      new
1ef60 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79  np->next = array
1ef70 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65  .ht[h];.      ne
1ef80 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
1ef90 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
1efa0 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
1efb0 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
1efc0 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
1efd0 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
1efe0 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62 6c 29    free(x4a->tbl)
1eff0 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61 72 72  ;.    *x4a = arr
1f000 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
1f010 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
1f020 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
1f030 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x4a->size-1);.  
1f040 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b  np = &(x4a->tbl[
1f050 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x4a->count++]);.
1f060 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74    np->data = dat
1f070 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e 68 74  a;.  if( x4a->ht
1f080 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d  [h] ) x4a->ht[h]
1f090 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e  ->from = &(np->n
1f0a0 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74  ext);.  np->next
1f0b0 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
1f0c0 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70   x4a->ht[h] = np
1f0d0 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26  ;.  np->from = &
1f0e0 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20  (x4a->ht[h]);.  
1f0f0 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
1f100 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1f110 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65   to data assigne
1f120 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b  d to the given k
1f130 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ey.  Return NULL
1f140 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b  .** if no such k
1f150 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ey. */.struct co
1f160 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c  nfig *Configtabl
1f170 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74 72 75  e_find(key).stru
1f180 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a  ct config *key;.
1f190 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e  {.  int h;.  x4n
1f1a0 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
1f1b0 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x4a==0 ) return 
1f1c0 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67 68  0;.  h = configh
1f1d0 61 73 68 28 6b 65 79 29 20 26 20 28 78 34 61 2d  ash(key) & (x4a-
1f1e0 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
1f1f0 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x4a->ht[h];.  w
1f200 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
1f210 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 6e 70  if( Configcmp(np
1f220 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29  ->data,key)==0 )
1f230 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
1f240 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
1f250 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
1f260 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
1f270 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
1f280 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e   from the table.
1f290 20 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61    Pass each data
1f2a0 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
1f2b0 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73   "f".** as it is
1f2c0 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20   removed.  ("f" 
1f2d0 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61  may be null to a
1f2e0 76 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29  void this step.)
1f2f0 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74   */.void Configt
1f300 61 62 6c 65 5f 63 6c 65 61 72 28 66 29 0a 69 6e  able_clear(f).in
1f310 74 28 2a 66 29 28 2f 2a 20 73 74 72 75 63 74 20  t(*f)(/* struct 
1f320 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 7b 0a  config * */);.{.
1f330 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 78    int i;.  if( x
1f340 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f  4a==0 || x4a->co
1f350 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  unt==0 ) return;
1f360 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72 28 69  .  if( f ) for(i
1f370 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74  =0; i<x4a->count
1f380 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d  ; i++) (*f)(x4a-
1f390 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20  >tbl[i].data);. 
1f3a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d   for(i=0; i<x4a-
1f3b0 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d  >size; i++) x4a-
1f3c0 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34  >ht[i] = 0;.  x4
1f3d0 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
1f3e0 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.